2026a

# ellip


椭圆滤波器的设计

函数库: TySignalProcessing

注意

不同硬件环境下,由于计算精度的问题导致运行结果可能不一致。

# 语法

b, a = ellip(n, Rp, Rs, Wp)
b, a = ellip(n, Rp, Rs, Wp, ftype)
z, p, k = ellip(_____; otype = "zpk")
A, B, C, D = ellip(___; otype = "ABCD")
___ = ellip(___, "s"; otype = otype)

# 说明

b, a = ellip(n, Rp, Rs, Wp) 返回具有归一化通带边缘频率 Wp 和峰峰值通带纹波的 Rp 分贝的 n 阶低通椭圆滤波器的传递函数系数。


b, a = ellip(n, Rp, Rs, Wp, ftype) 根据 ftype 的值和 Wp 的元素数量,设计低通、高通、带通或带阻椭圆滤波器。由此产生的带通和带阻设计为 2n 阶。


z, p, k = ellip(_____; otype = "zpk") 设计一个低通、高通、带通或带阻数字椭圆滤波器并返回其零点、极点和增益。这个语法可以包括前面语法中的任何输入参数。


A, B, C, D = ellip(___; otype = "ABCD") 设计一个低通、高通、带通或带阻数字椭圆滤波器并返回指定其状态空间表示的矩阵。


___ = ellip(___, "s"; otype = otype) 设计一个低通、高通、带通或带阻的模拟椭圆滤波器,其通带边缘角频率为 Wp,通带纹波为 Rp 分贝,阻带衰减为 Rs 分贝。

# 示例

低通椭圆传递函数

设计一个具有 5 dB 通带纹波、40 dB 阻带衰减和 300 Hz 通带边缘频率的 6 阶低通椭圆滤波器,对于以 1000 Hz 采样的数据,对应于 0.6π rad/sample。绘制其幅度和相位响应。用它来对 1000 个样本的随机信号进行滤波。

using TyPlot 
using TyMath
using TySignalProcessing

fc = 300
fs = 1000

b, a = ellip(6, 10, 50, fc / (fs / 2))

freqz(b, a, [], fs; plotfig=true)

subplot(2, 1, 1)
ylim([-100 20])
rng = MT19937ar(1234)
dataIn = randn(rng, 1000, 1)
dataOut, = filter1(b, a, dataIn)
带阻椭圆滤波器

设计一个 6 阶椭圆带阻滤波器,其归一化边缘频率为 0.2π 和 0.6π rad/sample、5 dB 通带纹波和 50 dB 阻带衰减。绘制其幅度和相位响应。用它来对随机数据进行滤波。

using TyMath
using TySignalProcessing

b, a = ellip(3, 5, 50, [0.2 0.6], "bandstop")
freqz(b, a; plotfig=true)
rng = MT19937ar(1234)
dataIn = randn(rng, 1000, 1)
dataOut, = filter1(b, a, dataIn)
高通椭圆滤波器

设计一个通带边缘频率为 300 Hz 的 6 阶高通椭圆滤波器,对于以 1000 Hz 采样的数据,对应于 0.6π rad/sample。指定 3 dB 的通带纹波和 50 dB 的阻带衰减。绘制幅度和相位响应。

using TySignalProcessing

z, p, k = ellip(6, 3, 50, 300 / 500, "highpass"; otype="zpk")
sos = zp2sos(z, p, k; g_flag=false)
fvtool(sos; Analysis="freq")
带通椭圆滤波器

设计一个椭圆带通滤波器,其较低的通带频率为 500 Hz,较高的通带频率为 560 Hz。指定 3 dB 的通带纹波、40 dB 的阻带衰减。

using TySignalProcessing

b, a = ellip(10, 3, 40, [500 560] / 750, "bandpass")
fvtool(b, a)
模拟 IIR 低通滤波器对比

设计一个截止频率为 2 GHz 的 5 阶模拟巴特沃斯低通滤波器。乘以 2π,将频率转换为 rad/s。计算 4096 点处滤波器的频率响应。

using TyPlot 
using TySignalProcessing
using TyControlSystems
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)

设计具有相同边缘频率和 3dB 通带纹波的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)

设计具有相同边缘频率和 30dB 阻带衰减的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)

设计一个边缘频率相同、通带纹波为 3dB、阻带衰减为 30dB 的 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, "lowpass", otype = "zpk")
bf, af = zp2tf(zf, pf, kf)
hf, wf = freqs(bf, af, 4096)

以分贝为单位绘制衰减曲线。以千兆赫表示频率。比较滤波器。

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

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

# 输入参数

n - 滤波器阶数
整数标量

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

数据类型: Int

Rp - 峰值到峰值通带纹波
正标量

峰值到峰值通带纹波,指定为在分贝中表示的正标量。

数据类型: Float

Rs - 阻带衰减
正标量

从通带峰值向下的阻带衰减,指定为以分贝表示的正标量。 如果您的规格,ℓ, 是线性单位,可以使用 将其转换为分贝

数据类型: Float

Wp - 通带边缘频率
标量 | 两个元素的向量

通带边缘频率,指定为标量或双元素向量。通带边沿频率是滤波器幅度响应为 -RP 分贝的频率。较小的通带纹波,RP 值,导致更宽的过渡带。 当为两个元素的向量时,需要指定滤波器类型:bandpass,bandstop

数据类型: Float

ftype - 滤波器类型
"lowpass"(默认) | "bandpass" | "highpass" | "bandstop"

滤波器的类型。默认为 "lowpass"

数据类型: String

otype - 输出类型
"ba"(默认) | "zpk" | "ABCD"

滤波器表示类型。默认为 "ba"。

数据类型: String

# 输出参数

b, a - 传递函数系数
向量

IIR 滤波器的分子(B)和分母(A)多项式。

数据类型: Float

z, p, k - 零点,极点和增益
向量,标量

零点,极点和滤波器的增益,返回为长度 N 的两个向量(带通和带阻滤波器时,长度为 2N)和一个标量。

数据类型: 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

# 详细信息

椭圆滤波器提供比巴特沃斯或切比雪夫滤波器更陡峭的滚降特性,但在通带和阻带中都是等波纹的。通常,椭圆滤波器满足给定的性能规格,并且是任何滤波器类型中最低阶的。

ellip 使用五步算法:

  1. 它使用 ellipap 来找到低通模拟滤波器的模板零点,极点和增益;

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

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

  4. 对于数字滤波器设计,它使用双线性将模拟滤波器转换为数字滤波器,通过双线性转换与频率预调高。仔细的频率调节使模拟滤波器和数字滤波器能够在 WP 或 W1 和 W2 处具有相同的频率响应幅度;

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

# 版本历史记录

在 2024a 之前推出

2025a SP3:零极点输出统一为复数向量

z,p,k=ellip(__;otype="zpk") 用法,输出零点 z 由单列矩阵或向量修改为始终为复数向量。

fc = 300
fs = 1000
z,p,k = ellip(6, 10, 50, fc / (fs / 2);otype="zpk")

更新前结果:

z
6×1 Matrix{ComplexF64}:
  -0.8614632003131223 + 0.507820002073837im
  -0.8614632003131223 - 0.507820002073837im
  -0.3710290323059894 + 0.9286212668176853im
  -0.3710290323059894 - 0.9286212668176853im
 -0.48055349687223803 + 0.876965413596148im
 -0.48055349687223803 - 0.876965413596148im

2025a SP3 更新后结果:

z
6-element Vector{ComplexF64}:
  -0.861463200313123 + 0.5078200020738369im
  -0.861463200313123 - 0.5078200020738369im
 -0.3710290323059896 + 0.9286212668176846im
 -0.3710290323059896 - 0.9286212668176846im
 -0.4805534968722369 + 0.8769654135961474im
 -0.4805534968722369 - 0.8769654135961474im

# 另请参阅

butter | cheby2