鲁晓东,纪玉川
(1.浙江海洋大学东海科学技术学院,浙江舟山 316000;2.舟山市海大科学技术研究院,浙江舟山 316000)
Matlab 由于其强大的计算和绘图功能,在工程领域中常被用于各种设计方案、处理算法的仿真[1-2],以简化计算过程,提高工作效率。同时Matlab 对硬件的支持[3]也是可圈可点的,例如Matlab 的数据采集工具箱(DAQ)就包含了市面上的各种数据采集卡驱动。由于它是通过自身的MEX 工具包调用操作系统的底层API 去驱动计算机的外设,对用户来说可以不必深究硬件如何工作,仅调用工具包的相关函数就能获取外部传感器的数据。所以Matlab 也非常适合于信号的实时处理[4-5],例如在嵌入式开发前期,硬件系统并未建立完善,当需知某种处理方法在设计的系统中是否有效,可以直接借助PC 机上的Matlab 对该算法进行验证,因为系统处理的是真实信号,只是算法在不同的平台进行实现而已,所以仿真的结果几近于实际效果。
DAQ(Data AcQuisition)是Matlab的数据采集工具箱,该工具箱由3个部分组成:功能函数.m文件、DAQ引擎和硬件驱动程序。为了方便用户的使用,Matlab对其内部的DAQ 底层驱动作了函数的封装,通过调用这些函数便可完成设备数据的采集。由于Matlab包含当前市面上多数的硬件驱动,因此,其DAQ 有较好的兼容性,而用户使用时感觉不到驱动的存在,只须调用函数就可直接控制设备[6]。例如要完成的是对音频实时信号的处理,使用系统集成的声卡作为DAQ 设备,Matlab 对声卡的功能封装如图1 所示,Matlab 通过实例化一个audio Device Reader 对象,设置对象的属性并使用对象提供的方法驱动声卡工作以获得数据。Matlab应用的基本方法可以描述为:
图1 音频数据采集卡功能结构
1)创建音频采集卡DAQ 设备对象
MyDaq=audio Device Reader,
其中,audio Device Reader 是Matlab 实例化系统音频卡的功能模块,MyDaq 即为设备对象的句柄。
2)设置DAQ 对象的属性参数
属性参数主要包括采集卡工作时数据帧的帧缓冲大小、采样率、通道数、采样点数据类型等,属性值可以根据系统工作的需要进行设置。例如:
MyDaq.Samples PerFrame=44100//采样率MyDaq.Num Channels=2//通道数为2
MyDaq.BitDepth=′16-bit integer′//16 位整数
3)数据的采集控制
使用audio Device Reader对象的record 或step 方法,就可以读取音频采集卡中缓冲区里的数据。缓冲区一般存放一帧的数据,软件读取的间隔一般都远慢于硬件的采样。所以会产生溢出,读取的是缓冲区最后一帧数据。
[x,numOverrun]=record(MyDaq)//record 在MyDaq读取数据并存放在x,返回帧溢出数numOverrun。
4)释放内存
release(MyDaq);//释放该采集卡MyDaq 所占用的内存资源。
以一个在实际环境中常见的反射信号的处理为例。通过Matlab 提供的信号处理工具计算其反射混响的时间参数,对其滤波并消除该反射信号。
不妨设x1(n)为信号源信号,经过某终端产生一系列衰减系数为αk延迟nk的反射信号,它与原信号叠加后的波形为:
x(n)可看成x1(n)与冲激串∑δ(n-nk)的卷积,令h(n)=δ(n)+α1δ(n-n1)+…+αkδ(n-nk),则式(1)可以改写为:
h(n)实际上就是信道的冲激响应。若想从x(n)中分离出x1(n),就必须知道h(n) 的相关信息,才可以对式(1)作反卷积或解差分方程。由于混响信号的特点是自身信号的延时叠加,所以可以借助信号的倒谱来观测h的延时参数nk。先把式(2)变换到z域:
两边取对数得到:
所以对于延迟nk个序列的反射信号一定在倒谱上的第nk个序列值有一个峰值,因为此时的卷积值取得极值。通过寻找数值的峰值便可以确定延迟的参数nk,从而确定了式(1)所表达的差分方程。设仅存在一个反射波混合信号,利用Matlab 提供的滤波器函数filter(b,a,x)求解该差分方程,可以解算出原始信号x(n) 。基本步骤如下:
1)用倒谱函数rceps 计算出混合信号的倒谱序列。
cepsig=rceps(xecho);//xecho为混合时域信号,cepsig 为倒谱序列。
2)用findpeaks()检索倒谱的峰值,确定反射信号的延迟参数delay。
[px,nk]=findpeaks(cepsig,′ Threshold′,0.01,′ Min PeakDistance′,10);
delay=nk(2)-1;
函数findpeaks()将在倒谱cepsig 中寻找峰值,并返回峰值的序列位置nk以及相应峰值px。参数MinPeakDistance 是设置检峰的最小时间尺度,用于过滤噪声干扰。Threshold 则是设置各峰值必须与相邻数据点的差值。这两个参数会影响检测的结果,操作中可以根据实际进行调整。倒谱序列的峰值在第二个即为反射序列出现的位置,因第一个位置nk(1)一定为1,延时为0,所以第二个位置nk(2)的延时要进行减1 调整。
3)用filter()函数解算差分方程并求得原信号。根据filter(b,a,x)函数的时域表达式[8]:
可确定存在一个反射信号的混响信号x(n)=x1(n)+αkx1(n-nk)的a,b参数。用Matlab描述为:
为提高编程效率,采用Matlab GUI 方式[9]建立信号处理的控制界面如图3 所示。在面板上布置4 个AXES(图形坐标系)对象即程序中的signalraw、fsignalraw、cepstrum、firsignal,分别用于显示信道信号、信号的频谱、倒谱、以及滤波后的信号。右边是滤波器控制面板、信号采集控制的按钮等,用于实现对各控件函数的回调。
处理控制主要是完成信号的实时处理和数据的可视化处理。在建立采集卡对象后,便可以操作该对象提供的DAQ函数,完成数据的采集、处理与显示。
1)初始化DAQ 对象和图形对象
以下是数据可视化图形句柄初始化:
2)实时处理
由于Matlab 是一种单线程的应用程序,因此控制脚本使用了循环结构,用循环结构中的各条件变量决定信号处理的流程和方式,如图2 所示。
图2 信号处理流程结构
这是人机对话的控制处理,主要完成数据采集的启动、停止以及滤波器的设置。控制的内容都是实时处理脚本中的一些参数,如启动、停止的flag 变量,flag 为1 则while 中不断采集数据并处理;选择是否需要手动改变滤波系数[b,a],设置的变量是default,当default为0则系统自动估算滤波参数,否则在面板上手动调节截止频率,并定义处理的函数filter_set()计算调节后相应的参数。
用一个拾音器采集一个音频信号,并给于一定的回声效果,时延约为0.05 s,通过声卡的A/D 转换,在Matlab 上得到波形如图3(a)所示,同时可以看到其频谱如图3(b)所示,在频谱中看不到回声延迟的特征,但可以把它转为倒谱如图3(c)所示,可以看出在原点和0.043 处各有一个峰值,原点是信号本身,而第二个就是延时的信号。经过滤波得到信号的恢复与测试的原始信号作对比,如图3(d)所示,效果是比较理想的。这个过程也可以通过界面上的滤波器手动设置来实现,信号处理结果也可实时显示[10-17]。
图3 实时处理结果
从上述处理过程可见,利用Matlab 进行信号的实时处理非常方便,主要表现在其对硬件良好的兼容性,使用户不必去关注硬件的驱动,只需关心软件的算法效果。而且它封装了大量的工具函数,便于计算和调试,可以提高实现处理的效率。值得注意的是Matlab 是一种解释性的语言,当有多路信号同时要求处理时,Matlab 的这种循环结构的编程方式会降低效率,实时性就不那么理想,但是其作为一种对实时处理算法的有效性检验手段是非常值得应用的。