周靜雷,董姣,常誠,李倩(西安工程大學 電子信息學院,西安 710048)
?
采用MATLAB與C++混合編程生成揚聲器功率實驗信號①
周靜雷,董姣,常誠,李倩
(西安工程大學 電子信息學院,西安 710048)
摘 要:針對在C++ Builder中生成白噪等揚聲器功率實驗所用測試信號的難度較大,以及MATLAB與C++ Builder混編過程中的兼容性問題,文章提出了一種MATLAB與C++混合編程的方法.首先,運用Matlab生成動態鏈接庫DLL; 其次,VS調用該DLL文件并編寫接口函數以生成可供C++ Builder調用的DLL文件; 最后,在C++Builder中設計應用程序以生成揚聲器功率實驗測試信號.為驗證所生成信號的準確性,文章對信號的均值、方差、自相關性、頻譜、功率譜密度、概率密度、三分之一倍頻程的RTA等參量進行計算,通過將計算結果與標準信號進行對比分析,發現混合編程生成的信號可作為揚聲器功率實驗信號使用.
關鍵詞:Matlab; VS2010; C++Builder; 混合編程; 功率實驗信號
隨著電聲行業不斷發展,揚聲器已成為人們生活娛樂中必不可少的一部分,與此同時消費者對揚聲器音質的要求也不斷提升,人們開始追求立體環繞聲效,甚至是Hi-Fi.完美的揚聲器音質必須經過無數次的測量修改參數方可得到,其測量過程首先需要通過上位機對被測揚聲器輸入測試信號,而信號的準確性直接影響了測量結果,因此對該測試信號的研究十分必要.揚聲器功率試驗所用測試信號一般包括白噪聲、粉紅噪聲、模擬節目信號等.目前對生成測試信號方法研究主要以模擬方法為主,數字方法的研究成果較少.文獻[1]使用模擬電路產生高斯白噪聲,過程復雜且生成信號的性能不夠完善; 文獻[2]使用信號發生器生成各參數已經設定好的高斯白噪聲,其靈活性不高且只能生成白噪聲,其信號種類受限.論文中生成實驗信號的算法程序最終將用于基于C++語言研發的虛擬儀器—揚聲器功率試驗測試系統的上位機軟件中,該測試信號算法程序要求被其上位機調用,并且具有與開發語言C++ Builder兼容的接口.直接在C++ Builder中編寫復雜度較高的信號處理算法程序,完成的難度較大,而且精度和正確性都難以保證.而這些算法在Matlab中開發,不僅難度較低且具有高的精度,因此只需將Matlab開發的該算法程序移植到C++Builder中,就可滿足復雜多樣的實際需求.
針對以上存在的問題及對信號復雜多樣的需求,文章提出用軟件之間混編[3]的方法生成信號,并且對生成信號各參數進行具體分析以驗證信號準確性.鑒于Matlab中生成的DLL在C++ Builder中被調用時存在兼容問題,因此提出了利用Matlab、Microsoft Visual Studio 2010的C++環境(下文簡稱為VS)、C++Builder混編的方法生成功率實驗測試信號,相比模擬方法可靈活控制信號,相比之前的數字方法研究過程更簡單準確且信號種類更多樣,同時解決了Matlab與C++ Builder混編過程中的兼容性,為功率實驗信號生成提供了一種設計方法.
揚聲器功率實驗信號生成流程如圖1所示,主要包括各軟件內部程序編寫,及軟件間通過.dll[4]文件的連接.

圖1 系統總體框圖
1.1Matlab生成DLL文件
Matlab主要任務是建立與VS的連接,并生成.dll和其它文件,其流程如圖2所示.

圖2 Matlab生成DLL文件流程
首先,在Matlab的Command Window窗口中運行mex –setup 、mbuild[5]–setup命令,在出現的可匹配編譯器中選擇VS2010,以建立Matlab與VS的連接.然后,編寫.m文件,下面以白噪聲的生成為例(下文都以白噪為例)說明程序編碼.白噪聲是功率實驗所用測試信號中最基本的信號,其生成原理依據Box-muller算法,該算法具體為:
1)生成服從均勻分布的隨機數序列U1、U2,可通過randn函數生成;

2)對隨機序列進行正態化處理,其公式如下,如在C++ Builder中直接生成白噪,則需要對上述算法進行詳細編寫得到最終白噪序列Z,其過程較復雜.而利用混合編程的方法則更簡單、有效,只需在matlab的m文件中編寫function函數去調用Matlab自帶的白噪生成函數,功能函數如下所示.
function [whitenoise]=leinwgn(m,n,p)whitenoise=wgn(m,n,p);
wgn是Matlab中自帶生成高斯白噪聲的函數,其代表意思為White Gaussian Noise.其中 m和n分別代表生成白噪聲的行數及列數,p為白噪聲強度.
最后,通過編譯命令對生成的.m文件進行編譯,將得到.dll文件.在Matlab窗口中運行mcc-W cpplib:WgnDll -T link:lib leinwgn.m命令,其語法功能是將m文件轉換為對應的C/C++文件,運行完成后將在m文件所在目錄下生成.dll ,.cpp,.lib,.h等文件.
1.2VS編寫接口函數
VS[6]主要完成接口程序的編寫并生成可供C++ builder調用的DLL文件,其基本流程如圖3所示.

圖3 VS生成DLL文件流程
首先,在VS軟件中新建MFC DLL項目并對其進行設置,并將在Matlab中生成的.dll,.lib,.h文件加載到VS中.下面具體說明加載步驟和方法:
1)在VS中,新建項目- >MFC DLL工程- >項目名稱- >WhiteNoiseDLL- >完成;
2)復制Matlab生成的.dll,.lib,.h文件到所建項目路徑下;
3)對項目設置頭文件及庫文件路徑,其方法為,項目- >WhiteNoiseDLL屬性- >配置屬性- >VC++目錄->在包含目錄及庫目錄中分別添加頭文件.h及庫文件.lib的路徑;
4)添加具體外部依賴項,方法為,WhiteNoiseDLL屬性- >鏈接器- >輸入- >附加依賴項,此處添加由Matlab生成的.lib文件名.
5)添加具體頭文件,方法為,解決方案WhiteNoiseDLL- >頭文件- >添加- >現有項- >選擇由Matlab生成的.h文件.
然后,編寫項目的.cpp文件,以完成接口函數的編寫.具體編寫以下4部分:
1)在頭文件部分加入Matlab生成的.h文件名; 2)打開并初始化項目及動態鏈接庫文件;
3)編寫接口函數,其函數名為extern "C" double __declspec(dllexport)_cdecl WNS(double *wdArray,int m,int nLength,double p).其中m,nLength,p即Matlab 中m文件的輸入參數m,n及p.指針wdArray代表輸出的whitenoise數組;
4)終止化動態鏈接庫文件.
最后,對編寫的.cpp文件進行編譯,將在“Debug”文件夾下生成所建項目的.dll、.lib等文件,該文件可供C++ Builder調用.
1.3C++ Builder完成應用程序開發
C++ Builder主要完成上位機的編寫.通過調用VS生成的.dll文件,完成應用程序的開發最終生成揚聲器功率實驗測試信號,其基本流程如圖4所示.
首先,轉換由VS生成的.dll文件,由于其生成的.dll不能直接被C++ Builder識別,需要通過C++ Builder自帶的implib工具將.dll文件轉換為對應的可被軟件識別的.lib文件; 然后,新建項目并加載轉換后的.lib文件; 最后,編寫.cpp程序,通過應用程序給各參數進行賦值,并調用VS中編寫的接口函數WNS( white,int m,int nLength,double p),輸出的white數組即為最終的白噪信號
經過混合編程,生成白噪信號如圖5中第一幅“白噪聲”所示.
通過對混合編程方法生成的白噪進行進一步分析,發現生成的白噪信號通過每倍頻程增加3dB的濾波器后將得到粉噪信號; 白噪信號通過模擬節目信號電路后將得到模擬節目信號,而粉噪及模擬節目信號都是揚聲器功率實驗中比不可少的測試信號.在應用中,由混合編程生成測試信號的應用范圍也將會很廣,不僅可以應用于揚聲器功率實驗,也可以在其它測試儀器中作為測試信號使用.
針對生成的信號,文章計算分析了均值,方差,自相關性,概率密度,頻譜,功率譜密度,三分之一倍頻程RTA等參量.對于上述參量,均值和方差的算法較簡單,可以直接在C++ Builder中編寫完成,無需進行混編; 計算其它參量則需要利用與上文相同的混合編程方法進行分析.以下具體說明對參量的分析.
1)自相關函數[7],代表信號與其延遲信號間的相似程度.自相關函數公式如下式:

當延遲時間t為0時,函數值最大,其值等于信號的能量.對于白噪,t為0時函數值等于強度P.Matlab中對應的函數為[y,lag]=xcorr(whitenoise,'unbiased'),lags為信號的延時或超前,信號的自相關性是相對于自身存在一定超前和滯后而言的.
2)概率密度函數[8],代表白噪在某一確定點出現的可能性.其公式如下:

高斯白噪聲的概率密度原理上服從正態分布,Matlab中對應的函數為[f,y]=ksdensity(whitenoise).
3)頻譜[9],頻譜分析又稱為FFT(傅里葉)變換,代表信號在不同頻率的能量分布.其公式如下:

在Matlab只需調用Y=abs(fft(whitenoise,nfft))函數即可實現復雜的fft算法,其中nfft是信號傅里葉變換采樣點數,其值越大結果越精確.
4)功率譜密度[10],代表每單位頻率波的功率.其公式如下:

白噪聲的功率譜與信號的自相關函數為傅里葉變換對,Matlab中對應的函數為[P,f]=periodogram (whitenoise,window,nfft,Fs),window為所加窗,Fs為采樣頻率.
5)三分之一倍頻程RTA,RTA是“Real TimeAnalysis”,實時分析.文章中計算信號在三分之一倍頻程段的能量分布,即對三十一個頻率點的有效值進行計算,其中需要用到傅里葉變換.
上述五個參量分析,所用的算法相對生成白噪的算法較復雜,若直接在C++ Builder中完成程序設計,所需的工作量相對混合編程會大很多,且準確度難以保證,進一步證實了混合編程在此次揚聲器功率實驗信號生成中的重大意義.
將經過混合編程生成信號最終用于實驗的測試信號,運行系統測得結果如圖5所示.

圖5 混合編程生成白噪的參量分析
為驗證信號的準確性,本文將混編生成的信號與國家標準[11]規定的噪聲信號進行對比并對其參量進行分析對比.首先將國家標準白噪信號保存為.wav文件;其次將該wav文件通過wavread函數讀取到Matlab中,并編寫與上文參量分析對應的m文件運行后,分析結果如圖6所示.
對比圖5與圖6參量分析結果,可通過以下幾點確定混合編程生成的白噪與標準信號特性相同,其可以作為揚聲器功率實驗測試信號.
1)信號的自相關函數在x=0處為沖擊函數,幅值等于強度p;
2)信號的概率密度函數服從正態分布;
3)信號頻譜在整個頻段內服從等帶寬頻帶所含噪聲能量相等;
4)信號的功率譜密度在整個頻段內均勻分布;
5)對數坐標中,信號的能量符合每倍頻程增加3dB.

圖6 國家標準中白噪聲參量分析
通過對MATLAB與C++的混合編程方法生成的白噪信號進行參量分析與驗證.可以看到: 使用混合編程方法生成揚聲器功率實驗測試信號過程中,Matlab可以既準確又容易生成信號,這樣彌補了C++ Builder在信號開發方面的不足; Matlab在對白噪各參量分析時,也充分發揮了其優勢; 混合編程可以彌補Matlab與C++ Builder兩者的不足,同時也可以將各自優勢很好結合.混合編程為揚聲器功率實驗測試信號的生成提供了一種新生成方法,具有一定的實際意義.
參考文獻
1盤書寶.一種基于FPGA的高斯噪聲源設計.桂林航天工業學院學報,2014,4:330–334.
2付俊,李光燦.一種高斯白噪聲信號發生器的設計與實現.計算機測量與控制,2012,5:1436–1438.
3李璞,趙地.Matlab與VC++混合編程技術在信號采集中的應用.計算機與網絡,2013,12:56–58.
4左明成,武云.VC++和MATLAB混合編程的新應用.計算機技術與發展,2014,12:15–20.
5羅伯特·J·希林,桑德拉·L·哈里斯.殷勤業,王文杰,鄧科等譯.數字信號處理導論——MATLAB實現.西安:西安交通大學出版社,2014.
6朱磊.MATLAB與C的對比研究.宜春學院學報,2012,4:49–50.
7岳曌.偽隨機序列的構造及其自相關函數分析[學位論文].西安:西安電子科技大學,2014.
8屈毅,穆麗寧,賴展翅.非高斯隨機分布系統自適應控制算法的研究.現代電子技術,2014,4:53–55.
9侯盼衛,楊錄,王建軍.基于FFT系數的正弦信號頻率估計算法.光電技術應用,2013,6:58–62.
10張曉勇,羅來源.參數未知的艦船輻射噪聲檢測方法.聲學學報,2015,4:511–518.
11GB/T12060.2-2011.聲系統設備第2部分:一般術語解釋和計算方法.北京:中國質檢出版社,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
收稿時間:①2015-08-13;收到修改稿時間:2015-10-08