电子说
MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的滤波器设计工具箱为实现声音信号的数字滤波提供了十分方便的函数和命令,但MAT-LAB的计算速度慢。Visual C++是Windows平台下主要的应用程序开发环境之一,它能方便实现软件开发,开发的系统具有执行速度快等优点,故MATLAB与VC的混合编程正好结合了MATLAB强大的工具箱与VC很快的执行速度。本文结合两者的优势,基于MATLAB与VC混合编程的方法设计出一种实用的数字均衡器。
根据数字滤波器冲激响应的时域特性的比较, FIR数字滤波器优点是对有限字长效应不敏感,严格线性相位;但是实现同样指标,所需计算量远大于IIR滤波器。
为了说明两种滤波器的设计方法,本设计中在数字滤波器部分使用FIR方法,而在均衡器部分使用IIR的方法分别进行设计。
1)用窗函数法设计FIR滤波器
根据过渡带宽及阻带衰减要求,选择窗函数的类型并估计窗口长度N (或阶数M=N-1),窗函数类型可根据最小阻带衰减As独立选择, 因为窗口长度N对最小阻带衰减As没有影响,在确定窗函数类型以后,可根据过渡带宽小于给定指标确定所拟用的窗函数的窗口长度N,设待求滤波器的过渡带宽为△w,它与窗口长度N近似成反比,窗函数类型确定后,其计算公式也确定了,不过这些公式是近似的,得出的窗口长度还要在计算中逐步修正,原则是在保证阻带衰减满足要求的情况下,尽量选择较小的N,在N和窗函数类型确定后,即可调用MATLAB中的窗函数求出窗函数wd (n)。
根据待求滤波器的理想频率响应求出理想单位脉冲响应hd(n),如果给出待求滤波器频率应为Hd,则理想的单位脉冲响应可以用下面的傅里叶反变换式求出:
2)用双线性变换法设计IIR滤波器
式(2)与式(3)是S平面与Z平面之间的单值映射关系,这种变换都是两个线性函数之比,因此称为双线性变换。
对于IIR数字滤波器的设计具体步骤如下:
(1)按照一定的规则将给出的数字滤波器的技术指标转换为模拟低通滤波器的技术指标。
(2)根据转换后的技术指标设计模拟低通滤波器G(s)(G(s)是 低通滤波器的传递函数)。
(3)再按照一定的规则将G(s)转换成H(z)(H(z)是数字滤波器的传递函数)。若设计的数字滤波器是低通的,上述的过程可以结束,若设计的是高通、带通或者是带阻滤波器,那么还需要下面的步骤:
将高通、带通或带阻数字滤波器的技术指标转换为低通模拟滤波器的技术指标, 然后设计出低通G(s),再将G(s)转换为H(z)。
Matlab信号工具箱提供了几个直接设计IIR数字滤波器的函数,直接调用这些函数就可以很方便地对滤波器进行设计。这里选取巴特沃斯法、切比雪夫I、切比雪夫II、 椭圆法四种方法进行比较。
在模块划分时应遵循如下规则:改进软件结构提高模块独立性;模块规模应该适中;深度、宽度、扇出和扇入都应适当;模块的作用域应该在控制域之内;力争降低模块接口的复杂程度; 设计单入口单出口的模块;模块功能应该可以预测。本着上述的启发式规则,对软件进行如图1所示的模块划分。
MATLAB提供的GUIDE工具为可视化编程工具,使得软件的界面设计像VB一样方便。为了实现预期的功能,设计如图2所示的界面。
MATLAB中提供filter 函数,但是在这里我们采用VC实现filter函数,用来提高运算速度。具体步骤为:(1)MATLAB中运行mex -setup将VC选作编译器;(2)在VC中新建一个DLL工程,添加如下代码:
(3)保存为qfilter.cpp,放在MATLAB工作目录,在MAT-LAB中运行mexqfilter.cpp生成qfilter.dll。这样,只需调用qfilter函数即能实现滤波。
理想的滤波器是不存在的,实际中只能尽量地接近理想滤波器,所以只能尽量地去接近理想的滤波器。对于IIR数字滤波器,阶数越高,则滤波器的精度越高,即越接近于理想的情况,但计算机运行速度就越慢了,所以实际中应该权衡运行速度与滤波器的精度。另外,计算机本身也有误差(如截断误差),但相对于滤波器的设计误差,可以忽略不计。故提高精度关键在于提高滤波器的设计精度。
另外,每个带通滤波器之间的过渡也有设计误差,理论上带通滤波器间的过滤应该满足各滤波器的频率响应曲线叠加起来为一条值为1的水平线,但实际中只能尽量去接近理论的情况。
全部0条评论
快来发表一下你的评论吧 !