我有一个截止频率为$ \ omega_c $的一阶Butterworth滤波器。则其传递函数为

$$ H(s)= \ frac {\ omega_c} {s + \ omega_c} $$

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

$$ H(z)= \ frac {\ omega_c} {\ frac {2} {T} \ frac {z- 1} {z + 1} + \ omega_c}
= \ frac {\ omega_c z + \ omega_c} {\ left(\ frac {2} {T} + \ omega_c \ right)z + \ omega_c- \ frac {2} {T}} $$

但是,我无法将这个结果与Matlab所做的调和。无论$ T $的值如何,这似乎都是错误的。我假设下面的BA是$ 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不使用模数转换。它以数字方式设计滤波器,因此双线性变换的想法可能不适用。

@Phonon:这个答案似乎表明Matlab以某种方式使用了双线性变换。

此处游戏晚了,但z / s / \ omega的所有大写函数H通常称为传递函数。当参数是时间或样本时,称为冲激响应,通常用小写字母h表示。因此,传递函数就是脉冲响应的变换(取决于应用的Z,Fourier,Laplace)。

#1 楼

以下几点:

在进行替换$ s = \ frac {2} {T} \ frac {z-1} {z + 1} $之前,您需要通过以下方式预先调整截止频率替代:

$$
\ omega_ {c,w} = \ frac {2} {T} \ tan(\ omega_c \ frac {T} {2})
$$

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

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

$$
\ omega_n = \ frac {\ omega_c} {2 \ pi \ frac {f_s} {2}}
$$

$$
\ omega_n = \ frac {\ omega_c} {\ pi f_s}
$$

$$
\ omega_n = \ frac {\ omega_c T} {\ pi}
$$$

评论


$ \ begingroup $
谢谢!现在我得到正确的系数。在这里,我在表达式中用$ \ omega_c $代替了$ omega_c,w $,以$ H(z)$表示。之所以可行,是因为我知道截止频率在哪里影响巴特沃斯滤波器。如果我有一个通用滤波器,但只知道$ H(s)$的极点(和零点),该怎么办?我怎么知道要替代哪些值?
$ \ endgroup $
–安德烈亚斯(Andreas)
2011年11月8日在9:31

$ \ begingroup $
因为我想有理$ H(s)$的双线性变换可以只知道采样频率而不知道(归一化)截止频率而完成?
$ \ endgroup $
–安德烈亚斯(Andreas)
2011年11月8日,9:53

$ \ begingroup $
您可以使用双线性变换将$ s $域中的任何系统映射为$ z $域中的近似值。不需要预先翘曲,但需要注意的是,所得离散时间系统只是模拟系统的近似值。对任何感兴趣的频率进行预扭曲可以使您“拉伸”映射,从而使您最关心的频带区域具有尽可能小的原型滤波器失真。
$ \ endgroup $
–Jason R
2011年11月8日14:02

#2 楼

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

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