Matlab IIR cheby2带通,幅度问题

信息处理 matlab 过滤器设计 无限脉冲响应 带通 震级
2022-02-15 17:06:09

我正在尝试在 Matlab 中实现 IIR 带通。有两点我不明白。但首先,让我发布代码。

fs = 50000; %Hz
f1filter = 1000;  %Hz
f2filter = 2000;  %Hz
filterOrdnung = 6;   %erzeugt (2 * filterOrdnung) Filterkoeffizienten
anzahlFilter = 5;    %Anzahl der zu berechnenden Filter zur Auswertung
schrittweiteVerschiebung = 1000;  %Verschiebung in Hz
astop = 20;           %Verstärkung an den Bandgrenzen des Bandpasses
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

k = zeros(anzahlFilter, 1);                 %Vektor für Gain

z = zeros(2*filterOrdnung,anzahlFilter);    %Matrix für
                                            %Nullstellen

p = zeros(2*filterOrdnung, anzahlFilter);   %Matrix für
                                            %Polstellen

sos = zeros(anzahlFilter * filterOrdnung + (anzahlFilter - 1), 6);  %Matrix für Filterkoeffizienten
[z(:,1), p(:,1), k(1,1)] = cheby2(filterOrdnung, astop, [((2*f1filter)/fs)...
    ((2*f2filter)/fs)]);

[sos(1:6,:), g] = zp2sos(z(:,1),p(:,1),k(1,1));    %Output form:[b01,b11,b21,1,a11,a21
                                                   %             b02,b12,b22,1,a12,a22
                                                   %             b0N,b1N...........a2N]

fvtool(sos(1:6, :),'Analysis','freq');

所以我想创建一个带宽为 1000Hz 到 2000Hz 的带通。滤波器阶数为 6 阶,截止衰减应为 20dB。我想要二阶表格的结构。(顺便说一句,是否有任何特定的 Matlab 函数来创建 IIR 滤波器作为 Directform II 结构的级联?)

我正在创建比我现在需要的更大的“sos”,因为我想创建几个不同的带通,但让我们只关注这个例子。

1)第一个问题:为什么我只有 6 阶 IIR 时会收到 12 个分子和 12 个分母的系数?在我读过的书中,对于 6 阶 IIR,我应该收到 7 个分子和 7 个分母系数,第一个分母系数 = 1。

2)在代码的头部,我声明 astop 为 20dB。cheby2 的 Matlab 文档告诉我,这是阻带的衰减。但是当我让代码运行并查看幅度时,通带的幅度约为20dB。我预计它是 0dB,而阻带应该是 -20dB。不过,规范的频率似乎是正确的。我希望我能很好地解释我的问题。 IIR 滤波器响应

3个回答

实际上我们也面临同样的问题,而不是(Z,P,k),即使你使用(A,B,C,D),只要sos与g的语法一起出现,你的幅度响应将按比例缩放衰减因子。如果您只关心绘制幅度响应,您可以绘制为 freqz(sos),您将获得精确的幅度响应而无需缩放。

cheby2函数的帮助文件指出

If Wn is a two-element vector, 
Wn = [W1 W2], CHEBY2 returns an 
order 2N bandpass filter with 
passband  W1 < W < W2. 

由于您设计了带通滤波器,因此您的订单将是2N代替N,其原因可能是使用了两个过滤器;就像一个高低组合来创建你的带通滤波器......

对于您的第二个问题,您对参数的理解是正确的R是以 dB 为单位的 stobband 衰减。所以,R=20意味着将有 20 dB 的阻带衰减,正如以下 Matlab/Octave 代码所验证的:

[b,a] = cheby2(6, 20, [0.2,0.4]);  % 2x6 = 12-th order bandpass cheby-II filter 

figure,freqz(b,a);     % display the frequency response

在此处输入图像描述

所以问题是关于你的 zp2sos 转换或频率响应绘图阶段......

在 Matlab 中设计标准 IIR 频率选择滤波器(Chebyshev、Butterworth、Cauer)时,得到的带通和带阻滤波器的滤波器阶数始终是指定阶数的两倍(即,2n代替n),因为它们是通过变换阶数的低通滤波器获得的n.

您的最大增益不统一的原因与您在调用中使用的输出参数的数量有关zp2sos您指定了增益g,但不使用它来计算频率响应。zp2sos仅使用一个输出参数调用会更容易sos,因为通过这种方式,增益被合并到二阶部分之一中。mathworks 文档zp2sos

sos = zp2sos(...)嵌入整个系统增益,g,在第一节中,H1(z), [...]