采用MATLAB与C++混合编程生成扬声器功率实验信号①
2016-06-15周静雷董姣常诚李倩西安工程大学电子信息学院西安710048
周静雷,董姣,常诚,李倩(西安工程大学 电子信息学院,西安 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 信号生成
扬声器功率实验信号生成流程如图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的滤波器后将得到粉噪信号; 白噪信号通过模拟节目信号电路后将得到模拟节目信号,而粉噪及模拟节目信号都是扬声器功率实验中比不可少的测试信号.在应用中,由混合编程生成测试信号的应用范围也将会很广,不仅可以应用于扬声器功率实验,也可以在其它测试仪器中作为测试信号使用.
2 信号参量分析
针对生成的信号,文章计算分析了均值,方差,自相关性,概率密度,频谱,功率谱密度,三分之一倍频程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 混合编程生成白噪的参量分析
3 信号验证
为验证信号的准确性,本文将混编生成的信号与国家标准[11]规定的噪声信号进行对比并对其参量进行分析对比.首先将国家标准白噪信号保存为.wav文件;其次将该wav文件通过wavread函数读取到Matlab中,并编写与上文参量分析对应的m文件运行后,分析结果如图6所示.
对比图5与图6参量分析结果,可通过以下几点确定混合编程生成的白噪与标准信号特性相同,其可以作为扬声器功率实验测试信号.
1)信号的自相关函数在x=0处为冲击函数,幅值等于强度p;
2)信号的概率密度函数服从正态分布;
3)信号频谱在整个频段内服从等带宽频带所含噪声能量相等;
4)信号的功率谱密度在整个频段内均匀分布;
5)对数坐标中,信号的能量符合每倍频程增加3dB.
图6 国家标准中白噪声参量分析
4 结论
通过对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