2.设计原理2.1数字滤波器2.1.1 数字滤波器的原理简介数字滤波器的功能是把输入序列通过一定的运算,变换成输出序列。
数字滤波器一般可用两种方法实现:一种是根据描述数字滤波器的数学模型或信号流程图,用数字硬件构成专用的数字信号处理机,即硬件方式;另一种是编写滤波器运算程序,在计算机上运行,即软件方式。
考虑到软件的灵活性及易于实现,本文采用软件方式实现数字滤波器。
数字滤波器有无限冲激响应(IIR)和有限冲激响应(FIR)两种。
下面分别介绍:(1) IIR滤波器IIR滤波器的特点是:单位冲激响应h(n)是无限长的;系统函数H(z)在有限长Z平面(0<|Z|<∞)有极点存在;结构上存在输出到输入的反馈,也即结构上是递归型的;因果稳定的IIR滤波器其全部极点一定在单位圆内。
其系统函数为(1)计算机上实现时则需要用到差分方程的形式,如下(2)IIR滤波器有四种基本的网络结构(具体参看文献[3]),直接I型、直接II型、级联型与并联型。
其中直接I型需要2N个延迟单元,而直接II型只需要N个延迟单元。
因此,用软件实现时,直接II型少占用存储单元。
级联型则是将N阶IIR系统函数分解成二阶因式连乘积,并联型则是将系统函数化成部分分式之和,则可得到IIR数字滤波器的并联结构。
(2) FIR滤波器IIR滤波器的特点是:系统的单位冲激响应h(n)是个有限长序列;系统函数|H(z)|在|z|>0处收敛,极点全部在z=0处(即FIR一定为稳定系统);结构上主要是非递归结构,没有输出到输入反馈。
但有些结构中(例如频率抽样结构)也包含有反馈的递归部分。
其系统函数的一般形式为(3)对应的差分方程为(4)FIR系统的基本结构有直接型、级联型、快速卷积型、频率取样型等。
2.1.2 FIR与IIR滤波器的比较与选择IIR滤波器可以用比FIR滤波器少的阶数来满足相同的技术指标,这样,IIR滤波器所用的存储单元和所用的运算次数都比FIR滤波器少。
FIR滤波器可得到严格的相位,而IIR滤波器不能得到。
事实上,IIR滤波器的选频特性越好,它的相位的非线性就越严重。
因此在需要严格线性相位的情况下应该选择FIR滤波器。
IIR滤波器可利用模拟滤波器现成的设计公式、数据和表格,因而计算工作量较小,对计算工具要求不高。
FIR滤波器没有现在的设计公式,对计算工具要求较高,需要借助计算机来设计。
另外,IIR滤波器主要是设计规格化的、频率特性为分段常数的标准低通、高通、带通、带阻和全通滤波器,而FIR滤波器可设计出理想正交变换器、理想微分器、线性调频器等各种网络,适应性较广。
总之,IIR和FIR这两种滤波器各有特点,在实际应用中空间选择中哪种滤波器,就从多方面的因素来考虑。
例如用于语音通信的滤波器,对相位要求不是主要的,因此选用IIR滤波器较为合适,可以充分发挥其经济和高效的特点。
而图像信号处理和数据传输等以波形携带信息的系统,对相位的线性要求较高,因此采用FIR滤波器较好。
对于数字均衡器,一方面是用于处理语言信号,另一方面需要用到频率特性分段的带通滤波器,因此应该IIR滤波器。
下面介绍IIR滤波器的设计方法。
2.1.3 IIR数字滤波器的设计方法实际中的数字滤波器都是用有限精度算法实现的线性非移变离散系统,设计IIR数字滤波器的方法主要有两种:一种是利用模拟滤波器的理论来设计,另一种是计算机辅助设计,即使用最优化技术设计。
利用模拟滤波器的设计理论来设计IIR滤波器,就是首先根据实际要求设计一个模拟滤波器,然后再将这个模拟滤波器转换成数字滤波器。
由于模拟网络综合理论已经发展得很成熟,故许多常用的模拟滤波器不仅有了简单而严格的设计分式,而且设计参数已经表格化,所以设计起来很方便。
因此本文采用第一种方法。
设计步骤大致分以下三步:(1) 设计模拟滤波器。
根据实际需要确定滤波器的参数,利用的滤波器的设计公式设计出模拟滤波器并得到其传递函数H(s),常用的滤波器有巴特沃斯滤波器、椭圆滤波器和切比雪夫滤波器;(2) 将模拟滤波器转换成数字滤波器。
利用冲激响应不变法或双线性变法将H(s)转换成H(z),不同的设计方法对应于不同的s平面到z平面的映射公式;(3) 频率变换。
上述方法得到的是低通滤波器,为了得到高通、带通、带阻滤波器,还需要用利用变换公式作频率变换。
以上各步骤都有成熟的理论与公式,具体可参看文献[3]。
2.2均衡器的原理2.2.1 均衡器总体设计均衡器的基本功能是调节各频段的信号强弱,为了满足该功能,本文采用如下的方法:Step1:设计出对应八个频段的八个带通滤波器;Step2:对原始信号分八路用八个带通滤波器进行滤波;Step3:将八个滤波器的滤波结果加权求和,权值的设计与均衡器的调节要求一致。
这样最终得到的结果便是所需要的均衡结果。
其中第2步中各带通滤波器的输入信号均为原始信号,而不是“串联”地滤波。
设原始输入信号为x(n),第i路的输出信号为,第i路的权值为,均衡器的输出信号为y(n),则有(5)(6)式中,、为滤波器的参数,可由2.1.3节的方法得到,N为滤波器的阶数。
具体应用中,式(6)有两个问题,下节将介绍这两个问题并给出解决方法。
2.2.2 滤波计算的两个问题(1) 数组越界问题即当n<N时,如5阶滤波器处理第一个x时(n=1,N=5),则式(6)中的与会出现数组下标小于0。
对于声音信号,人的听觉不会感觉出很短时间的异常。
因此,可以简单地将数组越界的情况用0代替,即n<N时,规定。
这样只有前N个数字信号不准确,从而前N/Fs秒声音信号不准确,N一般不超过10,而Fs一般为44100,从而N/Fs很小,人的听觉根本不会感觉到。
(2) 溢出问题定点加法运算有可能发生溢出。
但是,在采用补码进行运算时,即使中间计算结果发生了溢出,但只要最终累加值的绝对值小于1,就能保证最后得到的总和是正确数值。
因此,为防止数字滤波器定点运算产生溢出, y(n)绝对值小于1就够了。
一种解决方式是针对输入x。
对于IIR滤波器,有(7)由不溢出的条件得(8)即,当(8)式不满足时,需要对输入信号x(n)乘以一个小于1的比例因子,使得(8)式恰好满足。
比例因子的计算式易由(8)式推出。
为简单起见,本文采用针对输出的解决方式,即如果y(n)绝对值超过1,则对其赋值为1或,符号选择取决于原值的符号。
2.3软件设计2.3.1 数据流图数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换。
在数据流图中没有任何具体的物理元素,它只是描绘信息在软件中流动和被处理的情况。
设计数据流图时只需考虑系统必须完成的基本逻辑功能,而不用考虑具体实现,因而它是进行软件设计很好的出发点。
面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。
结合上一节的内容,可以得出软件的数据流图如图 2所示。
图2 均衡器的数据流图2.3.2 模块划分模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户需求。
根据人类解决一般问题的经验,如果一个问题由两个问题组合而成,那么它的复杂程度大于分别考虑每个问题时的复杂程度之和,也就是说把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。
这就是模块化的根据。
在模块划分时应遵循如下规则[4]:改进软件结构提高模块独立性;模块规模应该适中;深度、宽度、扇出和扇入都应适当;模块的作用域应该在控制域之内;力争降低模块接口的复杂程度;设计单入口单出口的模块;模块功能应该可以预测。
本着上述的启发式规则,对软件进行如图 3所示的模块划分。
图3数字均衡器的模块划分3.软件实现3.1界面设计MATLAB是Mathworks公司推出的数学软件,它将数值分析、矩阵计算、信号处理和图形显示结合在一起,为众多学科领域提供了一种简洁、高效的编程工具。
它提供的GUIDE工具为可视化编程工具,使得软件的界面设计像VB 一样方便。
故本文采用MATLAB作为主要编程语言实现数字均衡器。
为了实现预期的功能,设计如图 4所示的界面。
图4频谱分析仪的界面设计左边最上面的部分为标题区,用于显示软件标题等信息,不具人机交互功能。
再往下是信号输入/输出区,包含3种输入方式。
界面应该具有:只有当每个单选框被选中时才允许使用对应的输入框、按钮等。
支持WAV和AU两种格式的音频文件。
“原声播放”用于播放输入的原信频信号,区别于滤波后的信号,用于对比滤波前后的信号。
再往下是均衡器区。
八个滚动条对应八个带通滤波器的权值,在中间时为1,最下为0,最上为10。
“类型”单选框用于选择巴特沃斯、切比雪夫等各种类型IIR滤波器。
“重置”用于将各输入恢复默认。
“滤波”后才能“播放”,这是考虑到MATLAB对多线程机制支持得不好,不宜使用一边滤波一边播放的方法。
由于滤波时间较长,故添加了进度显示的功能。
条形图是许多音频软件使用的频谱输出方式。
右边的上面是滤波器,可以指定各种类型与参数。
“生成滤波器”可以产生一个符合条件的滤波器,并在下面的图中显示滤波器的频率特征曲线。
“滤波”用于对输入的音频信号用生成的滤波器滤波。
再往下则分别是时域波形与频谱分析的图形显示,均为实时显示。
在界面设计时为避免错误的操作,在某些按钮不能使用时必须将其设置为不可用,而它们能够使用时立即设置为可用。
例如,没有打开音频文件时“滤波”按钮不可用,打开后“滤波”按钮可用;点击“滤波”前,“播放”不可用,点击“滤波”并完成滤波后,“播放”则变为可用。
3.2均衡器模块的实现均衡器模块功能是生成带通滤波器并对原信号滤波。
为了便于程序的扩充与修改,将表 1中的频段数据独立出来,如下handles.fband=[20 100 200 500 1000 2000 4000 8000 16000];均衡器的功能主要在“滤波”按钮的回调函数中实现,下面具体介绍开始需要得到滤波器的参数:频带与阶数,如下order=str2double(get(handles.order,'String'));num=8;%8 filters totallyfband=handles.fband;接着就是产生滤波器并滤波了,每次滤波后产生的y i(n)如果都存到一个变量中,则需要8个这样的变量,对于输入信号量很大时将需要大量的内存空间,为此,本文采用累加的方式,这样只用一个变量去存储滤波结果。
nn=length(handles.y);handles.yy=zeros(size(handles.y));for i=1:numif get(handles.butterworth,'Value')==1[b a]=butter(order,2*fband(i:i+1)/handles.Fs);elseif get(handles.cheby1,'Value')==1[b a]=cheby1(order,0.5,2*fband(i:i+1)/handles.Fs);elseif get(handles.cheby2,'Value')==1[b a]=cheby2(order,20,2*fband(i:i+1)/handles.Fs);elseif get(handles.ellip,'Value')==1[b a]=ellip(order,0.5,20,2*fband(i:i+1)/handles.Fs);elseerrordlg('No filter type chosen or filter type error!');endeval(sprintf('k=get(handles.band%d,''Value'');',i));y=(9^k-1)/8*qfilter(b,a,handles.y);handles.yy=handles.yy+y;endguidata(hObject,handles);在程序中有一句y=(9^k-1)/8*qfilter(b,a,handles.y),作用是加权以便下一句的求和,其中k是从滚动条中得到的参数,从0到2,但需要的权值是从0到10,令w为需要的权,即,由于实际需要w为指数变化,故设(9)代入w=0, k=0; w=1, k=1; w=10, k=2解得a=1/8,b=9,,从而有上述代码。