周靜雷,董姣,常誠,李倩(西安工程大學(xué) 電子信息學(xué)院,西安 710048)
?
采用MATLAB與C++混合編程生成揚(yáng)聲器功率實(shí)驗(yàn)信號(hào)①
周靜雷,董姣,常誠,李倩
(西安工程大學(xué) 電子信息學(xué)院,西安 710048)
摘 要:針對(duì)在C++ Builder中生成白噪等揚(yáng)聲器功率實(shí)驗(yàn)所用測(cè)試信號(hào)的難度較大,以及MATLAB與C++ Builder混編過程中的兼容性問題,文章提出了一種MATLAB與C++混合編程的方法.首先,運(yùn)用Matlab生成動(dòng)態(tài)鏈接庫DLL; 其次,VS調(diào)用該DLL文件并編寫接口函數(shù)以生成可供C++ Builder調(diào)用的DLL文件; 最后,在C++Builder中設(shè)計(jì)應(yīng)用程序以生成揚(yáng)聲器功率實(shí)驗(yàn)測(cè)試信號(hào).為驗(yàn)證所生成信號(hào)的準(zhǔn)確性,文章對(duì)信號(hào)的均值、方差、自相關(guān)性、頻譜、功率譜密度、概率密度、三分之一倍頻程的RTA等參量進(jìn)行計(jì)算,通過將計(jì)算結(jié)果與標(biāo)準(zhǔn)信號(hào)進(jìn)行對(duì)比分析,發(fā)現(xiàn)混合編程生成的信號(hào)可作為揚(yáng)聲器功率實(shí)驗(yàn)信號(hào)使用.
關(guān)鍵詞:Matlab; VS2010; C++Builder; 混合編程; 功率實(shí)驗(yàn)信號(hào)
隨著電聲行業(yè)不斷發(fā)展,揚(yáng)聲器已成為人們生活?yuàn)蕵分斜夭豢缮俚囊徊糠?與此同時(shí)消費(fèi)者對(duì)揚(yáng)聲器音質(zhì)的要求也不斷提升,人們開始追求立體環(huán)繞聲效,甚至是Hi-Fi.完美的揚(yáng)聲器音質(zhì)必須經(jīng)過無數(shù)次的測(cè)量修改參數(shù)方可得到,其測(cè)量過程首先需要通過上位機(jī)對(duì)被測(cè)揚(yáng)聲器輸入測(cè)試信號(hào),而信號(hào)的準(zhǔn)確性直接影響了測(cè)量結(jié)果,因此對(duì)該測(cè)試信號(hào)的研究十分必要.揚(yáng)聲器功率試驗(yàn)所用測(cè)試信號(hào)一般包括白噪聲、粉紅噪聲、模擬節(jié)目信號(hào)等.目前對(duì)生成測(cè)試信號(hào)方法研究主要以模擬方法為主,數(shù)字方法的研究成果較少.文獻(xiàn)[1]使用模擬電路產(chǎn)生高斯白噪聲,過程復(fù)雜且生成信號(hào)的性能不夠完善; 文獻(xiàn)[2]使用信號(hào)發(fā)生器生成各參數(shù)已經(jīng)設(shè)定好的高斯白噪聲,其靈活性不高且只能生成白噪聲,其信號(hào)種類受限.論文中生成實(shí)驗(yàn)信號(hào)的算法程序最終將用于基于C++語言研發(fā)的虛擬儀器—揚(yáng)聲器功率試驗(yàn)測(cè)試系統(tǒng)的上位機(jī)軟件中,該測(cè)試信號(hào)算法程序要求被其上位機(jī)調(diào)用,并且具有與開發(fā)語言C++ Builder兼容的接口.直接在C++ Builder中編寫復(fù)雜度較高的信號(hào)處理算法程序,完成的難度較大,而且精度和正確性都難以保證.而這些算法在Matlab中開發(fā),不僅難度較低且具有高的精度,因此只需將Matlab開發(fā)的該算法程序移植到C++Builder中,就可滿足復(fù)雜多樣的實(shí)際需求.
針對(duì)以上存在的問題及對(duì)信號(hào)復(fù)雜多樣的需求,文章提出用軟件之間混編[3]的方法生成信號(hào),并且對(duì)生成信號(hào)各參數(shù)進(jìn)行具體分析以驗(yàn)證信號(hào)準(zhǔn)確性.鑒于Matlab中生成的DLL在C++ Builder中被調(diào)用時(shí)存在兼容問題,因此提出了利用Matlab、Microsoft Visual Studio 2010的C++環(huán)境(下文簡(jiǎn)稱為VS)、C++Builder混編的方法生成功率實(shí)驗(yàn)測(cè)試信號(hào),相比模擬方法可靈活控制信號(hào),相比之前的數(shù)字方法研究過程更簡(jiǎn)單準(zhǔn)確且信號(hào)種類更多樣,同時(shí)解決了Matlab與C++ Builder混編過程中的兼容性,為功率實(shí)驗(yàn)信號(hào)生成提供了一種設(shè)計(jì)方法.
揚(yáng)聲器功率實(shí)驗(yàn)信號(hào)生成流程如圖1所示,主要包括各軟件內(nèi)部程序編寫,及軟件間通過.dll[4]文件的連接.
圖1 系統(tǒng)總體框圖
1.1Matlab生成DLL文件
Matlab主要任務(wù)是建立與VS的連接,并生成.dll和其它文件,其流程如圖2所示.
圖2 Matlab生成DLL文件流程
首先,在Matlab的Command Window窗口中運(yùn)行mex –setup 、mbuild[5]–setup命令,在出現(xiàn)的可匹配編譯器中選擇VS2010,以建立Matlab與VS的連接.然后,編寫.m文件,下面以白噪聲的生成為例(下文都以白噪為例)說明程序編碼.白噪聲是功率實(shí)驗(yàn)所用測(cè)試信號(hào)中最基本的信號(hào),其生成原理依據(jù)Box-muller算法,該算法具體為:
1)生成服從均勻分布的隨機(jī)數(shù)序列U1、U2,可通過randn函數(shù)生成;
2)對(duì)隨機(jī)序列進(jìn)行正態(tài)化處理,其公式如下,如在C++ Builder中直接生成白噪,則需要對(duì)上述算法進(jìn)行詳細(xì)編寫得到最終白噪序列Z,其過程較復(fù)雜.而利用混合編程的方法則更簡(jiǎn)單、有效,只需在matlab的m文件中編寫function函數(shù)去調(diào)用Matlab自帶的白噪生成函數(shù),功能函數(shù)如下所示.
function [whitenoise]=leinwgn(m,n,p)whitenoise=wgn(m,n,p);
wgn是Matlab中自帶生成高斯白噪聲的函數(shù),其代表意思為White Gaussian Noise.其中 m和n分別代表生成白噪聲的行數(shù)及列數(shù),p為白噪聲強(qiáng)度.
最后,通過編譯命令對(duì)生成的.m文件進(jìn)行編譯,將得到.dll文件.在Matlab窗口中運(yùn)行mcc-W cpplib:WgnDll -T link:lib leinwgn.m命令,其語法功能是將m文件轉(zhuǎn)換為對(duì)應(yīng)的C/C++文件,運(yùn)行完成后將在m文件所在目錄下生成.dll ,.cpp,.lib,.h等文件.
1.2VS編寫接口函數(shù)
VS[6]主要完成接口程序的編寫并生成可供C++ builder調(diào)用的DLL文件,其基本流程如圖3所示.
圖3 VS生成DLL文件流程
首先,在VS軟件中新建MFC DLL項(xiàng)目并對(duì)其進(jìn)行設(shè)置,并將在Matlab中生成的.dll,.lib,.h文件加載到VS中.下面具體說明加載步驟和方法:
1)在VS中,新建項(xiàng)目- >MFC DLL工程- >項(xiàng)目名稱- >WhiteNoiseDLL- >完成;
2)復(fù)制Matlab生成的.dll,.lib,.h文件到所建項(xiàng)目路徑下;
3)對(duì)項(xiàng)目設(shè)置頭文件及庫文件路徑,其方法為,項(xiàng)目- >WhiteNoiseDLL屬性- >配置屬性- >VC++目錄->在包含目錄及庫目錄中分別添加頭文件.h及庫文件.lib的路徑;
4)添加具體外部依賴項(xiàng),方法為,WhiteNoiseDLL屬性- >鏈接器- >輸入- >附加依賴項(xiàng),此處添加由Matlab生成的.lib文件名.
5)添加具體頭文件,方法為,解決方案WhiteNoiseDLL- >頭文件- >添加- >現(xiàn)有項(xiàng)- >選擇由Matlab生成的.h文件.
然后,編寫項(xiàng)目的.cpp文件,以完成接口函數(shù)的編寫.具體編寫以下4部分:
1)在頭文件部分加入Matlab生成的.h文件名; 2)打開并初始化項(xiàng)目及動(dòng)態(tài)鏈接庫文件;
3)編寫接口函數(shù),其函數(shù)名為extern "C" double __declspec(dllexport)_cdecl WNS(double *wdArray,int m,int nLength,double p).其中m,nLength,p即Matlab 中m文件的輸入?yún)?shù)m,n及p.指針wdArray代表輸出的whitenoise數(shù)組;
4)終止化動(dòng)態(tài)鏈接庫文件.
最后,對(duì)編寫的.cpp文件進(jìn)行編譯,將在“Debug”文件夾下生成所建項(xiàng)目的.dll、.lib等文件,該文件可供C++ Builder調(diào)用.
1.3C++ Builder完成應(yīng)用程序開發(fā)
C++ Builder主要完成上位機(jī)的編寫.通過調(diào)用VS生成的.dll文件,完成應(yīng)用程序的開發(fā)最終生成揚(yáng)聲器功率實(shí)驗(yàn)測(cè)試信號(hào),其基本流程如圖4所示.
首先,轉(zhuǎn)換由VS生成的.dll文件,由于其生成的.dll不能直接被C++ Builder識(shí)別,需要通過C++ Builder自帶的implib工具將.dll文件轉(zhuǎn)換為對(duì)應(yīng)的可被軟件識(shí)別的.lib文件; 然后,新建項(xiàng)目并加載轉(zhuǎn)換后的.lib文件; 最后,編寫.cpp程序,通過應(yīng)用程序給各參數(shù)進(jìn)行賦值,并調(diào)用VS中編寫的接口函數(shù)WNS( white,int m,int nLength,double p),輸出的white數(shù)組即為最終的白噪信號(hào)
經(jīng)過混合編程,生成白噪信號(hào)如圖5中第一幅“白噪聲”所示.
通過對(duì)混合編程方法生成的白噪進(jìn)行進(jìn)一步分析,發(fā)現(xiàn)生成的白噪信號(hào)通過每倍頻程增加3dB的濾波器后將得到粉噪信號(hào); 白噪信號(hào)通過模擬節(jié)目信號(hào)電路后將得到模擬節(jié)目信號(hào),而粉噪及模擬節(jié)目信號(hào)都是揚(yáng)聲器功率實(shí)驗(yàn)中比不可少的測(cè)試信號(hào).在應(yīng)用中,由混合編程生成測(cè)試信號(hào)的應(yīng)用范圍也將會(huì)很廣,不僅可以應(yīng)用于揚(yáng)聲器功率實(shí)驗(yàn),也可以在其它測(cè)試儀器中作為測(cè)試信號(hào)使用.
針對(duì)生成的信號(hào),文章計(jì)算分析了均值,方差,自相關(guān)性,概率密度,頻譜,功率譜密度,三分之一倍頻程RTA等參量.對(duì)于上述參量,均值和方差的算法較簡(jiǎn)單,可以直接在C++ Builder中編寫完成,無需進(jìn)行混編; 計(jì)算其它參量則需要利用與上文相同的混合編程方法進(jìn)行分析.以下具體說明對(duì)參量的分析.
1)自相關(guān)函數(shù)[7],代表信號(hào)與其延遲信號(hào)間的相似程度.自相關(guān)函數(shù)公式如下式:
當(dāng)延遲時(shí)間t為0時(shí),函數(shù)值最大,其值等于信號(hào)的能量.對(duì)于白噪,t為0時(shí)函數(shù)值等于強(qiáng)度P.Matlab中對(duì)應(yīng)的函數(shù)為[y,lag]=xcorr(whitenoise,'unbiased'),lags為信號(hào)的延時(shí)或超前,信號(hào)的自相關(guān)性是相對(duì)于自身存在一定超前和滯后而言的.
2)概率密度函數(shù)[8],代表白噪在某一確定點(diǎn)出現(xiàn)的可能性.其公式如下:
高斯白噪聲的概率密度原理上服從正態(tài)分布,Matlab中對(duì)應(yīng)的函數(shù)為[f,y]=ksdensity(whitenoise).
3)頻譜[9],頻譜分析又稱為FFT(傅里葉)變換,代表信號(hào)在不同頻率的能量分布.其公式如下:
在Matlab只需調(diào)用Y=abs(fft(whitenoise,nfft))函數(shù)即可實(shí)現(xiàn)復(fù)雜的fft算法,其中nfft是信號(hào)傅里葉變換采樣點(diǎn)數(shù),其值越大結(jié)果越精確.
4)功率譜密度[10],代表每單位頻率波的功率.其公式如下:
白噪聲的功率譜與信號(hào)的自相關(guān)函數(shù)為傅里葉變換對(duì),Matlab中對(duì)應(yīng)的函數(shù)為[P,f]=periodogram (whitenoise,window,nfft,Fs),window為所加窗,Fs為采樣頻率.
5)三分之一倍頻程RTA,RTA是“Real TimeAnalysis”,實(shí)時(shí)分析.文章中計(jì)算信號(hào)在三分之一倍頻程段的能量分布,即對(duì)三十一個(gè)頻率點(diǎn)的有效值進(jìn)行計(jì)算,其中需要用到傅里葉變換.
上述五個(gè)參量分析,所用的算法相對(duì)生成白噪的算法較復(fù)雜,若直接在C++ Builder中完成程序設(shè)計(jì),所需的工作量相對(duì)混合編程會(huì)大很多,且準(zhǔn)確度難以保證,進(jìn)一步證實(shí)了混合編程在此次揚(yáng)聲器功率實(shí)驗(yàn)信號(hào)生成中的重大意義.
將經(jīng)過混合編程生成信號(hào)最終用于實(shí)驗(yàn)的測(cè)試信號(hào),運(yùn)行系統(tǒng)測(cè)得結(jié)果如圖5所示.
圖5 混合編程生成白噪的參量分析
為驗(yàn)證信號(hào)的準(zhǔn)確性,本文將混編生成的信號(hào)與國家標(biāo)準(zhǔn)[11]規(guī)定的噪聲信號(hào)進(jìn)行對(duì)比并對(duì)其參量進(jìn)行分析對(duì)比.首先將國家標(biāo)準(zhǔn)白噪信號(hào)保存為.wav文件;其次將該wav文件通過wavread函數(shù)讀取到Matlab中,并編寫與上文參量分析對(duì)應(yīng)的m文件運(yùn)行后,分析結(jié)果如圖6所示.
對(duì)比圖5與圖6參量分析結(jié)果,可通過以下幾點(diǎn)確定混合編程生成的白噪與標(biāo)準(zhǔn)信號(hào)特性相同,其可以作為揚(yáng)聲器功率實(shí)驗(yàn)測(cè)試信號(hào).
1)信號(hào)的自相關(guān)函數(shù)在x=0處為沖擊函數(shù),幅值等于強(qiáng)度p;
2)信號(hào)的概率密度函數(shù)服從正態(tài)分布;
3)信號(hào)頻譜在整個(gè)頻段內(nèi)服從等帶寬頻帶所含噪聲能量相等;
4)信號(hào)的功率譜密度在整個(gè)頻段內(nèi)均勻分布;
5)對(duì)數(shù)坐標(biāo)中,信號(hào)的能量符合每倍頻程增加3dB.
圖6 國家標(biāo)準(zhǔn)中白噪聲參量分析
通過對(duì)MATLAB與C++的混合編程方法生成的白噪信號(hào)進(jìn)行參量分析與驗(yàn)證.可以看到: 使用混合編程方法生成揚(yáng)聲器功率實(shí)驗(yàn)測(cè)試信號(hào)過程中,Matlab可以既準(zhǔn)確又容易生成信號(hào),這樣彌補(bǔ)了C++ Builder在信號(hào)開發(fā)方面的不足; Matlab在對(duì)白噪各參量分析時(shí),也充分發(fā)揮了其優(yōu)勢(shì); 混合編程可以彌補(bǔ)Matlab與C++ Builder兩者的不足,同時(shí)也可以將各自優(yōu)勢(shì)很好結(jié)合.混合編程為揚(yáng)聲器功率實(shí)驗(yàn)測(cè)試信號(hào)的生成提供了一種新生成方法,具有一定的實(shí)際意義.
參考文獻(xiàn)
1盤書寶.一種基于FPGA的高斯噪聲源設(shè)計(jì).桂林航天工業(yè)學(xué)院學(xué)報(bào),2014,4:330–334.
2付俊,李光燦.一種高斯白噪聲信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn).計(jì)算機(jī)測(cè)量與控制,2012,5:1436–1438.
3李璞,趙地.Matlab與VC++混合編程技術(shù)在信號(hào)采集中的應(yīng)用.計(jì)算機(jī)與網(wǎng)絡(luò),2013,12:56–58.
4左明成,武云.VC++和MATLAB混合編程的新應(yīng)用.計(jì)算機(jī)技術(shù)與發(fā)展,2014,12:15–20.
5羅伯特·J·希林,桑德拉·L·哈里斯.殷勤業(yè),王文杰,鄧科等譯.數(shù)字信號(hào)處理導(dǎo)論——MATLAB實(shí)現(xiàn).西安:西安交通大學(xué)出版社,2014.
6朱磊.MATLAB與C的對(duì)比研究.宜春學(xué)院學(xué)報(bào),2012,4:49–50.
7岳曌.偽隨機(jī)序列的構(gòu)造及其自相關(guān)函數(shù)分析[學(xué)位論文].西安:西安電子科技大學(xué),2014.
8屈毅,穆麗寧,賴展翅.非高斯隨機(jī)分布系統(tǒng)自適應(yīng)控制算法的研究.現(xiàn)代電子技術(shù),2014,4:53–55.
9侯盼衛(wèi),楊錄,王建軍.基于FFT系數(shù)的正弦信號(hào)頻率估計(jì)算法.光電技術(shù)應(yīng)用,2013,6:58–62.
10張曉勇,羅來源.參數(shù)未知的艦船輻射噪聲檢測(cè)方法.聲學(xué)學(xué)報(bào),2015,4:511–518.
11GB/T12060.2-2011.聲系統(tǒng)設(shè)備第2部分:一般術(shù)語解釋和計(jì)算方法.北京:中國質(zhì)檢出版社,2011.
Mixed Programming Between Matlab and C++ to Generate Power Test Signal
ZHOU Jing-Lei,DONG Jiao,CHANG Cheng,LI Qian
(School of Electronics and Information,Xi’an Polytechnic University,Xi’an 710048,China)
Abstract:According to the problem that it is difficult to generate white noise and some other speaker power test signals in C++ Builder and the problems of compatibility in mixed programming between Matlab and C++ Builder,a mixed method combined Matlab with C++ is put forward.Firstly,a dynamic link library DLL is generated in Matlab.Then,VS calls the DLL file and writes interface function to create another DLL file which can be used in C++ Builder.Finally,design the application program to generate the speaker power test signal in C++ Builder.To verify the accuracy of the generated signal,some parameters of signal are calculated,such as the mean,variance,self-correlation,spectrum and power spectral density,the probability density and RTA of one third octave.Comparing the calculated results with the standard signal’s,it shows that the signal generated by mixing programming can be used for speaker power test.
Key words:Matlab; VS2010; C++ Builder; mixed programming; power test signal
收稿時(shí)間:①2015-08-13;收到修改稿時(shí)間:2015-10-08