下面程序iir_comb1.m同样利用名为filter的内置函数。这个程序实现的是图10.2所示框图下面图,给出的是图10.8所示的IIR梳状滤波器的响应。输入变量和前面一样(x是输入矢量,R是期望的时间延迟采样数),α现在是反馈系数α。第4、5行保证A系数矢量的长度和值正确(注意α需要标号)。第7、8行正确设定B矢量。如果要实现如图10.2所示上面的框图给出的IIR梳状滤波器,就像第9行注释所述的那样,把第7行变成注释行,把第8行改成“B=1”。
程序清单10.3:一个Matlab的IIR梳状滤波器的例子
下一个程序iir_comb2.m是同一个滤波器,但更接近C语言代码并具有同样输入变量。该程序用“直接I型”(见图4.14)实现滤波器。
程序清单10.4:一个接近于C语言的Matlab的IIR梳状滤波器的例子,使用直接形式
同样使用“for loop”模拟逐个到来的采样,从而处理整个输入矢量x的所有采样。(www.xing528.com)
这个滤波器是从框图得到的(而不是根据传递函数得到),所以α的值不需要负号表示反馈(第16行)。给出的代码实现如图10.2所示下面框图给出的IIR梳状滤波器。要实现如图10.2所示上面框图给出的IIR梳状滤波器,只需修改第16行,这样bufferx的索引为newest而不是oldest。
虽然,直接Ⅰ型滤波器的实现可以很容易从差分方程或传递函数得到,但是这个滤波器的主要缺陷在于需要两个缓冲器(同前文一样是循环缓冲器):一个缓冲器用来保存延迟的x值,一个用来保存延迟的y值。可以用与图4.16所示相类似的直接Ⅱ型实现来克服这个缺陷。下面的iir_comb3.m为直接Ⅱ型实现程序。
程序清单10.5:一个接近于C语言的MATLAB的IIR梳状滤波器的例子,使用直接Ⅱ型
可以使用程序demo_iir_comb3.m读入WAV音频文件(比如读test_signals目录下的文件),运行梳状滤波器并播放结果。参考表10.1对不同值进行实验,特别是延迟值。同样地,给出的代码实现如图10.2所示下面框图给出的IIR梳状滤波器。要实现如图10.2所示上面框图给出的IIR梳状滤波器,只需修改第15行,将buffer的索引从oldest改成newest。
注意,上面使用循环缓冲器和“for loops”的所有滤波器都比使用内置Matlab filter命令的滤波器运行要快。filter命令很通用,因而没有针对具体应用进行优化。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。