Main Content

butter

巴特沃斯滤波器设计

说明

示例

[b,a] = butter(n,Wn) 返回归一化截止频率为 Wnn 阶低通数字巴特沃斯滤波器的传递函数系数。

示例

[b,a] = butter(n,Wn,ftype) 用于根据 ftype 的值和 Wn 的元素数目,设计低通、高通、带通或带阻巴特沃斯滤波器。由此得到的带通和带阻设计的阶数都为 2n

注意:有关影响传递函数形成的数值问题的信息,请参阅限制

示例

[z,p,k] = butter(___) 用于设计低通、高通、带通或带阻数字巴特沃斯滤波器,并返回其零点、极点和增益。此语法可包含上述语法中的任何输入参数。

示例

[A,B,C,D] = butter(___) 用于设计低通、高通、带通或带阻数字巴特沃斯滤波器,并返回指定其状态空间表示的矩阵。

示例

[___] = butter(___,'s') 用于设计截止角频率为 Wn 的低通、高通、带通或带阻模拟巴特沃斯滤波器。

示例

全部折叠

设计截止频率为 300 Hz 的 6 阶低通巴特沃斯滤波器,对于以 1000 Hz 的速率采样的数据,截止频率对应于 0.6π 弧度/采样点。绘制其幅值和相位响应。用它对长度为 1000 个采样的随机信号进行滤波。

fc = 300;
fs = 1000;

[b,a] = butter(6,fc/(fs/2));

freqz(b,a,[],fs)

subplot(2,1,1)
ylim([-100 20])

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Frequency (Hz), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Frequency (Hz), ylabel Magnitude (dB) contains an object of type line.

dataIn = randn(1000,1);
dataOut = filter(b,a,dataIn);

设计一个 6 阶带阻巴特沃斯滤波器,其归一化边缘频率为 0.2π0.6π 弧度/采样点。绘制其幅值和相位响应。用它对随机数据进行滤波。

[b,a] = butter(3,[0.2 0.6],'stop');
freqz(b,a)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

dataIn = randn(1000,1);
dataOut = filter(b,a,dataIn);

设计一个 9 阶高通巴特沃斯滤波器。指定截止频率为 300 Hz,对于以 1000 Hz 的速率采样的数据,截止频率对应于 0.6π 弧度/采样点。绘制幅值和相位响应。将零点、极点和增益转换为二阶节。显示滤波器的频率响应。

[z,p,k] = butter(9,300/500,"high");
sos = zp2sos(z,p,k);
freqz(sos)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

设计一个 20 阶带通巴特沃斯滤波器,其截止频率下限为 500 Hz,截止频率上限为 560 Hz。指定采样率为 1500 Hz。使用状态空间表示。使用 designfilt 设计一个相同的滤波器。

fs = 1500;
[A,B,C,D] = butter(10,[500 560]/(fs/2));

d = designfilt("bandpassiir",FilterOrder=20, ...
    HalfPowerFrequency1=500,HalfPowerFrequency2=560, ...
    SampleRate=fs);

将状态空间表示转换为二阶节。可视化频率响应。

sos = ss2sos(A,B,C,D);

fvt = fvtool(sos,d,Fs=fs);
legend(fvt,["butter" "designfilt"])

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (Hz), ylabel Magnitude (dB) contains 2 objects of type line. These objects represent butter, designfilt.

设计截止频率为 2 GHz 的五阶模拟巴特沃斯低通滤波器。乘以 2π 以将频率转换为弧度/秒。计算滤波器在 4096 个点上的频率响应。

n = 5;
fc = 2e9;

[zb,pb,kb] = butter(n,2*pi*fc,"s");
[bb,ab] = zp2tf(zb,pb,kb);
[hb,wb] = freqs(bb,ab,4096);

设计一个具有相同边缘频率和 3 dB 通带波纹的五阶切比雪夫 I 型滤波器。计算它的频率响应。

[z1,p1,k1] = cheby1(n,3,2*pi*fc,"s");
[b1,a1] = zp2tf(z1,p1,k1);
[h1,w1] = freqs(b1,a1,4096);

设计一个具有相同边缘频率和 30 dB 阻带衰减的 5 阶切比雪夫 II 型滤波器。计算它的频率响应。

[z2,p2,k2] = cheby2(n,30,2*pi*fc,"s");
[b2,a2] = zp2tf(z2,p2,k2);
[h2,w2] = freqs(b2,a2,4096);

设计一个具有相同边缘频率和 3 dB 通带波纹、30 dB 阻带衰减的五阶椭圆滤波器。计算它的频率响应。

[ze,pe,ke] = ellip(n,3,30,2*pi*fc,"s");
[be,ae] = zp2tf(ze,pe,ke);
[he,we] = freqs(be,ae,4096);

设计一个具有相同边缘频率的 5 阶贝塞尔滤波器。计算它的频率响应。

[zf,pf,kf] = besself(n,2*pi*fc);
[bf,af] = zp2tf(zf,pf,kf);
[hf,wf] = freqs(bf,af,4096);

对衰减绘图,以分贝为单位。以千兆赫为单位表示频率。比较滤波器。

plot([wb w1 w2 we wf]/(2e9*pi), ...
    mag2db(abs([hb h1 h2 he hf])))
axis([0 5 -45 5])
grid
xlabel("Frequency (GHz)")
ylabel("Attenuation (dB)")
legend(["butter" "cheby1" "cheby2" "ellip" "besself"])

Figure contains an axes object. The axes object with xlabel Frequency (GHz), ylabel Attenuation (dB) contains 5 objects of type line. These objects represent butter, cheby1, cheby2, ellip, besself.

巴特沃斯和切比雪夫 II 型滤波器具有平坦的通带和宽过渡带。切比雪夫 I 型和椭圆滤波器转降更快,但有通带波纹。切比雪夫 II 型设计函数的频率输入设置阻带的起点,而不是通带的终点。贝塞尔滤波器沿通带具有大致恒定的群延迟。

输入参数

全部折叠

滤波器阶数,指定为整数标量。对于带通和带阻设计,n 表示滤波器阶数的一半。

数据类型: double

截止频率,指定为标量或二元素向量。截止频率是滤波器幅值响应为 1 / √2 时的频率。

  • 如果 Wn 是标量,则 butter 用于设计截止频率为 Wn 的低通或高通滤波器。

    如果 Wn 是二元素向量 [w1 w2],其中 w1 < w2,则 butter 用于设计截止频率下限为 w1 且截止频率上限为 w2 的带通或带阻滤波器。

  • 对于数字滤波器,截止频率必须介于 0 与 1 之间,其中 1 对应于奈奎斯特速率(即采样率的一半)或 π 弧度/采样点。

    对于模拟滤波器,截止频率必须用弧度/秒表示,并且可以取任何正值。

数据类型: double

滤波器类型,指定为以下项之一:

  • 'low' 指定截止频率为 Wn 的低通滤波器。'low' 是标量 Wn 的默认值。

  • 'high' 指定截止频率为 Wn 的高通滤波器。

  • 如果 Wn 是二元素向量,则 'bandpass' 指定阶数为 2n 的带通滤波器。当 Wn 有两个元素时,'bandpass' 是默认值。

  • 如果 Wn 是二元素向量,则 'stop' 指定阶数为 2n 的带阻滤波器。

输出参数

全部折叠

滤波器的传递函数系数,对于低通滤波器和高通滤波器,以长度为 n + 1 的行向量形式返回;对于带通滤波器和带阻滤波器,以长度为 2n + 1 的行向量形式返回。

  • 对于数字滤波器,传递函数用 ba 表示为

    H(z)=B(z)A(z)=b(1)+b(2)z1++b(n+1)zna(1)+a(2)z1++a(n+1)zn.

  • 对于模拟滤波器,传递函数用 ba 表示为

    H(s)=B(s)A(s)=b(1)sn+b(2)sn1++b(n+1)a(1)sn+a(2)sn1++a(n+1).

数据类型: double

滤波器的零点、极点和增益,以长度为 n(对于带通和带阻设计则为 2n)的两个列向量以及标量形式返回。

  • 对于数字滤波器,传递函数用 zpk 表示为

    H(z)=k(1z(1)z1)(1z(2)z1)(1z(n)z1)(1p(1)z1)(1p(2)z1)(1p(n)z1).

  • 对于模拟滤波器,传递函数用 zpk 表示为

    H(s)=k(sz(1))(sz(2))(sz(n))(sp(1))(sp(2))(sp(n)).

数据类型: double

滤波器的状态空间表示,以矩阵形式返回。如果 m = n(对于低通和高通设计)或 m = 2n(对于带通和带阻滤波器),则 A 为 m×m,B 为 m×1,C 为 1×m,而 D 为 1×1。

  • 对于数字滤波器,状态空间矩阵与状态向量 x、输入 u 和输出 y 存在以下关系

    x(k+1)=Ax(k)+Bu(k)y(k)=Cx(k)+Du(k).

  • 对于模拟滤波器,状态空间矩阵通过以下方程将状态向量 x、输入 u 和输出 y 相关

    x˙=Ax+Buy=Cx+Du.

数据类型: double

详细信息

全部折叠

限制

传递函数语法的数值不稳定性

通常,使用 [z,p,k] 语法来设计 IIR 滤波器。要分析或实现您的滤波器,您可以将 [z,p,k] 输出与 zp2sos 结合使用。如果使用 [b,a] 语法设计滤波器,则可能会遇到数值问题。这些问题是舍入误差所导致的,可能会在 n 小至 4 时出现。以下示例说明了这种限制。

n = 6;
Wn = [2.5e6 29e6]/500e6;
ftype = 'bandpass';

% Transfer Function design
[b,a] = butter(n,Wn,ftype);      % This is an unstable filter

% Zero-Pole-Gain design
[z,p,k] = butter(n,Wn,ftype);
sos = zp2sos(z,p,k);

% Display and compare results
hfvt = fvtool(b,a,sos,'FrequencyScale','log');
legend(hfvt,'TF Design','ZPK Design')

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Magnitude (dB) contains 2 objects of type line. These objects represent TF Design, ZPK Design.

算法

巴特沃斯滤波器的幅值响应在通带内具有最大平坦度,并在整体上呈现单调性。这种平滑是以降低滚降陡度为代价的。对于给定滤波器阶数,椭圆和切比雪夫滤波器通常提供更陡的滚降。

butter 使用一个五步算法:

  1. 它使用函数 buttap 查找低通模拟原型的极点、零点和增益。

  2. 它将极点、零点和增益转换为状态空间形式。

  3. 如果需要,它使用状态空间变换将低通滤波器转换为具有所需频率约束的带通、高通或带阻滤波器。

  4. 对于数字滤波器设计,它使用 bilinear 通过具有频率预修正的双线性变换将模拟滤波器转换为数字滤波器。经过仔细调整频率,模拟滤波器和数字滤波器在 Wnw1w2 处可具有相同的频率响应幅值。

  5. 根据需要,它将状态空间滤波器转换回其传递函数或零极点增益形式。

扩展功能

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

版本历史记录

在 R2006a 之前推出