Matlab与VC++混合编程实现黑匣子声谱分析
Black-box sound spectrum analysis based on VC++ and MATLAB Mixed—Programming
摘要:MATLAB作为一个功能强大的数值计算和可视化软件,被VC++、VB及其它语言编制的程序调用将大大提高编程效率、保证程序的准确性,并且继承VC++等软件良好的用户界面.本文介绍了通过利用MathTools公司的Matcom,实现在VC++环境下通过调用工具箱函数及自编m 函数,完成对工程信号实时、可视化分析功能,并以舱音背景声中超速音频警告声为例,实现在专用音频分析软件Adobe Audition界面下实时分析,为提取舱音背景声特征提供了很大的方便.
关键词:Matcom编译器;舱音记录器;黑匣子;谱分析
Abstract:MATLAB is a powerful visual software for numerical value calculation.It will significantly raise the programming efficiency and ensure program accuracy when MATLAB program is called by other languages,such as VC++,VB.This article introduces how to call the toolbox functions and self-programmed m functions of MATLAB in VC++ compiler platform through Matcom compiler from MathTools, which successfully applies in zooming analysis of over speed warning’s audio characters Recorded by Airplane Cockpit Voice Recorder .This provides enormous convenience for special-purpose audio frequency analysis software Adobe
Audition to real-time analyze and withdrew the cabin background audio Characteristics.
Keywords: Matcom compiler;Cockpit voice recorder(CVR); black-box;;spectrum analysis
1 前言
MATLAB作为一个强大的数学分析应用工具.它简洁而丰富的函数资源,为用户提供了很多的现代信号处理工具包,同时给用户带来最直观的开发环境,但仍存在一些不足:MATLAB在执行效率和对程序编写的一些局限,使得采用MATLAB语言编制的应用程序不能直接为音频分析软件Adobe Audition 所利用.Visual C++是Microsoft公司推出的可视化编程语言,是目前最强大的综合性软件开发工具之一,应用极为广泛. 如果把MATLAB与Visual C++很好地结合起来,将大大提高编程工作的效率.因此,基于混合编程思想开发出一种具有多种信号分析功能又能适应嵌入到Adobe Audition音频分析软件的信号分析软件,对于实现实时音频特征分析具有重要的应用价值。
本文就是为了完善Adobe Audition的音频信号分析模块而提出的, 在充分掌握适用于舱音背景声谱特征细化分析方法的基础上,采用混合编程方法扩展信号分析功能,既利用VC实现动态的、交互式的、高效率的用户界面,又充分利用MATLAB强大的信号分析功能和图形处理功能,将使原系统软件部分更加完善,达到功能模块化、软件智能化、接口开放化的目的.该研究结果将会在专门的音频分析软件Adobe Audition中有很方便的应用。
2 VC++下利用MATLAB工具箱进行信号处理的方法
MATLAB 的信号处理工具箱是信号算法文件的集合,处理的基本对象是信号与系统,信号处理工具箱位于目录MATLAB\Toolbox\Signal下,利用工具箱中的文件可以实现信号的变换、滤波、谱估计、滤波器设计等.如果能在其它的环境,如VC++下调用MATLAB 工具箱中的文件,则会大大地加快一些算法的实现,同时其可靠性也很高.
2.1 几种混合编程方法的比较
混合编程有几种结合方法:① 首先在Matlab下编写.m 文件,后通过Matlab自身的编译连接器把.m文件转换成C++代码,并嵌入到VC++程序中;② 通过客户一服务器方式,在VC+ + 中使用Matlab服务引擎,通过引擎调用Matlab中的函数 ;③ 在VC+ + 中包含Matlab中的数学函数库,使用数学函数库中的特定函数;④ 利用Matcom 实现Matlab与Visual C++混合编程.其中方法① 、② 都不能脱离Matlab环境,方法③ 则需要用lib/def命令导出libmx.1ib,libeng.1ib以及libmccmx.1ib等静态连接文件,且这3种方法都不能有效地提高程序的执行效率.方法④ 可将Matlab的源代码译成同等功能的c++源代码,既保持了Matlab的优良算法,又保持了c++的高执行效率。本文也是采用了方法④.
2.2 Matcom 的应用
(1)利用Matcom生成独立执行的exe文件.在MATLAB中虽然可以由M文件生成执行程序,但是它无法脱离MATLAB环境的支持。利用Matcom则可以生成不需要MATLAB环境支持的exe文件.在运行Matcom后,打开你所需要编译的M文件,在file菜单下有compile to exe,Matcom便自动完成exe文件的编译与连接。编译完成以后,可以在matcom45\debug目录下找到与M文件同名的exe文件。
(2)利用Matcom生成动态链接库(DLL)文件.这一项功能针对VC开发,生成的方式如同exe文件生成的方式。生成DLL文件的同时也生成CPP文件,但是DLL文件使用不方便。这里直接使用CPP文件,该CPP文件同样在mateom45\debug目录下。
2.3 修改Visual C++源文件
(1)在Visual C++源文件的头文件处应包含matlib.h。
(2)在调用到由M文件转换成VC++的代码时需在VisualC++源文件中加入如下语句:
initM(MATCOM VERS1ON);//初始化matcom库
⋯ ⋯ ⋯ //转换成功的c++的代码
exitM();//退出matcom库的调用
return ;
以上两点都是必须的,当然也可以在“转换成功的c++的代码”处加入c++的程序,以增强matlab对复杂数据处理的能力。
3 应用举例
下面仅以实现超音速警告声频谱的细化分析的函数为例,说明如何利用Matcom实现Matlab和VC++混合编程。
3.1 在MATLAB环境下编写.m功能函数
该函数利用z变换是实现对超音速警告声频谱的细化分析,具体代码如下:
function zz()
……
%用线性调频Z变换(CZT)细化频率
M=1000 %变换长度-输出点数
f0=2500; %起始频率
DELf=1; %频率步长
A=exp(j*2*pi*f0/fs) %确定变换起点
W=exp(-j*2*pi*DELf/fs) %确定变换的步长
Y3=czt(sig,M,W,A); %调用CZT变换
n2=f0:DELf:f0+(M-1)*DELf; %实际计算长度调用CZT变换
subplot(313);
plot(n2,abs(Y3));grid on;
xlabel('f/Hz');
ylabel('|X(ejω)|');
Y3=abs(Y3);
Y3=Y3';
3.2 利用Mideva来生成可被VC调用的信号处理程序
Matcom 编译M 文件时,先将M 文件按照与Matcom的cpp库的对应关系翻译为cpp源代码,然后将对应版本的C编译器将cpp文件编译成相应的exe或dll文件,所以第一次运行要指定C编译器的路径,否则无法编译,指定好的编译信息就写在Matcom\bin\matcom.ini文件中,matcom4.5版中使用TeeChart3.0 OCX控件, 因而支持图形操作.依然用上述的testwin.m文件,不要将图形函数注释掉,运行Mideva,在主界面上打开M 文件,在菜单中选择run,输入zz.m.在Matcom\debug 目录下可以找到zz.C, zz.h,zz.cpp,zz.1ib,zz.dll,zz.exp等,可见利用Matcom进行M 文件转换非常容易,生成的代码可读性很好,以上的转换同时生成了可供VC调用的动态链接库,其使用方法和一般的动态库一样. 同时需指明Matcom 不仅可转换独立的不依赖于其它M 文件的M 文件, 同时可转换调用其它M文件的M文件嵌套,条件是这些M 文件在同一个目录下面。
3.3 VC++环境下对功能函数的调用(以线性Z变换频谱特征细化分析为例)
在菜单中,选择project/add to project/files,将上述zz.cpp和zz.h加入工程中,并且将相应的文件加入stdafx.h中,并添加链接库文件:在Tools\option\directory中选include,加入e:\matcom45.1ib (包含matcom.h),选library选项,加入e:\matcom45.1ib.
在菜单中,选择project/add to project/files,在文件类型选项,选(.1ib),将e:\matcom45.1ib v4501.1ib加入工程中编译运行.添加相应实现代码如下:
(1)将各舱音分析方法添加到列表中,方便用户通过选择不同的分析方法,对舱音样本进行相关的分析。
BOOL CMethodDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_lstName.AddString("sig时频分析");
……
m_lstName.AddString("线性调频Z变换频谱特征细化");调试执行结果显示如图1所示。
图1
(2)添加消息响应函数代码:(略)
选择“显示分析结果”按钮,并添加对应的响应函数,可以得到如下分析结果,如图2、图3所示:
图2(波形图) 图3(原始谱图(a)和放大谱图(b))
4 结语
利用Matcom进行转换代码非常方便,并且生成的代码可读性很好,支持图形函数,且代码执行的速度比不转换平均提高1.5倍以上.文中所列出的程序在Visual C++ 6.0,MATLAB6.5,Matcom4.5 下面调试通过。以上方法在工程实践中已得到了很好的运用,并为以后在专用声音音频分析软件Adobe Audition界面下实现对舱音样本的实时分析、提取舱音背景声特征,提供了极大的方便.
本文作者创新点:通过上面的介绍,成功的应用Matcom进行转换代码,实现了在VC++环境中,对MatLab下的利用z变换实现对超音速警告声频谱的细化分析函数进行调用,为在专用声音音频分析软件Adobe Audition界面下,对舱音样本的实时分析、提取舱音背景声特征,提供了极大的方便.
参考文献
[1] MichaeI J.Young著,邱仲潘等译.Visual C++6从入门到精通[M].北京:中国电子工业出版社,1999.
[2] 丁 洲,苏兰兰 VisualC++与MATLAB混合编程在数字信号处理中的应用,机电设备 ,2004年(6)
[3] 王正祥,刘载文,杨斌,薛福霞 MATLAB6.5与VB混合编程中的接口技术研究,微计算机信息,2006,10-1:187-189
[4] 张承文,袁中凡 MATLAB与VC相融合技术的研究及其应用, 计算机工程与应用,2004(35).
作者简介:
郭海荣 女,硕士研究生,主要研究方向:计算机软件开发和信号分析。
通讯地址:山东青岛市抚顺路11号256信箱(邮政编码:266033)
程道来 男,高级工程师.主要研究方向:振动信号和声信号的计算机分析和处理.
梁祖峰 男,博士研究生。主要研究方向:机电一体化
林海波 男,硕士,主要从事计算机系统开发。
刘志红 女,硕士,主要从事振动与噪声研究。