主要内容

butter

巴特沃斯滤波器设计

说明

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

示例

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

注意

设计传递函数阶数小至 4 的 IIR 滤波器时,可能会遇到数值不稳定的问题。有关影响传递函数形成的数值问题的更多信息,请参阅传递函数和 CTF

示例

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

示例

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

示例

[___] = butter(___,"s") 使用上述语法中的任何输入或输出参量设计模拟巴特沃斯滤波器。

示例

[B,A] = butter(n,Wn,"ctf") 使用二阶级联传递函数 (CTF) 设计低通数字巴特沃斯滤波器。该函数返回列出滤波器传递函数的分母和分子多项式系数的矩阵,表示为级联的滤波器节。与单节传递函数相比,这种方法生成的 IIR 滤波器具有更高的数值稳定性。 (自 R2024b 起)

[___] = butter(n,Wn,ftype,"ctf") 设计低通、高通、带通或带阻数字巴特沃斯滤波器,并使用 CTF 格式返回滤波器表示。得到的设计节为 2 阶(低通和高通滤波器)或 4 阶(带通和带阻滤波器)。 (自 R2024b 起)

示例

[___,gS] = butter(___) 还返回系统的总增益。您必须指定 "ctf" 才能返回 gS (自 R2024b 起)

示例

全部折叠

设计截止频率为 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。使用状态空间表示。将状态空间表示转换为二阶节。可视化频率响应。

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

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.

使用 designfilt 设计一个相同的滤波器。可视化频率响应。

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

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.

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

n = 5;
wc = 2*pi*2e9;
w = 2*pi*1e9*logspace(-2,1,4096)';

[zb,pb,kb] = butter(n,wc,"s");
[bb,ab] = zp2tf(zb,pb,kb);
[hb,wb] = freqs(bb,ab,w);
gdb = -diff(unwrap(angle(hb)))./diff(wb);

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

[z1,p1,k1] = cheby1(n,3,wc,"s");
[b1,a1] = zp2tf(z1,p1,k1);
[h1,w1] = freqs(b1,a1,w);
gd1 = -diff(unwrap(angle(h1)))./diff(w1);

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

[z2,p2,k2] = cheby2(n,30,wc,"s");
[b2,a2] = zp2tf(z2,p2,k2);
[h2,w2] = freqs(b2,a2,w);
gd2 = -diff(unwrap(angle(h2)))./diff(w2);

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

[ze,pe,ke] = ellip(n,3,30,wc,"s");
[be,ae] = zp2tf(ze,pe,ke);
[he,we] = freqs(be,ae,w);
gde = -diff(unwrap(angle(he)))./diff(we);

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

[zf,pf,kf] = besself(n,wc);
[bf,af] = zp2tf(zf,pf,kf);
[hf,wf] = freqs(bf,af,w);
gdf = -diff(unwrap(angle(hf)))./diff(wf);

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

fGHz = [wb w1 w2 we wf]/(2e9*pi);
plot(fGHz,mag2db(abs([hb h1 h2 he hf])))
axis([0 5 -45 5])
grid on
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.

绘制采样中的群延迟。以千兆赫表示频率,以纳秒表示群延迟。比较滤波器。

gdns = [gdb gd1 gd2 gde gdf]*1e9;
gdns(gdns<0) = NaN;
loglog(fGHz(2:end,:),gdns)
grid on
xlabel("Frequency (GHz)")
ylabel("Group delay (ns)")
legend(["butter" "cheby1" "cheby2" "ellip" "besself"])

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

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

设计截止频率为 300 Hz、采样率为 1000 Hz 的九阶高通巴特沃斯滤波器。以级联二阶节形式返回滤波器系统的系数。

Wn = 300/(1000/2);
[B,A] = butter(9,Wn,"high","ctf")
B = 5×3

    0.2544   -0.2544         0
    0.2544   -0.5088    0.2544
    0.2544   -0.5088    0.2544
    0.2544   -0.5088    0.2544
    0.2544   -0.5088    0.2544

A = 5×3

    1.0000    0.1584         0
    1.0000    0.3264    0.0561
    1.0000    0.3575    0.1570
    1.0000    0.4189    0.3554
    1.0000    0.5304    0.7165

绘制滤波器的幅值响应。

filterAnalyzer(B,A)

输入参数

全部折叠

滤波器阶数,指定为小于或等于 500 的整数标量。对于带通和带阻设计,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,该函数返回具有 r 个采样的 ba,其中:对于低通和高通滤波器,r = n+1,对于带通和带阻滤波器,r = 2*n+1

传递函数用 b = [b1 b2br]a = [a1 a2ar] 表示,如下列各项之一所示:

  • H(z)=b1+b2z1++brz(r1)a1+a2z1++arz(r1) 用于数字滤波器。

  • H(s)=b1sr1+b2sr2++bra1sr1+a2sr2++ar 用于模拟滤波器。

数据类型: double

滤波器的零点、极点和增益,以两个列向量和一个标量形式返回。给定滤波器阶数 n,该函数返回具有 r 个采样的 zp,其中:对于低通和高通滤波器,r = n,对于带通和带阻滤波器,r = 2*n

传递函数用 z = [z1 z2zr]p = [p1 p2pr]k 表示,如下列各项之一所示:

  • H(z)=k(1z1z1)(1z2z1)(1zrz1)(1p1z1)(1p2z1)(1prz1) 用于数字滤波器。

  • H(s)=k(sz1)(sz2)(szr)(sp1)(sp2)(spr) 用于模拟滤波器。

数据类型: double

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

状态空间矩阵通过以下方程组之一使状态向量 x、输入 u 和输出 y 相关。

  • 对于数字滤波器:

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

  • 对于模拟滤波器:

    x˙=Ax+Buy=Cx+Du.

数据类型: double

自 R2024b 起

级联传递函数 (CTF) 系数,以行向量或矩阵形式返回。BA 分别列出级联传递函数的分子系数和分母系数。

BA 的大小分别为 L×(m +1) 和 L×(n +1)。该函数将 A 的第一列返回为 1,因此当 A 是行向量时,A(1)=1

  • L 表示滤波器节的数量。

  • m 表示滤波器分子的阶。

  • n 表示滤波器分母的阶。

butter 函数返回具有以下阶数设定的 CTF 系数:

  • m = n = 2 用于低通和高通滤波器。

  • m = n = 4 用于带通和带阻滤波器。

注意

要自定义 CTF 系数计算,例如在 CTF 系数中设置不同阶或自定义增益定标,请指定返回 z,p,k,然后使用 zp2ctf 获得 B,A

有关级联传递函数格式和系数矩阵的详细信息,请参阅以 CTF 格式返回数字滤波器

自 R2024b 起

总系统增益,以实数值标量形式返回。

  • 如果指定返回 gS,则 butter 函数会对分子系数进行归一化,使 B 的第一列为 1,并在 gS 中返回总系统增益。

  • 如果不指定返回 gS,则 butter 函数会使用 scaleFilterSections 函数将系统增益均匀分布在所有系统节上。

详细信息

全部折叠

算法

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

butter 使用一个五步算法:

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

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

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

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

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

参考

[1] Lyons, Richard G. Understanding Digital Signal Processing. Upper Saddle River, NJ: Prentice Hall, 2004.

扩展功能

全部展开

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

版本历史记录

在 R2006a 之前推出

全部展开