黃世泉,金晅宏
(上海理工大學 光電信息與計算機工程學院,上海200093)
基于LabVIEW的生產(chǎn)者/消費者模式研究
黃世泉,金晅宏
(上海理工大學 光電信息與計算機工程學院,上海200093)
在數(shù)據(jù)采集程序設計過程中發(fā)現(xiàn),程序設計模式對數(shù)據(jù)采集和處理的效率有較大影響。因此,文中引入了LabVIEW生產(chǎn)者/消費者模式,并應用于多任務型音頻信號采集系統(tǒng)程序的設計中。該設計將音頻參數(shù)設置和數(shù)據(jù)采集處理分配給兩個并行循環(huán)來完成,在生產(chǎn)者循環(huán)中完成音頻信號參數(shù)的設置,在消費者循環(huán)中完成數(shù)據(jù)的采集與處理。實驗表明,該模式大幅提高了數(shù)據(jù)采集與處理的效率,也提高了程序的可讀性、擴展性、維護性和復用性。
LabVIEW;消費者/生產(chǎn)者;數(shù)據(jù)采集;隊列
LabVIEW是美國National Instruments(NI)公司推出的一個圖形化軟件開發(fā)環(huán)境,是業(yè)界最優(yōu)秀的虛擬儀器軟件開發(fā)平臺[1]。LabVIEW功能強大、靈活方便。與傳統(tǒng)的其他編程語言有諸多相似之處,如相似的數(shù)據(jù)類型、數(shù)據(jù)流控制結(jié)構(gòu)、程序調(diào)試工具等[2]。但兩者顯著區(qū)別的是:其他計算機語言都是采用基于文本的語言產(chǎn)生代碼,而LabVIEW使用圖形化編輯語言編寫程序,產(chǎn)生的程序是框圖的形式,具有簡單直觀、易于理解和開發(fā)效率高等特點。
生產(chǎn)者/消費者設計模式是NI公司最新推出的一種程序設計概念,它從主/從設計模式發(fā)展而來,它將生產(chǎn)和消費數(shù)據(jù)速度不同的任務分開處理,大幅提高了不同速率的多個循環(huán)之間數(shù)據(jù)共享的能力,解決了程序循環(huán)周期長、執(zhí)行效率低等問題,且具有系統(tǒng)響應快、執(zhí)行效率高等優(yōu)點。尤其是對于多任務處理和實時性、連續(xù)性要求嚴格的程序設計,生產(chǎn)者/消費者設計模式更是不錯的選擇。因此,研究基于LabVIEW的生產(chǎn)者/消費者設計模式并將這種模式應用于數(shù)據(jù)采集與處理程序的設計中就顯得很有意義。
1.1 概念
生產(chǎn)者/消費者設計模式是多線程編程中最基本的設計模式,是事件處理器和隊列消息處理器相結(jié)合而構(gòu)成的復合設計模式[3]。該設計模式包括一個生產(chǎn)者循環(huán)、一個或多個消費者循環(huán),各個循環(huán)以不同的速率并行運行。生產(chǎn)者循環(huán)作為主循環(huán)控制著所有的消費者循環(huán),并且使用通信技術與各消費者循環(huán)進行通信。
1.2 生產(chǎn)者/消費者模式的構(gòu)成
生產(chǎn)者/消費者模式主要包括兩部分,即生產(chǎn)者循環(huán)和消費者循環(huán),其中,生產(chǎn)者循環(huán)采用“元素入隊列”函數(shù),將執(zhí)行過程中根據(jù)不同事件而產(chǎn)生的不同元素存入隊列中;消費者循環(huán)采用“元素出隊列”函數(shù),將生產(chǎn)者循環(huán)所加入隊列的元素取出進行處理。
1.3 生產(chǎn)者循環(huán)與消費者循環(huán)的通信
生產(chǎn)者/消費者設計模式采用了隊列的數(shù)據(jù)存儲方式。隊列能很好地消除競爭狀態(tài)問題,又可以實現(xiàn)數(shù)據(jù)的同步傳輸,還具有數(shù)據(jù)緩沖區(qū),可以存儲多份數(shù)據(jù)而且可以保證數(shù)據(jù)不會丟失或被覆蓋[4]。隊列的數(shù)據(jù)存儲是開辟一個緩存區(qū),依據(jù)先進先出的原則進行的。新來的元素總是被加入隊尾,每次離開的元素總是隊列頭上的,當前"最老的"元素離隊,這樣就保證了生產(chǎn)者循環(huán)中產(chǎn)生的數(shù)據(jù)通過隊列的方式就順利地傳遞到了消費者循環(huán)中進行處理[5-8],從而實現(xiàn)了生產(chǎn)者循環(huán)與消費者循環(huán)之間的通信。
2.1 生產(chǎn)者/消費者模式的分類和用法
LabVIEW中生產(chǎn)者/消費者模式主要有兩種不同的架構(gòu):一種傳送的是數(shù)據(jù),如圖1所示;另一種傳送的是事件,如圖2所示。生產(chǎn)者循環(huán)中往往需要放置事件結(jié)構(gòu)用于處理用戶界面事件,在產(chǎn)生事件的同時往往會從事件結(jié)構(gòu)中拿到數(shù)據(jù)并傳遞給消費者循環(huán)進行處理,在接收到退出的命令后退出消費者循環(huán),然后銷毀隊列;生產(chǎn)者的超時分支執(zhí)行后,報錯則退出程序。
圖1 傳送數(shù)據(jù)的生產(chǎn)者/消費者模式
圖2 傳送事件的生產(chǎn)者/消費者模式
2.2 生產(chǎn)者/消費者模式的應用
LabVIEW生產(chǎn)者/消費者模式具有較大實際應用價值,采用生產(chǎn)者/消費者設計模式設計的多任務型音頻信號采集系統(tǒng)能夠連續(xù)、高效地采集多個音頻信號并進行處理。
設計中用到的主要硬件是聲卡。聲卡是多媒體技術中最基本的組成部分,是實現(xiàn)聲波/數(shù)字信號相互轉(zhuǎn)換的一種硬件。一般聲卡都是由聲音控制/處理芯片,功放芯片,聲音輸入/輸出端口等部分組成,聲卡的硬件結(jié)構(gòu)如圖3所示。
圖3 聲卡結(jié)構(gòu)示意圖
聲卡的基本工作流程為:輸入時,麥克風或線路輸入(Line In)獲取的音頻信號通過A/D轉(zhuǎn)換器轉(zhuǎn)換成數(shù)字信號,送到計算機進行播放、錄音等各種處理;輸出時,計算機通過總線將數(shù)字化的聲音信號以PCM(脈沖編碼調(diào)制)方式送到D/A轉(zhuǎn)換器,變成模擬的音頻信號,再通過功率放大器或線路輸出(Wave Out)送到音響等設備轉(zhuǎn)換成聲波。
市面上的聲卡主流都是16位的,聲卡的最高采樣頻率是44.1 kHz,民用的聲卡一般將采樣頻率設為4檔,分別為44.1 kHz,22.05 kHz,11.025 kHz和8 kHz[9]。聲卡不僅價格低廉,而且兼容性好、性能穩(wěn)定、靈活通用,驅(qū)動程序升級方便,而且LabVIEW提供了專門用于聲卡操作的函數(shù)節(jié)點,所以用聲卡搭建音頻信號采集系統(tǒng)具有簡便高效的優(yōu)點。
運用生產(chǎn)者/消費者程序設計模式,使生產(chǎn)者循環(huán)完成對用戶界面的響應,完成音頻信號的參數(shù)設置任務,消費者循環(huán)完成音頻信號的采集與處理任務。將音頻參數(shù)設置和音頻信號采集與處理分配給兩個并行循環(huán)來完成,在音頻信號采集的同時可以設置下一個音頻信號的相關參數(shù),這樣可以依次連續(xù)地采集多個音頻信號,大幅提高了信號采集與處理的效率。圖4是實際音頻信號采集系統(tǒng)前面板。
圖4 音頻信號采集系統(tǒng)前面板
該面板主要完成音頻參數(shù)的設置,顯示當前采集狀態(tài),并顯示采集完成的原始信號波形及其功率譜。
主要程序框圖如圖5所示。在循環(huán)開始前,使用“獲取隊列引用”函數(shù)創(chuàng)建消息隊列。生產(chǎn)者循環(huán)使用“元素入隊列”函數(shù)向隊列中添加數(shù)據(jù)。消費者循環(huán)使用“元素出隊列”函數(shù)從隊列中獲取消息并移出數(shù)據(jù)并進行數(shù)據(jù)處理。在該程序中生產(chǎn)者循環(huán)傳遞給生產(chǎn)者循環(huán)的數(shù)據(jù)是聲卡配置參數(shù),當聲卡配置參數(shù)發(fā)生改變時,生產(chǎn)者循環(huán)使用“元素入隊列”函數(shù)將新的聲卡配置參數(shù)加入到隊列中。
圖5 音頻信號采集系統(tǒng)的主要程序框圖
消費者循環(huán)內(nèi)部是狀態(tài)機結(jié)構(gòu),在首次循環(huán)時進入“Set”分支,進行聲卡的初始化設置,聲卡初始化設置完畢后進入“DAQ”分支進行音頻信號采集,達到設定的采集時長后采集結(jié)束,然后進入“Wait”分支檢查隊列中是否有元素。若隊列中有元素,則通過“元素出隊列”函數(shù)將元素取出來,再進入“Set”分支重新進行聲卡的參數(shù)配置,配置好聲卡的參數(shù)之后再進入“DAQ”分支進行音頻信號的采集,音頻信號采集結(jié)束后再進入到“Wait”分支取出或等待隊列中的下一個元素。
其中,消費者循環(huán)的“DAQ”分支除了對音頻信號進行采集,還對采集完成的信號進行功率譜分析,并將音頻信號以文件的形式保存到硬盤中。其中,音頻文件的命名方式為“audio序號.wav”,序號值從0開始,每完成一次音頻信號采集,序號值加1,這樣,依次采集得到的音頻文件名稱分別為“audio0.wav”,“audio1.wav”,“audio2.wav”,…。消費者循環(huán)中“Wait”分支程序框圖如圖6所示。在該分支中主要負責檢查隊列中是否還有元素,如有,則通過“元素出隊列”函數(shù)將其取出,再判斷取出的元素是否含有空值,若取出的元素不含空值,則創(chuàng)建新的音頻文件準備寫入,并將取出的元素傳遞到“Set”分支進行聲卡參數(shù)設置,再進入“DAQ”分支進行音頻信號采集。
圖6 消費者循環(huán)“Wait”分支
通過大量實驗發(fā)現(xiàn),采用生產(chǎn)者/消費者設計模式設計的多任務型音頻信號采集系統(tǒng),能夠很方便地連續(xù)采集到多個音頻信號并處理,大幅提高了數(shù)據(jù)采集和處理的效率,較之以前基于其他模式的設計有較大的優(yōu)越性。
生產(chǎn)者/消費者設計模式不僅使得并行循環(huán)之間可以很方便地傳遞數(shù)據(jù),而且大幅提高了程序的運行效率,也提高了程序的維護性和復用性。通過介紹一個多任務型音頻信號采集系統(tǒng),闡明了生產(chǎn)者/消費者設計模式的原理與思想以及這種設計思想在LabVIEW中的實現(xiàn)與應用,證明了在多任務處理和實時性、連續(xù)性要求嚴格的程序設計中,生產(chǎn)者/消費者設計模式具有一定的優(yōu)勢。
[1] 肖成勇,雷振山,魏麗.LabVIEW 2010基礎教程[M].北京:中國鐵道出版社,2012.
[2] 姚麗,劉冬冬.基于LabVIEW的數(shù)據(jù)采集與信號處理系統(tǒng)設計[J].電子科技,2012,25(5):79-82.
[3] 林靜,林振宇,鄭福仁.LabVIEW虛擬儀器程序設計從入門到精通[M].北京:人民郵電出版社,2010.
[4] 劉素貞,吳延俊,張闖,等.基于生產(chǎn)者/消費者設計模式的應力波信息采集系統(tǒng)的設計[J].計算機測量與控制,2016,24(9):199-203.
[5] 雷晏瑤,李智.基于生產(chǎn)者/消費者的數(shù)據(jù)采集系統(tǒng)設計[J].計算機應用技術,2011,9(38):40-45.
[6] 唐進元,李松,邵文.基于LabVIEW生產(chǎn)者-消費者模式的齒輪傳動振動測試系統(tǒng)[J].機械傳動,2011,35(1):5-7.
[7] 王健,胥燕軍,王偉平.基于生產(chǎn)者/消費者模式的鋼軌輪廓采集系統(tǒng)[J].中國鐵路,2014(3):74-76.
[8] 周愛軍,馬海瑞.基于聲卡的LabVIEW數(shù)據(jù)采集與分析系統(tǒng)設計[J].微計算機信息,2005,21(9):108-109.
[9] 王維喜,李智.基于生產(chǎn)者/消費者設計模式的連續(xù)音頻信號采集系統(tǒng)[J].現(xiàn)代電子技術,2009(7):129-130.
[10] Jeffrey Travis,Jim Kring.LabVIEW大學實用教程[M].3版.北京:電子工業(yè)出版社,2008.
[11] 王磊,陶梅.精通LabVIEW 8.0[M].北京:電子工業(yè)出版社,2007.
[12] 楊樂平,李海濤,楊磊.LabVIEW程序設計與應用[M].2版.北京:電子工業(yè)出版社,2004.
[13] Johnson G W,Jennings R.LabVIEW graphical programming[M].New York:McGraw-Hill,2006.
[14] 侯國屏,王坤,葉齊.LabVIEW 7.1編程與虛擬儀器設計[M].北京:清華大學出版社,2005.
[15] 劉君華.虛擬儀器圖形化編程語言LabVIEW教程[M].西安:西安電子科技大學出版社,2001.
Research on Producer/Consumer Pattern Based on LabVIEW
HUANG Shiquan,JIN Xuanhong
(School of Optical-Electrical and Computer Engineering,University of Shanghai for Science and Technology, Shanghai 200093,China)
In designing the data acquisition program, it is found that the design pattern of program has a great influence on the efficiency of data acquisition and processing. As for it, in this paper, LabVIEW producer / consumer design pattern is introduced and applied to the design of multi-task audio signal acquisition system. In this design, the audio parameter setting and data acquisition and processing are allocated to two parallel loops, and the parameters of the audio signal are set in the producer loop while the data collection and processing are done in the consumer loop, which greatly improves the efficiency of data acquisition and processing, and improves the readability, expansibility, maintainability and reusability of the program.
LabVIEW; producer/consumer pattern; data acquisition; queue
2016- 11- 24
黃世泉(1993-),男,碩士研究生。研究方向:信號獲取與處理。金晅宏(1978-),女,副教授。研究方向:信號獲取與處理等。
10.16180/j.cnki.issn1007-7820.2017.09.021
TN912.3;TP274+.2
A
1007-7820(2017)09-075-04