我的教授在展示使用双线性变换设计数字滤波器的示例时提到,带通滤波器和陷波滤波器的阶必须始终是偶数。
然后他还提到 MATLAB 代码ellipord
返回实际顺序的一半,所以我认为这两个语句必须以某种方式连接。我不能问他,因为现在是凌晨 3 点,而且我无法单独找到任何关于为什么这两个陈述是正确的。
有什么想法吗?谢谢!
我的教授在展示使用双线性变换设计数字滤波器的示例时提到,带通滤波器和陷波滤波器的阶必须始终是偶数。
然后他还提到 MATLAB 代码ellipord
返回实际顺序的一半,所以我认为这两个语句必须以某种方式连接。我不能问他,因为现在是凌晨 3 点,而且我无法单独找到任何关于为什么这两个陈述是正确的。
有什么想法吗?谢谢!
原则上,一般带通或带阻滤波器的滤波器阶数没有理由必须是偶数。这种限制是特定设计程序的结果。在经典的 IIR 滤波器设计(Butterworth、Chebyshev、Cauer)中,您从模拟原型低通滤波器开始。然后通过频率变换获得带通或带阻滤波器。正是这种频率变换使原型低通滤波器的阶数加倍,因此该特定设计方法的滤波器阶数均匀。请注意,双线性变换与滤波器阶数的限制无关。
当然,对于某些特殊的设计,奇数的滤波器阶数没有多大意义。例如,对于陷波滤波器(陷波频率大于零),您希望在陷波频率处正好有一个零加上它在负陷波频率处的镜像。因此,对于每个陷波频率,您会得到两个零,因此会得到两个极点。
我相信你的想法是正确的。对于带通滤波器,对于正频率范围内的每个 z 平面极点,在 z 平面的负频率范围内都有一个共轭极点。因此,对于带通滤波器,z 平面的极点总数将是偶数个(两个极点、四个极点、六个极点等)。当对带通滤波器使用 MATLAB 的 ellipord 命令时,该命令返回 z 平面的正频率范围内的极点数,该极点数是实际 z 平面极点数的一半。
实用的带通滤波器将是偶数排序的。下面的 Matt L 指出,通过在 DC 处放置 z 平面零来修改偶数阶滤波器的传递函数可以使带通滤波器奇数阶,这是真的。但是在 DC 处放置一个 z 平面零会严重扭曲原始偶数阶滤波器的频率响应,以至于新的奇数阶滤波器变得无法使用。
也许这只是语义问题。你当然可以级联一个偶数阶高通和一个奇数阶低通,你会得到一个看起来像带通的奇数阶滤波器。
%% odd order bandpass
fs = 44100;
fc = 1000;
[z,p,k] = butter(2,fc/sqrt(2)/fs*2,'high');
sos = zp2sos(z,p,k);
[z,p,k] = butter(3,fc*sqrt(2)/fs*2);
sos = [sos; zp2sos(z,p,k)];
nx = 8192;
f = logspace(log10(20),log10(20000),1000);
h = freqz(sos,f,fs);
semilogx(f,20*log10(abs(h)));
xlabel('Frequency in Hz'); ylabel('Level in dB'); title('odd order bandpass');
grid('on');
set(gca,'xlim',[f(1) f(end)]); set(gca,'ylim',[-60 3]);