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


10

我有一个截止频率为一阶Butterworth滤波器。则其传递函数为ωc

H(s)=ωcs+ωc

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

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

但是,我无法将此结果与Matlab所做的调和。无论T的值是多少,这似乎都是错误的T。我假设BA以下是H(z)的系数H(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

我有什么误会?


MATLAB不使用模数转换。它以数字方式设计滤波器,因此双线性变换的想法可能不适用。
声子

1
@Phonon:这个答案似乎表明Matlab以某种方式使用了双线性变换。
安德烈亚斯(Andreas)

此处游戏晚了,但z / s / \ omega的所有大写函数H通常称为传递函数。当参数是时间或样本时,称为冲激响应,通常用小写字母h表示。因此,传递函数是脉冲响应的变换(取决于应用的Z,傅立叶,拉普拉斯)。
伊曼纽尔·兰德霍尔姆

Answers:


10

几件事:

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

ωc,w=2Ttan(ωcT2)

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

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

ωn=ωc2πfs2

ωn=ωcπfs

ωn=ωcTπ

谢谢!现在我得到正确的系数。在这里,我在表达式中用了。之所以可行,是因为我知道截止频率在哪里影响巴特沃斯滤波器。如果我有一个通用滤波器并且只知道的极点(和零点怎么办?我怎么知道要替代哪些值?ωcomegac,wH(z)H(s)
安德里亚斯(Andreas)

因为我想可以只知道采样频率而不知道(归一化的)截止频率来完成有理的双线性变换?H(s)
Andreas

您可以使用双线性变换将任何域系统映射到域中的近似值。不需要预翘曲,但需要注意的是,所得离散时间系统只是模拟系统的近似值。对任何感兴趣的频率进行预扭曲可以使您“拉伸”映射,从而使您最关心的频段区域具有尽可能小的原型滤波器失真。sz
杰森R

5

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

%# step 1: get analog, pre-warped frequencies
if ~analog,
    fs = 2;
    u = 2*fs*tan(pi*Wn/fs);
else
    u = Wn;
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.