# butter
巴特沃斯滤波器设计
函数库: TySignalProcessing
# 语法
b, a = butter(n, Wn; otype = "ba")
b, a = butter(n, Wn, ftype; otype = "ba")
z, p, k = butter(n, Wn; otype = "zpk")
z, p, k = butter(n, Wn, ftype; otype = "zpk")
A, B, C, D = butter(n, Wn; otype = "ABCD")
A, B, C, D = butter(n, Wn, ftype; otype = "ABCD")
___ = butter(___, "s"; otype = __)
# 说明
b, a = butter(n, Wn; otype = "ba") 设计具有归一化截止频率 Wn 的 n 阶低通数字巴特沃斯滤波器,并指定输出滤波器的传递函数系数。当 otype 指定为 "ba" 时,可省略。 示例
b, a = butter(n, Wn, ftype; otype = "ba") 设计具有归一化截止频率 Wn 的 n 阶低通、高通、带通或带阻数字巴特沃斯滤波器,并指定输出滤波器的传递函数系数。当 otype 指定为 "ba" 时,可省略。 示例
z, p, k = butter(n, Wn; otype = "zpk") 设计具有归一化截止频率 Wn 的 n 阶低通数字巴特沃斯滤波器,并指定输出滤波器的零点、极点和增益。
z, p, k = butter(n, Wn, ftype; otype = "zpk") 设计具有归一化截止频率 Wn 的 n 阶低通、高通、带通或带阻数字巴特沃斯滤波器,并指定输出滤波器的零点、极点和增益。
A, B, C, D = butter(n, Wn; otype = "ABCD") 设计具有归一化截止频率 Wn 的 n 阶低通数字巴特沃斯滤波器,并指定输出滤波器的状态空间矩阵。
A, B, C, D = butter(n, Wn, ftype; otype = "ABCD") 设计具有归一化截止频率 Wn 的 n 阶低通、高通、带通或带阻数字巴特沃斯滤波器,并指定输出滤波器的状态空间矩阵。
___ = butter(___,"s"; otype = __) 用于设计截止角频率为 Wn 的低通、高通、带通或带阻模拟 Butterworth 滤波器。
# 示例
低通巴特沃斯传递函数
设计一个截止频率为 300 Hz 的 6 阶低通巴特沃斯滤波器,对于以 1000 Hz 采样的数据,它对应于 rad/sample。 绘制其幅度和相位响应。 用它来对 1000 个样本的随机信号进行滤波。
using TyMath
using TySignalProcessing
fc = 300
fs = 1000
b, a = butter(6, fc / (fs / 2))
freqz(b, a; plotfig = true)
dataIn = randn(1000, 1)
dataOut, =filter1(b, a, dataIn)
带阻巴特沃斯滤波器
设计一个 6 阶巴特沃斯带阻滤波器,其归一化边缘频率为 0.2π 和 0.6π rad/sample。绘制其幅度和相位响应,用它来对随机数据进行滤波。
using TyMath
using TySignalProcessing
b,a = butter(3,[0.2,0.6],"bandstop")
freqz(b,a;plotfig = true)
dataIn = randn(1000,1)
dataOut = filter1(b, a, dataIn)
高通巴特沃斯滤波器
设计一个 9 阶巴特沃斯带阻滤波器,指定截止频率为 300 Hz,对于采样频率为 1000 Hz 的数据,相当于 0.6π rad/sample。绘制幅值和相位响应图,将零点、极点和增益转换为二阶节,供 fvtool 使用。
using TySignalProcessing
z,p,k = butter(9,300/500,"highpass"; otype = "zpk")
sos = zp2sos(z,p,k;g_flag=false)
fvtool(sos)

模拟 IIR 低通滤波器的比较
设计一个截止频率为 2 GHz 的 5 阶模拟巴特沃斯低通滤波器。将频率乘以 2π,转换为每秒弧度。计算滤波器在 4096 点的频率响应。
using TySignalProcessing
using TyControlSystems
using TyPlot
n = 5;
f = 2e9;
zb, pb, kb = butter(n, 2 * pi * f, "s"; otype="zpk")
bb, ab = zp2tf(zb, pb, kb)
hb, wb = freqs(bb, ab, 4096)
设计一个边缘频率相同、通带纹波为 3 dB 的 5 阶切比雪夫 I 型滤波器。计算其频率响应。
z1, p1, k1 = cheby1(n, 3, 2 * pi * f, "s"; otype="zpk")
b1, a1 = zp2tf(z1, p1, k1)
h1, w1 = freqs(b1, a1, 4096)
设计一个边缘频率相同、阻带衰减为 30 dB 的 5 阶切比雪夫 II 型滤波器。计算其频率响应。
z2, p2, k2 = cheby2(n, 30, 2 * pi * f, "s"; otype="zpk")
b2, a2 = zp2tf(z2, p2, k2)
h2, w2 = freqs(b2, a2, 4096)
设计一个边缘频率相同、通带纹波为 3 dB、阻带衰减为 30 dB 的 5 阶椭圆滤波器。计算其频率响应。
ze, pe, ke = ellip(n, 3, 30, 2 * pi * f, "s"; otype="zpk")
be, ae = zp2tf(ze, pe, ke)
he, we = freqs(be, ae, 4096)
设计一个边缘频率相同的 5 阶贝塞尔滤波器。计算其频率响应。
zf, pf, kf = besself(n, 2 * pi * f; otype="zpk");
bf, af = zp2tf(zf, pf, kf);
hf, wf = freqs(bf, af, 4096);
以 dB 为单位绘制衰减图。以 GHz 为单位表示频率。比较滤波器。
plot([wb w1 w2 we wf] / (2e9 * pi), mag2db(abs.([hb h1 h2 he hf])))
axis([0 4 -40 5])
grid("on")
xlabel("Frequency (GHz)")
ylabel("Attenuation (dB)")
legend(["butter" "cheby1" "cheby2" "ellip" "besself"])

# 输入参数
n - 滤波器阶数整数标量
滤波器阶数,指定为整数标量。
对于带通和带阻设计,n 为滤波器阶数的二分之一。
数据类型: Int
Wn - 截止频率标量 | 二元素向量
截止频率,指定为标量或二元素向量。截止频率是滤波器幅度响应为
如果 Wn 是标量,则 butter 设计一个截止频率为 Wn 的低通或高通滤波器;
如果 Wn 是二元素向量 [w1,w2],其中 w1 < w2,则 butter 会设计一个带通或带阻滤波器,其具有较低的截止频率 w1 和较高的截止频率 w2。
对于数字滤波器,截止频率必须位于 0 和 1 之间,其中 1 对应于奈奎斯特速率(采样率的一半)或 π rad/sample。
对于模拟滤波器,截止频率必须以 rad/s 表示,并且可以取任何正值。
数据类型: Float64
ftype - 滤波器类型"lowpass" | "bandpass" | "highpass" | "bandstop"
滤波器类型,指定为以下之一:
- "lowpass" 指定截止频率为 Wn 的低通滤波器。 "lowpass" 是标量 Wn 的默认值;
- "bandpass" 如果 Wn 是二元素向量,则指定 2n 阶带通滤波器。当 Wn 有两个元素时,"bandpass" 是默认值;
- "highpass" 指定截止频率为 Wn 的高通滤波器;
- "bandstop" 如果 Wn 是二元素向量,则指定 2n 阶带阻滤波器。
数据类型: String
otype - 输出类型"ba" | "zpk" | "ABCD"
- "ba" 输出低通、高通、带通或带阻数字巴特沃斯滤波器的传递函数系数。未指定输出类型时,默认输出类型为 "ba";
- "zpk" 输出低通、高通、带通或带阻数字巴特沃斯滤波器的零点、极点和增益;
- "ABCD" 输出低通、高通、带通或带阻数字巴特沃斯滤波器的状态空间矩阵。
数据类型: String
# 输出参数
b,a - 传递函数系数向量
滤波器的传递函数系数,对于低通和高通滤波器,以长度为 n + 1 的向量形式返回,对于带通和带阻滤波器,以长度为 2n + 1 的向量形式返回。
对于数字滤波器,传递函数用 b 和 a 表示为:
对于模拟滤波器,传递函数用 b 和 a 表示为:
数据类型: Float64
z,p,k - 零点、极点和增益标量 | 向量
滤波器的零点、极点和增益,作为两个长度为 n 的列向量(带通和带阻设计为 2n)和一个标量返回。
对于数字滤波器,传递函数用 z、p 和 k 表示为:
对于模拟滤波器,传递函数用 z、p 和 k 表示为:
数据类型: Float
A,B,C,D - 状态空间矩阵矩阵
滤波器的状态空间表示,以矩阵形式返回。如果 m = n 用于低通和高通设计,m = 2n 用于带通和带阻滤波器,则 A 是 m×m,B 是 m×1,C 是 1×m,D 是 1×1。
对于数字滤波器,状态空间矩阵将状态向量 x、输入 u 和输出 y 通过:
对于模拟滤波器,状态空间矩阵将状态向量 x、输入 u 和输出 y 通过:
数据类型: Float
# 版本历史记录
在 2024a 之前推出
2025a SP3:零极点输出统一为复数向量,增益修改为实数标量
z,p,k=butter(__;otype="zpk") 用法,输出零点 z 的类型由实数或复数向量修改为始终是复数向量,输出增益 k 由单个元素的向量修改为实数标量。
fc = 300
fs = 1000
z,p,k = butter(6, fc / (fs / 2);otype="zpk")
更新前结果:
z
6-element Vector{Float64}:
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
k
1-element Vector{Float64}:
0.0701154134924536
2025a SP3 更新后结果:
z
6-element Vector{ComplexF64}:
-1.0 - 0.0im
-1.0 - 0.0im
-1.0 - 0.0im
-1.0 - 0.0im
-1.0 - 0.0im
-1.0 - 0.0im
k
0.0701154134924536