在 Matlab 中手动加窗 IIR 滤波器

信息处理 matlab 过滤器 无限脉冲响应
2022-02-14 06:27:10

我目前正在尝试对模拟 IIR 滤波器进行窗口化以获得 FIR 滤波器。虽然我意识到 matlab 中存在 fir1 函数,但我想知道是否可以逐步完成以产生 0 Hz 的陷波滤波器以消除系统中的任何直流增益。但是,我很快意识到我可能不知道自己在做什么 :)

首先,我创建了一个包含我正在寻找的特征的巴特沃斯过滤器,只是为了进行比较。一旦创建了 Chebyshev II 模拟滤波器,就可以查看幅度和相位响应。它没有显示 0 Hz 的带阻,但我的猜测是因为它还没有被窗口化来显示这个结果?我也不太确定如何组合窗口和模拟滤波器,如果有人指出我正确的方向,我会喜欢它:(

Fs = 250;
n = 5; 
Rs = 40; 
Wn = [0.1*2/Fs, 0.2*2/Fs];
[b0,a0] = butter(3,Wn,'stop');
[b1,a1] = cheby2(n,Rs,Wn,'stop','s');
freqz(b0, a0, 4096, Fs);
w = triang(250);  
y = filter(b1,a1,w);
2个回答

在数字滤波器的经典世界中,无限脉冲响应 (IIR) 滤波器用于计算效率,同时与有限脉冲响应 (FIR) 滤波器相比具有最高性能。

通常,IIR 滤波器的实现发生在时域中,具有直接形式-I、II 或其他形式的架构,它提供描述滤波器的线性常系数差分方程 (LCCDE) 的解。

k=0Na[k]y[nk]=k=0Mb[k]x[nk]

这通常被称为Nth订购 LCCD。

但是,当需要使用时域卷积来实现 IIR 滤波器时;

y[n]=h[n]x[n]

那么这需要脉冲响应的实际可用性h[n]IIR 滤波器的定义是无限长的。

为了获得有限长度,FIR,近似值h[n]对于 IIR 数字滤波器,首先选择您的模拟原型滤波器,然后应用必要的变换以获得数字 IIR 等效滤波器系数a[k]b[k],并计算截断的脉冲响应h[n]这个过滤器,从a[k]b[k]到足以满足应用目的的长度,最后应用进一步的窗口h[n]如果有必要...

下面的 MATLAB/OCTAVE 命令会给你一个长度N来自 IIR 系数的截断脉冲响应a[k]b[k]初始条件为零。

h = filter(b,a,[1 zeros(1,N-1)]);

隔直滤波器是高通滤波器。我不会使用“0 Hz 陷波滤波器”这个术语。通常,陷波滤波器适用于大于零的频率,这意味着在频率上存在两个互为负数的陷波。

通常,隔直流高通滤波器是一个离散时间微分器(在z=1) 后跟一个泄漏的积分器。泄漏积分器是 LPF。因此您可以仅关闭LPF 响应以获得 FIR,然后将该 FIR 脉冲响应通过微分器(因为它是 FIR 或长度 2)并获得另一个样本更长的 FIR。