为什么这种手动双线性变换会产生与 Matlab 不同的结果?

信息处理 过滤器 matlab
2022-01-01 11:56:13

我有一个截止频率为的一阶巴特沃斯滤波器。那么它的传递函数是ωc

H(s)=ωcs+ωc

使用双线性变换找到(该函数叫什么?),我得到H(z)

H(z)=ωc2Tz1z+1+ωc=ωcz+ωc(2T+ωc)z+ωc2T

但是,我无法将这个结果与 Matlab 正在做的事情相协调。无论的值是多少,这似乎都是错误的。我假设以下是的系数。TBAH(z)

>> [B,A] = butter(1,0.5)
B = 0.5000    0.5000
A = 1.0000   -0.0000
>> [B,A] = butter(1,0.6)
B = 0.5792    0.5792
A = 1.0000    0.1584
>> [B,A] = butter(1,0.7)
B = 0.6625    0.6625
A = 1.0000    0.3249
>> [B,A] = butter(1,0.8)
B = 0.7548    0.7548
A = 1.0000    0.5095

我有什么误解?

2个回答

几件事:

在进行替换之前,您需要通过进行替换来预先扭曲截止频率:s=2Tz1z+1

ωc,w=2Ttan(ωcT2)

其中是弯曲的截止频率。这是必要的,因为双线性变换将拉普拉斯域(用于模拟滤波器设计)中的左半平面以非线性方式映射到域中的单位圆。因此,当您接近奈奎斯特速率(的数字频率)时,模拟滤波器原型的近似值变得不准确。ωc,wz±π

此外,您传递给butter函数的第二个参数是归一化截止频率,而不是采样间隔该函数使用的归一化频率在区间内,等于所需截止频率与奈奎斯特速率的比率:T(0,1)

ωn=ωc2πfs2

ωn=ωcπfs

ωn=ωcTπ

打开 MATLABbutter函数的代码时,我们看到它使用了频率预变形

%# step 1: get analog, pre-warped frequencies
if ~analog,
    fs = 2;
    u = 2*fs*tan(pi*Wn/fs);
else
    u = Wn;
end