IIR滤波器

IIR滤波器定义

IIR(infinite impulse response)滤波器,无限冲击响应滤波器,IIR滤波器定义如下,
∑ l = 0 N a ( l ) y ( n − l ) = ∑ k = 0 M b ( k ) x ( n − k ) \sum_{l=0}^{N}a(l)y(n-l)=\sum_{k=0}^{M}b(k)x(n-k) l=0Na(l)y(nl)=k=0Mb(k)x(nk)
a ( 0 ) = 1 a(0) = 1 a(0)=1, a ( l ) , l = 1 , 2 , . . . N a(l),l=1,2,...N a(l),l=1,2,...N取反后得,
y ( n ) = ∑ k = 0 M b ( k ) x ( n − k ) + ∑ l = 1 N a ( l ) y ( n − l ) y(n)=\sum_{k=0}^{M}b(k)x(n-k) +\sum_{l=1}^{N}a(l)y(n-l) y(n)=k=0Mb(k)x(nk)+l=1Na(l)y(nl)

滤波器结构图

直接I型滤波器

用个例子来说明,令 N = M = 3 N=M=3 N=M=3
y ( n ) = ∑ l = 1 3 a ( l ) y ( n − l ) + ∑ k = 0 3 b ( k ) x ( n − k ) y(n)=\sum_{l=1}^{3}a(l)y(n-l) + \sum_{k=0}^{3}b(k)x(n-k) y(n)=l=13a(l)y(nl)+k=03b(k)x(nk)
直接I型结构图,
在这里插入图片描述
用滤波器的系统函数表示为,
y ( h ) = h ( n ) ∗ x ( n ) y(h)=h(n) * x(n) y(h)=h(n)x(n)

同时做 z z z变换后,系统函数为,
H ( z ) = ∑ k = 0 M b ( k ) z − k 1 − ∑ l = 1 N a ( l ) z − l = B ( z ) A ( z ) H(z)=\frac{\sum_{k=0}^{M}b(k)z^{-k}}{1 - \sum_{l=1}^{N}a(l)z^{-l}}=\frac{B(z)}{A(z)} H(z)=1l=1Na(l)zlk=0Mb(k)zk=A(z)B(z)
从结构图中可以看出,在程序实现时,需要 2 ( N − 1 ) 2(N-1) 2(N1)个缓存。

直接II型滤波器

可以看出 B ( z ) B(z) B(z)对应的就是直接I型结构图中的蓝色区域, A ( z ) A(z) A(z)对应的就是粉色区域,从系统函数出发,调换其中 B ( z ) B(z) B(z) A ( z ) A(z) A(z)的顺序,
H ( z ) = B ( z ) 1 A ( z ) = 1 A ( z ) B ( z ) H(z)=B(z)\frac{1}{A(z)}=\frac{1}{A(z)}B(z) H(z)=B(z)A(z)1=A(z)1B(z)
调换顺序后的结构图可以看到中间一部分共有操作可以合并,合并后的结构图为直接II型结构图。
在这里插入图片描述
从直接II型结构图中可以看出,在程序实现时,只要 ( N − 1 ) (N-1) (N1)个缓存,比直接I型减少了(N-1)个缓存。

程序仿真

直接I型结构一阶IIR

load('HighPass50HzFs16k.mat')
fs = 16000;
data = rand(fs,1);
data_out1 = zeros(size(data));
data_out2 = zeros(size(data));
b0 = SOS(1);
b1 = SOS(2);
b2 = SOS(3);
a1 = SOS(5);
a2 = SOS(6);
x1=0; x2=0; y1=0; y2=0;
[bb,aa] = sos2tf(SOS,G);
data_out0 = filter(bb,aa,data);
for i = 1:length(data)
    x0 = data(i);
    y0 = (x0 * b0 + x1 * b1 + x2 * b2) * G(1) ...
          - y1 * a1 - y2 * a2;
    data_out1(i) = y0;
    x2 = x1;
    x1 = x0;
    y2 = y1;
    y1 = y0;
end

直接II型结构一阶IIR

s1 = 0; s2 = 0;
for i = 1:length(data)
    s0 = data(i) - a1 * s1 - a2 *s2;
    y0 = (s0 * b0 + s1 * b1 + s2 * b2) * G(1);
    data_out2(i) = y0;
    s2 = s1;
    s1 = s0;
end

代码链接
https://github.com/myuzhao/SpeechEnhance/blob/main/iir/iir.m

参考

胡广书. 数字信号处理: 理论, 算法与实现[M]. 清华大学出版社有限公司, 2005.
http://ece.uccs.edu/~mwickert/ece2610/lecture_notes/ece2610_chap8.pdf

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值