SciPy 1.12 中文文档(三十)
scipy.signal.residue
原文链接:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.residue.html#scipy.signal.residue
scipy.signal.residue(b, a, tol=0.001, rtype='avg')
计算 b(s) / a(s)的部分分式展开。
如果M是分子b的次数,N是分母a的次数:
b(s) b[0] s**(M) + b[1] s**(M-1) + ... + b[M]
H(s) = ------ = ------------------------------------------
a(s) a[0] s**(N) + a[1] s**(N-1) + ... + a[N]
然后,部分分式展开 H(s)定义如下:
r[0] r[1] r[-1]
= -------- + -------- + ... + --------- + k(s)
(s-p[0]) (s-p[1]) (s-p[-1])
如果有重复的根(比tol更接近),则 H(s)的项如下:
r[i] r[i+1] r[i+n-1]
-------- + ----------- + ... + -----------
(s-p[i]) (s-p[i])**2 (s-p[i])**n
该函数用于正幂次 s 或 z 的多项式,如控制工程中的模拟滤波器或数字滤波器。对于 z 的负幂次(典型的数字信号处理中的数字滤波器),请使用residuez。
有关算法的详细信息,请参阅备注。
参数:
barray_like
分子多项式系数。
aarray_like
分母多项式系数。
tolfloat, optional
两个根被视为相等的距离容忍度。默认为 1e-3。详见unique_roots获取更多详情。
rtype{‘avg’, ‘min’, ‘max’}, optional
用于计算代表一组相同根的根的方法。默认为'avg'。详见unique_roots获取更多详情。
返回:
rndarray
对应于极点的残余。对于重复的极点,残余按照幂次分数的升序排列。
pndarray
按幅度升序排列的极点。
kndarray
直接多项式项的系数。
另请参阅
invres, residuez, numpy.poly, unique_roots
注意事项
计算使用“透过减法进行紧缩”的算法 —— 第 1 条[1]。
部分分式展开的形式取决于数学上极点的重数。然而,在数值计算中无法精确确定多项式根的重数。因此,你应该将带有给定tol的residue的结果视为对具有经验确定的重数的计算极点的分部分式展开的结果。如果存在接近的极点,tol的选择可能会显著改变结果。
参考文献
[1]
J. F. Mahoney, B. D. Sivazlian,“部分分式展开:计算方法和效率综述”,《计算与应用数学杂志》,第 9 卷,1983 年。
scipy.signal.residuez
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.residuez.html#scipy.signal.residuez
scipy.signal.residuez(b, a, tol=0.001, rtype='avg')
计算 b(z) / a(z)的部分分数展开。
如果M是分子b的度数,N是分母a的度数:
b(z) b[0] + b[1] z**(-1) + ... + b[M] z**(-M)
H(z) = ------ = ------------------------------------------
a(z) a[0] + a[1] z**(-1) + ... + a[N] z**(-N)
那么部分分数展开 H(z)的定义如下:
r[0] r[-1]
= --------------- + ... + ---------------- + k[0] + k[1]z**(-1) ...
(1-p[0]z**(-1)) (1-p[-1]z**(-1))
如果有任何重复的根(比tol更接近),则部分分数展开将包含以下术语:
r[i] r[i+1] r[i+n-1]
-------------- + ------------------ + ... + ------------------
(1-p[i]z**(-1)) (1-p[i]z**(-1))**2 (1-p[i]z**(-1))**n
此函数用于负幂次 z 的多项式,例如 DSP 中的数字滤波器。对于正幂次,请使用residue。
有关算法的详细信息,请参阅残差的注释。
参数:
barray_like
分子多项式的系数。
aarray_like
分母多项式系数。
tolfloat,可选
两个根被视为相等的容差。默认为 1e-3。有关更多详情,请参见unique_roots。
rtype{‘avg’, ‘min’, ‘max’},可选
用于计算表示一组相同根的根的方法。默认为'avg'。有关更多详情,请参见unique_roots。
返回:
rndarray
对应于极点的残差。对于重复的极点,残差按升序排列以对应于幂分数。
pndarray
按升序排列的极点。
kndarray
直接多项式项的系数。
另请参阅
invresz, residue, unique_roots
scipy.signal.invres
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.invres.html#scipy.signal.invres
scipy.signal.invres(r, p, k, tol=0.001, rtype='avg')
从分式展开计算 b(s) 和 a(s)。
如果 M 是分子 b 的次数,N 是分母 a 的次数:
b(s) b[0] s**(M) + b[1] s**(M-1) + ... + b[M]
H(s) = ------ = ------------------------------------------
a(s) a[0] s**(N) + a[1] s**(N-1) + ... + a[N]
然后,分式展开 H(s) 定义如下:
r[0] r[1] r[-1]
= -------- + -------- + ... + --------- + k(s)
(s-p[0]) (s-p[1]) (s-p[-1])
如果有任何重复的根(比 tol 更接近),那么 H(s) 就会有如下项:
r[i] r[i+1] r[i+n-1]
-------- + ----------- + ... + -----------
(s-p[i]) (s-p[i])**2 (s-p[i])**n
此函数用于正 s 或 z 的正幂多项式,如控制工程中的模拟滤波器或数字滤波器。对于 z 的负幂(DSP 中的数字滤波器典型情况),请使用 invresz。
参数:
rarray_like
对应于极点的残差。对于重复的极点,残差必须按升幂分数顺序排序。
parray_like
极点。相等的极点必须相邻。
karray_like
直接多项式项的系数。
tolfloat,可选
两个根被认为在它们之间的距离方面相等的容差。默认为 1e-3。有关详细信息,请参见 unique_roots。
rtype{‘avg’, ‘min’, ‘max’},可选
用于表示一组相同根的根的计算方法。默认为 ‘avg’。有关详细信息,请参见 unique_roots。
返回:
bndarray
分子多项式系数。
andarray
分母多项式系数。
另请参见
residue, invresz, unique_roots
scipy.signal.invresz
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.invresz.html#scipy.signal.invresz
scipy.signal.invresz(r, p, k, tol=0.001, rtype='avg')
从部分分数展开计算 b(z) 和 a(z)。
如果 M 是分子 b 的次数,N 是分母 a 的次数:
b(z) b[0] + b[1] z**(-1) + ... + b[M] z**(-M)
H(z) = ------ = ------------------------------------------
a(z) a[0] + a[1] z**(-1) + ... + a[N] z**(-N)
则部分分数展开 H(z) 定义为:
r[0] r[-1]
= --------------- + ... + ---------------- + k[0] + k[1]z**(-1) ...
(1-p[0]z**(-1)) (1-p[-1]z**(-1))
如果存在重复的根(距离小于tol),则部分分数展开式会有如下项:
r[i] r[i+1] r[i+n-1]
-------------- + ------------------ + ... + ------------------
(1-p[i]z**(-1)) (1-p[i]z**(-1))**2 (1-p[i]z**(-1))**n
此函数用于 z 的负幂次多项式,例如 DSP 中的数字滤波器。对于正幂次,请使用 invres。
参数:
rarray_like
与极点对应的残差。对于重复的极点,残差必须按幂升序排列。
parray_like
极点。相等的极点必须相邻。
karray_like
直接多项式项的系数。
tolfloat,可选
两个根被视为相等的公差。默认为 1e-3。有关详细信息,请参见 unique_roots。
rtype{‘avg’, ‘min’, ‘max’},可选
用于计算代表一组相同根的根的方法。默认为‘avg’。有关详细信息,请参见 unique_roots。
返回:
bndarray
分子多项式系数。
andarray
分母多项式系数。
另请参阅
residuez, unique_roots, invres
scipy.signal.BadCoefficients
exception scipy.signal.BadCoefficients
关于条件不佳的滤波器系数的警告
with_traceback()
Exception.with_traceback(tb) – 设置 self.traceback 为 tb 并返回 self。
scipy.signal.abcd_normalize
scipy.signal.abcd_normalize(A=None, B=None, C=None, D=None)
检查状态空间矩阵,并确保它们是二维的。
如果提供了关于系统的足够信息,即通过传递足够适当形状的数组到函数中,缺失的数组将从这些信息中构建,确保正确的行数和列数。否则会引发 ValueError。
参数:
A, B, C, Darray_like,可选
状态空间矩阵。所有矩阵默认为 None(缺失)。查看ss2tf 的格式。
返回:
A, B, C, Darray
适当形状的状态空间矩阵。
引发:
ValueError
如果没有提供关于系统的足够信息。
scipy.signal.band_stop_obj
scipy.signal.band_stop_obj(wp, ind, passb, stopb, gpass, gstop, type)
阻带目标函数以减少阶数。
返回模拟带阻滤波器的非整数阶数。
参数:
wpscalar
通带passb的边缘。
indint,{0, 1}
指定要变化的passb边缘的索引(0 或 1)。
passbndarray
两个固定通带边缘的二元序列。
stopbndarray
两个固定阻带边缘的二元序列。
gstopfloat
阻带中的衰减量(以 dB 为单位)。
gpassfloat
通带中的波动量(以 dB 为单位)。
type{‘butter’, ‘cheby’, ‘ellip’}
滤波器类型。
返回:
nscalar
滤波器阶数(可能是非整数)。
scipy.signal.besselap
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.besselap.html#scipy.signal.besselap
scipy.signal.besselap(N, norm='phase')
返回 N 阶 Bessel 滤波器的模拟原型 (z,p,k)。
参数:
Nint
滤波器的阶数。
norm{‘phase’, ‘delay’, ‘mag’}, 可选项
频率归一化:
phase
该滤波器经过归一化处理,使得相位响应在角(例如,rad/s)截止频率为 1 时达到其中点。这适用于低通和高通滤波器,因此这是“相位匹配”的情况。[6]
幅度响应渐近线与具有相同阶数和截止频率 Wn 的 Butterworth 滤波器相同。
这是默认设置,并与 MATLAB 的实现相匹配。
delay
该滤波器经过归一化处理,使得通带中的群延迟为 1 (例如,1 秒)。这是通过解 Bessel 多项式得到的“自然”类型
mag
该滤波器经过归一化处理,使得在角频率为 1 时,增益幅度为 -3 dB。这被 Bond 称为“频率归一化” [1]
新版本 0.18.0 中新增内容。
返回:
zndarray
传递函数的零点。始终为空数组。
pndarray
传递函数的极点。
kscalar
传递函数的增益。对于相位归一化,这总是 1。
另请参见
bessel
使用此原型进行滤波器设计函数
注释
要找到极点位置,首先生成普通 Bessel 多项式零点的近似起始点 [2],然后使用 Aberth-Ehrlich 方法 [4] [5] 对 Kv(x) Bessel 函数进行更精确的零点计算,然后将这些位置倒置到单位圆上。
参考文献
[1]
C.R. Bond, “Bessel 滤波器常数”, www.crbond.com/papers/bsf.pdf
[2]
Campos 和 Calderon, “Bessel 多项式零点的近似闭式公式”, arXiv:1105.0957.
[3]
Thomson, W.E., “具有最大平坦频率特性的延迟网络”, 电气工程师学会论文集, 第 III 部分, 1949 年 11 月, Vol. 96, No. 44, pp. 487-490.
[4]
Aberth, “同时找到多项式所有零点的迭代方法”, 计算数学, Vol. 27, No. 122, 1973 年 4 月
[5]
Ehrlich, “多项式的修改 Newton 方法”, ACM 通讯, Vol. 10, Issue 2, pp. 107-108, 1967 年 2 月, DOI:10.1145/363067.363115
[6]
Miller 和 Bohn 在 1998 年发表了题为“A Bessel Filter Crossover, and Its Relation to Others”的论文,《RaneNote 147》,www.ranecommercial.com/legacy/note147.html。
scipy.signal.buttap
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.buttap.html#scipy.signal.buttap
scipy.signal.buttap(N)
返回 N 阶 Butterworth 模拟原型的 (z, p, k)。
滤波器将具有 1 的角频率截止(例如,rad/s)。
另请参阅
使用此原型设计滤波器功能
scipy.signal.cheb1ap
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.cheb1ap.html#scipy.signal.cheb1ap
scipy.signal.cheb1ap(N, rp)
返回第 N 阶 Chebyshev 类型 I 模拟低通滤波器的(z,p,k)。
返回的滤波器原型在通带中具有rp分贝的波纹。
该滤波器的角频率(例如 rad/s)截止频率被归一化为 1,定义为增益首次低于-rp的点。
参见
cheby1
使用该原型设计滤波器函数
scipy.signal.cheb2ap
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.cheb2ap.html#scipy.signal.cheb2ap
scipy.signal.cheb2ap(N, rs)
返回第 N 阶切比雪夫二型模拟低通滤波器的 (z, p, k)。
返回的滤波器原型在阻带中至少具有rs分贝的衰减。
滤波器的角频率截止频率(例如 rad/s)标准化为 1,定义为衰减首次达到rs的点。
另见
cheby2
使用此原型设计滤波器功能
scipy.signal.cmplx_sort
scipy.signal.cmplx_sort(p)
scipy.signal.ellipap
原文链接:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.ellipap.html#scipy.signal.ellipap
scipy.signal.ellipap(N, rp, rs)
返回 N 阶椭圆模拟低通滤波器的(z,p,k)。
滤波器是一个归一化的原型,通带中有rp分贝的波纹,而阻带下降rs分贝。
滤波器的角频率(例如,rad/s)截止频率被归一化为 1,即增益首次低于-rp的点。
另见
使用这种原型进行滤波器设计功能
参考文献
[1]
Lutova、Tosic 和 Evans,《信号处理滤波器设计》,第五章和第十二章。
[2]
Orfanidis,《椭圆滤波器设计讲义》,www.ece.rutgers.edu/~orfanidi/ece521/notes.pdf
scipy.signal.lp2bp
原文链接:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.lp2bp.html#scipy.signal.lp2bp
scipy.signal.lp2bp(b, a, wo=1.0, bw=1.0)
将低通滤波器原型转换为带通滤波器。
返回一个模拟带通滤波器,其中心频率为wo,带宽为bw,从具有单位截止频率的模拟低通滤波器原型中获得,以传递函数(‘ba’)表示。
参数:
barray_like
分子多项式系数。
aarray_like
转换后的带通滤波器的分母多项式系数。
wofloat
所需的通带中心,作为角频率(例如,rad/s)。默认为不变。
bwfloat
所需的通带宽度,作为角频率(例如,rad/s)。默认为 1.
返回
barray_like
转换后的带通滤波器的分子多项式系数。
aarray_like
转换后的带通滤波器的分母多项式系数。
参见
lp2lp, lp2hp, lp2bs, bilinear
lp2bp_zpk
注释
这是从 s 平面替换导出的
[s \rightarrow \frac{s² + {\omega_0}²}{s \cdot \mathrm{BW}}]
这是“宽带”变换,产生以wo为中心的通带,具有几何(对数频率)关于wo的对称性。
示例
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> lp = signal.lti([1.0], [1.0, 1.0])
>>> bp = signal.lti(*signal.lp2bp(lp.num, lp.den))
>>> w, mag_lp, p_lp = lp.bode()
>>> w, mag_bp, p_bp = bp.bode(w)
>>> plt.plot(w, mag_lp, label='Lowpass')
>>> plt.plot(w, mag_bp, label='Bandpass')
>>> plt.semilogx()
>>> plt.grid(True)
>>> plt.xlabel('Frequency [rad/s]')
>>> plt.ylabel('Magnitude [dB]')
>>> plt.legend()
scipy.signal.lp2bp_zpk
scipy.signal.lp2bp_zpk(z, p, k, wo=1.0, bw=1.0)
将低通滤波器原型转换为带通滤波器。
返回一个模拟带通滤波器,其中心频率为wo,带宽为bw,来自具有单位截止频率的模拟低通滤波器原型,使用零点、极点和增益(‘zpk’)表示法。
参数:
zarray_like
模拟滤波器传递函数的零点。
parray_like
模拟滤波器传递函数的极点。
kfloat
模拟滤波器传递函数的系统增益。
wofloat
期望的通带中心,作为角频率(例如,rad/s)。默认不变。
bwfloat
期望的通带宽度,作为角频率(例如,rad/s)。默认为 1。
返回:
zndarray
转换后的带通滤波器传递函数的零点。
pndarray
转换后的带通滤波器传递函数的极点。
kfloat
转换后带通滤波器的系统增益。
另请参见
lp2lp_zpk, lp2hp_zpk, lp2bs_zpk, bilinear
lp2bp
注意
这是从 s 平面代换推导出的。
[s \rightarrow \frac{s² + {\omega_0}²}{s \cdot \mathrm{BW}}]
这是“宽带”变换,产生具有wo的频率对称的通带(对数频率)。
1.1.0 版中的新增功能。
示例
使用低通滤波器的‘zpk’(零极点增益)表示法将其转换为带通滤波器,其中心频率为 wo,带宽为 bw。
>>> from scipy.signal import lp2bp_zpk
>>> z = [ 5 + 2j , 5 - 2j ]
>>> p = [ 7 , -16 ]
>>> k = 0.8
>>> wo = 0.62
>>> bw = 15
>>> lp2bp_zpk(z, p, k, wo, bw)
( array([7.49955815e+01+3.00017676e+01j, 7.49955815e+01-3.00017676e+01j,
4.41850748e-03-1.76761126e-03j, 4.41850748e-03+1.76761126e-03j]),
array([1.04996339e+02+0.j, -1.60167736e-03+0.j, 3.66108003e-03+0.j,
-2.39998398e+02+0.j]), 0.8)
scipy.signal.lp2bs
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.lp2bs.html#scipy.signal.lp2bs
scipy.signal.lp2bs(b, a, wo=1.0, bw=1.0)
将低通滤波器原型转换为带阻滤波器。
从单位截止频率的模拟低通滤波器原型转换为带阻滤波器,其传递函数('ba'表示)中心频率为wo,带宽为bw。
参数:
barray_like
转换后带阻滤波器的分子多项式系数。
aarray_like
转换后带阻滤波器的分母多项式系数。
wofloat
所需阻带中心,作为角频率(例如,rad/s)。默认为无变化。
bwfloat
所需阻带宽度,作为角频率(例如,rad/s)。默认为 1。
返回:
barray_like
转换后带阻滤波器的分子多项式系数。
aarray_like
转换后带阻滤波器的分母多项式系数。
另请参阅
lp2lp,lp2hp,lp2bp,bilinear
lp2bs_zpk
注意
这是从 s 平面替换派生出来的。
[s \rightarrow \frac{s \cdot \mathrm{BW}}{s² + {\omega_0}²}]
这是“宽带”变换,产生围绕wo具有几何(对数频率)对称性的阻带。
示例
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> lp = signal.lti([1.0], [1.0, 1.5])
>>> bs = signal.lti(*signal.lp2bs(lp.num, lp.den))
>>> w, mag_lp, p_lp = lp.bode()
>>> w, mag_bs, p_bs = bs.bode(w)
>>> plt.plot(w, mag_lp, label='Lowpass')
>>> plt.plot(w, mag_bs, label='Bandstop')
>>> plt.semilogx()
>>> plt.grid(True)
>>> plt.xlabel('Frequency [rad/s]')
>>> plt.ylabel('Magnitude [dB]')
>>> plt.legend()
scipy.signal.lp2bs_zpk
scipy.signal.lp2bs_zpk(z, p, k, wo=1.0, bw=1.0)
将低通滤波器原型变换为带阻滤波器。
返回一个模拟带阻滤波器,其中心频率为wo,阻带宽度为bw,从具有单位截止频率的模拟低通滤波器原型使用零点、极点和增益(‘zpk’)表示。
参数:
zarray_like
模拟滤波器传递函数的零点。
parray_like
模拟滤波器传递函数的极点。
kfloat
模拟滤波器传递函数的系统增益。
wofloat
所需的阻带中心,作为角频率(例如,rad/s)。默认无变化。
bwfloat
所需的阻带宽度,作为角频率(例如,rad/s)。默认为 1。
返回值:
zndarray
变换后带阻滤波器传递函数的零点。
pndarray
变换后带阻滤波器传递函数的极点。
kfloat
变换后带阻滤波器的系统增益。
参见
lp2lp_zpk, lp2hp_zpk, lp2bp_zpk, bilinear
lp2bs
注意
这是从 s 平面替换推导出来的
[s \rightarrow \frac{s \cdot \mathrm{BW}}{s² + {\omega_0}²}]
这是“宽带”变换,产生一个以wo为中心频率的阻带,具有几何(对数频率)对称性。
1.1.0 版本中的新功能。
示例
将以‘zpk’(零极点增益)形式表示的低通滤波器转换为以‘zpk’形式表示的带阻滤波器,中心频率为 wo,带宽为 bw。
>>> from scipy.signal import lp2bs_zpk
>>> z = [ ]
>>> p = [ 0.7 , -1 ]
>>> k = 9
>>> wo = 0.5
>>> bw = 10
>>> lp2bs_zpk(z, p, k, wo, bw)
( array([0.+0.5j, 0.+0.5j, 0.-0.5j, 0.-0.5j]),
array([14.2681928 +0.j, -0.02506281+0.j, 0.01752149+0.j, -9.97493719+0.j]),
-12.857142857142858)
scipy.signal.lp2hp
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.lp2hp.html#scipy.signal.lp2hp
scipy.signal.lp2hp(b, a, wo=1.0)
将低通滤波器原型变换为高通滤波器。
从具有单位截止频率的模拟低通滤波器原型转换为具有截止频率 wo 的模拟高通滤波器,以传递函数(‘ba’)表示。
参数:
barray_like
转换后的高通滤波器的分子多项式系数。
aarray_like
分母多项式系数。
wofloat
所需的截止频率,作为角频率(例如,rad/s)。默认为不变。
返回:
barray_like
转换后的高通滤波器的分子多项式系数。
aarray_like
转换后的高通滤波器的分母多项式系数。
See also
lp2lp, lp2bp, lp2bs, bilinear
lp2hp_zpk
注意事项
这是从 s 平面替换导出的。
[s \rightarrow \frac{\omega_0}{s}]
这在对数尺度上保持了低通和高通响应的对称性。
示例
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> lp = signal.lti([1.0], [1.0, 1.0])
>>> hp = signal.lti(*signal.lp2hp(lp.num, lp.den))
>>> w, mag_lp, p_lp = lp.bode()
>>> w, mag_hp, p_hp = hp.bode(w)
>>> plt.plot(w, mag_lp, label='Lowpass')
>>> plt.plot(w, mag_hp, label='Highpass')
>>> plt.semilogx()
>>> plt.grid(True)
>>> plt.xlabel('Frequency [rad/s]')
>>> plt.ylabel('Magnitude [dB]')
>>> plt.legend()
scipy.signal.lp2hp_zpk
scipy.signal.lp2hp_zpk(z, p, k, wo=1.0)
将低通滤波器原型转换为高通滤波器。
返回具有单位截止频率的模拟低通滤波器原型的模拟高通滤波器,使用零点、极点和增益('zpk')表示。
参数:
zarray_like
模拟滤波器传递函数的零点。
parray_like
模拟滤波器传递函数的极点。
kfloat
模拟滤波器传递函数的系统增益。
wofloat
所需截止频率,作为角频率(例如,rad/s)。默认为不变。
返回:
zndarray
转换后的模拟高通滤波器传递函数的零点。
pndarray
转换后的模拟高通滤波器传递函数的极点。
kfloat
转换后的模拟高通滤波器的系统增益。
另请参见
lp2lp_zpk, lp2bp_zpk, lp2bs_zpk, bilinear
lp2hp
注:
这是从 s 平面替换导出的。
[s \rightarrow \frac{\omega_0}{s}]
这保持了低通和高通响应在对数尺度上的对称性。
新功能版本 1.1.0 中引入。
示例
使用低通滤波器的“zpk”(零-极点-增益)表示将其转换为具有截止频率 wo 的高通滤波器。
>>> from scipy.signal import lp2hp_zpk
>>> z = [ -2 + 3j , -0.5 - 0.8j ]
>>> p = [ -1 , -4 ]
>>> k = 10
>>> wo = 0.6
>>> lp2hp_zpk(z, p, k, wo)
( array([-0.09230769-0.13846154j, -0.33707865+0.53932584j]),
array([-0.6 , -0.15]),
8.5)
scipy.signal.lp2lp
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.lp2lp.html#scipy.signal.lp2lp
scipy.signal.lp2lp(b, a, wo=1.0)
将一个低通滤波器原型转换到不同的频率。
从模拟低通滤波器原型(单位截止频率)的模拟低通滤波器返回带截止频率 wo 的传递函数('ba')表示。
参数:
barray_like
分子多项式系数。
aarray_like
分母多项式系数。
wofloat
期望的截止频率,作为角频率(例如 rad/s)。默认为无变化。
返回:
barray_like
被转换的低通滤波器的分子多项式系数。
aarray_like
被转换的低通滤波器的分母多项式系数。
另请参见
注意事项
这是从 s 平面替换导出的
[s \rightarrow \frac{s}{\omega_0}]
示例
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> lp = signal.lti([1.0], [1.0, 1.0])
>>> lp2 = signal.lti(*signal.lp2lp(lp.num, lp.den, 2))
>>> w, mag_lp, p_lp = lp.bode()
>>> w, mag_lp2, p_lp2 = lp2.bode(w)
>>> plt.plot(w, mag_lp, label='Lowpass')
>>> plt.plot(w, mag_lp2, label='Transformed Lowpass')
>>> plt.semilogx()
>>> plt.grid(True)
>>> plt.xlabel('Frequency [rad/s]')
>>> plt.ylabel('Magnitude [dB]')
>>> plt.legend()
scipy.signal.lp2lp_zpk
scipy.signal.lp2lp_zpk(z, p, k, wo=1.0)
将一个低通滤波器原型转换到不同的频率。
返回一个模拟低通滤波器,其截止频率 wo 来自具有单位截止频率的模拟低通滤波器原型,使用零点、极点和增益(‘zpk’)表示。
参数:
zarray_like
模拟滤波器传递函数的零点。
parray_like
模拟滤波器传递函数的极点。
kfloat
模拟滤波器传递函数的系统增益。
wofloat
所需截止频率,作为角频率(例如,rad/s)。默认情况下无变化。
返回:
zndarray
转换后的低通滤波器传递函数的零点。
pndarray
转换后的低通滤波器传递函数的极点。
kfloat
转换后的低通滤波器的系统增益。
参见
lp2hp_zpk, lp2bp_zpk, lp2bs_zpk, bilinear
lp2lp
注意事项
这是从 s 平面替换得到
[s \rightarrow \frac{s}{\omega_0}]
版本 1.1.0 中的新功能。
示例
使用‘zpk’(零-极点-增益)表示低通滤波器,将其转换为一个新的‘zpk’表示,关联的截止频率为 wo。
>>> from scipy.signal import lp2lp_zpk
>>> z = [7, 2]
>>> p = [5, 13]
>>> k = 0.8
>>> wo = 0.4
>>> lp2lp_zpk(z, p, k, wo)
( array([2.8, 0.8]), array([2\. , 5.2]), 0.8)
scipy.signal.normalize
scipy.signal.normalize(b, a)
规范化连续时间传递函数的分子/分母。
如果 b 的值太接近 0,则将其移除。在这种情况下,会发出 BadCoefficients 警告。
参数:
b:array_like
传递函数的分子。可以是 2-D 数组,用于规范化多个传递函数。
a:array_like
传递函数的分母。最多为 1-D。
返回:
num:数组
规范化传递函数的分子。至少是一个 1-D 数组。如果输入的 num 是 2-D 数组,则为 2-D 数组。
den:1-D 数组
规范化传递函数的分母。
注释
系数应按降幂顺序指定,分子和分母(例如,s² + 3s + 5应表示为[1, 3, 5])。
示例
>>> from scipy.signal import normalize
规范化传递函数的系数 (3*s² - 2*s + 5) / (2*s² + 3*s + 1):
>>> b = [3, -2, 5]
>>> a = [2, 3, 1]
>>> normalize(b, a)
(array([ 1.5, -1\. , 2.5]), array([1\. , 1.5, 0.5]))
如果例如 b 的第一个系数为 0,则会生成警告。在下面的示例中,结果符合预期:
>>> import warnings
>>> with warnings.catch_warnings(record=True) as w:
... num, den = normalize([0, 3, 6], [2, -5, 4])
>>> num
array([1.5, 3\. ])
>>> den
array([ 1\. , -2.5, 2\. ])
>>> print(w[0].message)
Badly conditioned filter coefficients (numerator): the results may be meaningless
scipy.signal.butter
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.butter.html#scipy.signal.butter
scipy.signal.butter(N, Wn, btype='low', analog=False, output='ba', fs=None)
巴特沃斯数字和模拟滤波器设计。
设计第 N 阶数字或模拟巴特沃斯滤波器并返回滤波器系数。
参数:
N整数
滤波器的阶数。对于‘带通’和‘带阻’滤波器,所得二阶段(‘sos’)矩阵的最终阶数为2*N,其中N是所需系统的双二阶段节的数量。
Wn类似数组
临界频率或频率。对于低通和高通滤波器,Wn 为标量;对于带通和带阻滤波器,Wn 为长度为 2 的序列。
对于巴特沃斯滤波器,这是增益降到通过带的 1/sqrt(2)的点(“-3 dB 点”)。
对于数字滤波器,如果未指定fs,Wn单位被归一化为 0 到 1,其中 1 是奈奎斯特频率(Wn因此为半周期/样本,定义为 2临界频率/fs)。如果指定了fs*,Wn与fs单位相同。
对于模拟滤波器,Wn是一个角频率(例如 rad/s)。
btype{‘低通’,‘高通’,‘带通’,‘带阻’},可选
滤波器类型。默认为‘低通’。
模拟布尔型,可选
当设置为 True 时,返回模拟滤波器,否则返回数字滤波器。
输出{‘ba’, ‘zpk’, ‘sos’},可选
输出类型:分子/分母(‘ba’)、极点零点(‘zpk’)或二阶段(‘sos’)。默认为‘ba’以保持向后兼容性,但应用于通用滤波的‘sos’应该被使用。
fs浮点数,可选
数字系统的采样频率。
版本 1.2.0 中的新功能。
返回:
b, a数组,数组
IIR 滤波器的分子(b)和分母(a)多项式。仅在output='ba'时返回。
z, p, k数组,数组,浮点数
IIR 滤波器传递函数的零点、极点和系统增益。仅在output='zpk'时返回。
sos数组
IIR 滤波器的二阶段表示。仅在output='sos'时返回。
另请参见
注释
巴特沃斯滤波器在通过带中具有最大平坦频率响应。
'sos'输出参数于 0.16.0 中添加。
如果请求传递函数形式[b, a],则可能会出现数值问题,因为在 N >= 4 的情况下,根和多项式系数之间的转换是一种数值敏感的操作。建议使用 SOS 表示。
警告
在 TF 形式中设计高阶和窄带 IIR 滤波器可能由于浮点数精度问题导致不稳定或不正确的滤波。考虑检查输出滤波器特性 freqz 或通过 output='sos' 设计二阶段滤波器。
示例
设计一个模拟滤波器并绘制其频率响应图,显示关键点:
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> b, a = signal.butter(4, 100, 'low', analog=True)
>>> w, h = signal.freqs(b, a)
>>> plt.semilogx(w, 20 * np.log10(abs(h)))
>>> plt.title('Butterworth filter frequency response')
>>> plt.xlabel('Frequency [radians / second]')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.axvline(100, color='green') # cutoff frequency
>>> plt.show()
生成一个由 10 Hz 和 20 Hz 组成、1 kHz 采样的信号
>>> t = np.linspace(0, 1, 1000, False) # 1 second
>>> sig = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t)
>>> fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
>>> ax1.plot(t, sig)
>>> ax1.set_title('10 Hz and 20 Hz sinusoids')
>>> ax1.axis([0, 1, -2, 2])
设计一个数字高通滤波器,在 15 Hz 处去除 10 Hz 的分量,并将其应用于信号。(建议在滤波时使用二阶段格式,避免传递函数 (ba) 格式的数值误差):
>>> sos = signal.butter(10, 15, 'hp', fs=1000, output='sos')
>>> filtered = signal.sosfilt(sos, sig)
>>> ax2.plot(t, filtered)
>>> ax2.set_title('After 15 Hz high-pass filter')
>>> ax2.axis([0, 1, -2, 2])
>>> ax2.set_xlabel('Time [seconds]')
>>> plt.tight_layout()
>>> plt.show()
scipy.signal.buttord
原文链接:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.buttord.html#scipy.signal.buttord
scipy.signal.buttord(wp, ws, gpass, gstop, analog=False, fs=None)
巴特沃斯滤波器阶数选择。
返回损失不超过gpass dB 的通带和阻带至少gstop dB 衰减的最低阶数字或模拟巴特沃斯滤波器的阶数。
参数:
wp, wsfloat
通带和阻带边缘频率。
对于数字滤波器,这些单位与fs相同。默认情况下,fs为 2 个半周期/样本,因此这些单位在 0 到 1 之间归一化,其中 1 为奈奎斯特频率。因此,wp和ws以半周期/样本计。例如:
- 低通:wp = 0.2,ws = 0.3
- 高通:wp = 0.3,ws = 0.2
- 带通:wp = [0.2, 0.5],ws = [0.1, 0.6]
- 带阻:wp = [0.1, 0.6],ws = [0.2, 0.5]
对于模拟滤波器,wp和ws是角频率(例如,rad/s)。
gpassfloat
通带中的最大损失(dB)。
gstopfloat
阻带中的最小衰减(dB)。
analogbool,可选
当为 True 时,返回模拟滤波器,否则返回数字滤波器。
fsfloat,可选
数字系统的采样频率。
自 1.2.0 版本新增。
返回:
ordint
满足规格的最低巴特沃斯滤波器阶数。
wnndarray 或 float
巴特沃斯自然频率(即“3dB 频率”)。应与butter一起使用以提供滤波器结果。如果指定了fs,则单位相同,同时必须将fs传递给butter。
参见:
使用阶数和关键点进行滤波器设计
从通带和阻带规格中查找阶数和关键点
使用阶数和关键频率进行一般滤波器设计
使用通带和阻带规格进行一般滤波器设计
示例
设计一个模拟带通滤波器,通带内从 20 到 50 rad/s 的损失不超过 3 dB,同时在 14 rad/s 以下和 60 rad/s 以上至少有-40 dB 的衰减。绘制其频率响应图,显示通带和阻带约束为灰色。
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> N, Wn = signal.buttord([20, 50], [14, 60], 3, 40, True)
>>> b, a = signal.butter(N, Wn, 'band', True)
>>> w, h = signal.freqs(b, a, np.logspace(1, 2, 500))
>>> plt.semilogx(w, 20 * np.log10(abs(h)))
>>> plt.title('Butterworth bandpass filter fit to constraints')
>>> plt.xlabel('Frequency [radians / second]')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.grid(which='both', axis='both')
>>> plt.fill([1, 14, 14, 1], [-40, -40, 99, 99], '0.9', lw=0) # stop
>>> plt.fill([20, 20, 50, 50], [-99, -3, -3, -99], '0.9', lw=0) # pass
>>> plt.fill([60, 60, 1e9, 1e9], [99, -40, -40, 99], '0.9', lw=0) # stop
>>> plt.axis([10, 100, -60, 3])
>>> plt.show()
scipy.signal.cheby1
原文链接:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.cheby1.html#scipy.signal.cheby1
scipy.signal.cheby1(N, rp, Wn, btype='low', analog=False, output='ba', fs=None)
Chebyshev 类型 I 数字和模拟滤波器设计。
设计 N 阶数字或模拟 Chebyshev 类型 I 滤波器并返回滤波器系数。
参数:
N整数
滤波器的阶数。
rp浮点数
允许通过通带下方的最大纹波。以分贝为单位,作为正数。
Wn数组类型
一个标量或长度为 2 的序列,给出关键频率。对于类型 I 滤波器,这是在增益首次降至-rp的过渡带中的点。
对于数字滤波器,Wn与fs具有相同的单位。默认情况下,fs为每样本 2 个半周期,因此这些被归一化为 0 到 1,其中 1 为奈奎斯特频率。 (Wn因此在半周期/样本中。)
对于模拟滤波器,Wn是角频率(例如,rad/s)。
btype{‘lowpass’,‘highpass’,‘bandpass’,‘bandstop’},可选
滤波器的类型。默认为‘低通’。
analog布尔型,可选
当为 True 时,返回模拟滤波器,否则返回数字滤波器。
output{‘ba’,‘zpk’,‘sos’},可选
输出类型:分子/分母(‘ba’),极点-零点(‘zpk’)或二阶段(‘sos’)。默认为‘ba’以保持向后兼容性,但一般用于过滤的‘sos’应该使用。
fs浮点数,可选
数字系统的采样频率。
新版本 1.2.0 中新增。
返回:
b, a数组,数组
IIR 滤波器的分子(b)和分母(a)多项式。仅在output='ba'时返回。
z, p, k数组,数组,浮点数
IIR 滤波器传递函数的零点、极点和系统增益。仅在output='zpk'时返回。
sos数组
IIR 滤波器的二阶段表示。仅在output='sos'时返回。
另请参阅
注意事项
Chebyshev 类型 I 滤波器在频率响应的通带和阻带之间的切换速率最大化,但代价是通带中的纹波增加和阶跃响应中的增加振荡。
类型 I 滤波器比类型 II 滤波器(cheby2)更快地衰减,但类型 II 滤波器在通带中没有任何纹波。
均波通带有 N 个最大或最小值(例如,5 阶滤波器具有 3 个最大值和 2 个最小值)。因此,奇数阶滤波器的直流增益为单位,偶数阶滤波器为-rp dB。
'sos'输出参数在 0.16.0 中添加。
示例
设计模拟滤波器并绘制其频率响应图,显示关键点:
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> b, a = signal.cheby1(4, 5, 100, 'low', analog=True)
>>> w, h = signal.freqs(b, a)
>>> plt.semilogx(w, 20 * np.log10(abs(h)))
>>> plt.title('Chebyshev Type I frequency response (rp=5)')
>>> plt.xlabel('Frequency [radians / second]')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.axvline(100, color='green') # cutoff frequency
>>> plt.axhline(-5, color='green') # rp
>>> plt.show()
生成一个由 10 Hz 和 20 Hz 组成的信号,采样频率为 1 kHz
>>> t = np.linspace(0, 1, 1000, False) # 1 second
>>> sig = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t)
>>> fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
>>> ax1.plot(t, sig)
>>> ax1.set_title('10 Hz and 20 Hz sinusoids')
>>> ax1.axis([0, 1, -2, 2])
设计一个数字高通滤波器,在 15 Hz 处去除 10 Hz 的音调,并将其应用到信号中。(在滤波时建议使用二阶段格式,以避免使用传递函数(ba)格式时的数值误差):
>>> sos = signal.cheby1(10, 1, 15, 'hp', fs=1000, output='sos')
>>> filtered = signal.sosfilt(sos, sig)
>>> ax2.plot(t, filtered)
>>> ax2.set_title('After 15 Hz high-pass filter')
>>> ax2.axis([0, 1, -2, 2])
>>> ax2.set_xlabel('Time [seconds]')
>>> plt.tight_layout()
>>> plt.show()
scipy.signal.cheb1ord
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.cheb1ord.html#scipy.signal.cheb1ord
scipy.signal.cheb1ord(wp, ws, gpass, gstop, analog=False, fs=None)
切比雪夫 I 型滤波器阶数选择。
返回数字或模拟切比雪夫 I 型滤波器的最低阶数,其在通带内不超过gpass dB 的损失,并且在阻带至少有gstop dB 的衰减。
参数:
wp, wsfloat
通带和阻带的边缘频率。
对于数字滤波器,这些单位与fs相同。默认情况下,fs是每样本 2 个半周期,因此这些单位归一化为 0 到 1,其中 1 是奈奎斯特频率。 (wp和ws因此在半周期/样本中。) 例如:
- 低通:wp = 0.2, ws = 0.3
- 高通:wp = 0.3, ws = 0.2
- 带通:wp = [0.2, 0.5], ws = [0.1, 0.6]
- 带阻:wp = [0.1, 0.6], ws = [0.2, 0.5]
对于模拟滤波器,wp和ws是角频率(例如,rad/s)。
gpassfloat
通带内的最大损失(dB)。
gstopfloat
阻带中的最小衰减(dB)。
analogbool, optional
如果为 True,则返回模拟滤波器,否则返回数字滤波器。
fsfloat, optional
数字系统的采样频率。
1.2.0 版本的新功能。
返回:
ordint
满足规格的切比雪夫 I 型滤波器的最低阶数。
wnndarray 或 float
切比雪夫自然频率(“3 dB 频率”),用于与cheby1一起提供滤波器结果。如果指定了fs,则以相同的单位表示,必须同时传递给cheby1。
另请参见
cheby1
使用通带和阻带规格进行滤波器设计
buttord
从通带和阻带规格中找到阶数和关键点
cheb2ord, ellipord
iirfilter
使用阶数和关键频率进行通用滤波器设计。
iirdesign
使用通带和阻带规格查找阶数和关键点
示例
设计数字低通滤波器,使其通带在 0.2*(fs/2)内保持在 3 dB 以内,同时在 0.3*(fs/2)以上至少拒绝-40 dB。在灰色中显示其频率响应曲线,展示通带和阻带的限制。
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> N, Wn = signal.cheb1ord(0.2, 0.3, 3, 40)
>>> b, a = signal.cheby1(N, 3, Wn, 'low')
>>> w, h = signal.freqz(b, a)
>>> plt.semilogx(w / np.pi, 20 * np.log10(abs(h)))
>>> plt.title('Chebyshev I lowpass filter fit to constraints')
>>> plt.xlabel('Normalized frequency')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.grid(which='both', axis='both')
>>> plt.fill([.01, 0.2, 0.2, .01], [-3, -3, -99, -99], '0.9', lw=0) # stop
>>> plt.fill([0.3, 0.3, 2, 2], [ 9, -40, -40, 9], '0.9', lw=0) # pass
>>> plt.axis([0.08, 1, -60, 3])
>>> plt.show()
scipy.signal.cheby2
原文链接:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.cheby2.html#scipy.signal.cheby2
scipy.signal.cheby2(N, rs, Wn, btype='low', analog=False, output='ba', fs=None)
Chebyshev type II 数字和模拟滤波器设计。
设计一个 N 阶数字或模拟 Chebyshev type II 滤波器并返回滤波器系数。
参数:
Nint
滤波器的阶数。
rsfloat
在停止带中所需的最小衰减。以分贝表示,作为正数。
Wn array_like
一个标量或长度为 2 的序列,给出关键频率。对于 Type II 滤波器,这是增益首次达到 -rs 的过渡带中的点。
对于数字滤波器,Wn 的单位与 fs 相同。默认情况下,fs 是每样本 2 个半周期,因此这些值在 0 到 1 之间归一化,其中 1 是奈奎斯特频率。 (Wn 因此是半周期 / 样本。)
对于模拟滤波器,Wn 是一个角频率(例如,rad/s)。
类型{‘低通’, ‘高通’, ‘带通’, ‘带阻’},可选
滤波器类型。默认为‘低通’。
模拟bool,可选
当为 True 时,返回模拟滤波器,否则返回数字滤波器。
输出{‘ba’, ‘zpk’, ‘sos’},可选
输出类型:分子/分母(‘ba’)、极点-零点(‘zpk’)或二阶段(‘sos’)。默认为 ‘ba’,为了向后兼容性,但一般用于滤波的 ‘sos’ 应该使用。
fsfloat,可选
数字系统的采样频率。
新功能,版本 1.2.0 中添加。
返回:
b, a ndarray, ndarray
IIR 滤波器的分子(b)和分母(a)多项式。仅当 output='ba' 时返回。
z, p, k ndarray, ndarray, float
IIR 滤波器传递函数的零点、极点和系统增益。仅当 output='zpk' 时返回。
sos ndarray
IIR 滤波器的二阶段表示。仅当 output='sos' 时返回。
另见
注:
Chebyshev type II 滤波器最大化通频带和阻带之间的截止速率,但以阻带中的波纹和阶跃响应中的增加振荡为代价。
Type II 滤波器不像 Type I 那样快速衰减(cheby1)。
'sos' 输出参数在版本 0.16.0 中添加。
示例
设计一个模拟滤波器并绘制其频率响应,显示关键点:
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> b, a = signal.cheby2(4, 40, 100, 'low', analog=True)
>>> w, h = signal.freqs(b, a)
>>> plt.semilogx(w, 20 * np.log10(abs(h)))
>>> plt.title('Chebyshev Type II frequency response (rs=40)')
>>> plt.xlabel('Frequency [radians / second]')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.axvline(100, color='green') # cutoff frequency
>>> plt.axhline(-40, color='green') # rs
>>> plt.show()
生成一个由 10 Hz 和 20 Hz 组成的信号,采样频率为 1 kHz
>>> t = np.linspace(0, 1, 1000, False) # 1 second
>>> sig = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t)
>>> fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
>>> ax1.plot(t, sig)
>>> ax1.set_title('10 Hz and 20 Hz sinusoids')
>>> ax1.axis([0, 1, -2, 2])
设计一个数字高通滤波器,截止频率为 17 Hz,以去除 10 Hz 音调,并将其应用于信号。(在滤波时推荐使用二阶段格式,以避免传递函数 (ba) 格式的数值误差):
>>> sos = signal.cheby2(12, 20, 17, 'hp', fs=1000, output='sos')
>>> filtered = signal.sosfilt(sos, sig)
>>> ax2.plot(t, filtered)
>>> ax2.set_title('After 17 Hz high-pass filter')
>>> ax2.axis([0, 1, -2, 2])
>>> ax2.set_xlabel('Time [seconds]')
>>> plt.show()
scipy.signal.cheb2ord
原文链接:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.cheb2ord.html#scipy.signal.cheb2ord
scipy.signal.cheb2ord(wp, ws, gpass, gstop, analog=False, fs=None)
Chebyshev II 类型滤波器阶数选择。
返回不超过 gpass dB 的通带损失且在阻带中至少具有 gstop dB 衰减的最低阶数字或模拟 Chebyshev II 类型滤波器的阶数。
参数:
wp, ws:浮点数
通带和阻带边缘频率。
对于数字滤波器,这些单位与 fs 相同。默认情况下,fs 为 2 半周期/样本,因此这些值归一化为 0 到 1,其中 1 是奈奎斯特频率。(wp 和 ws 因此在半周期/样本中。) 例如:
- 低通:wp = 0.2,ws = 0.3
- 高通:wp = 0.3,ws = 0.2
- 带通:wp = [0.2, 0.5],ws = [0.1, 0.6]
- 带阻带:wp = [0.1, 0.6],ws = [0.2, 0.5]
对于模拟滤波器,wp 和 ws 是角频率(例如,rad/s)。
gpass:浮点数
通带中的最大损失(dB)。
gstop:浮点数
阻带中的最小衰减(dB)。
analog:布尔值,可选
当为 True 时,返回模拟滤波器,否则返回数字滤波器。
fs:浮点数,可选
数字系统的采样频率。
1.2.0 版中的新内容。
返回:
ord:整数
满足规格要求的 Chebyshev II 类型滤波器的最低阶数。
wn:ndarray 或 浮点数
Chebyshev 自然频率(“3dB 频率”),用于与 cheby2 结合以获得滤波器结果。如果指定了 fs,则单位相同,同时必须将 fs 传递给 cheby2。
另请参阅
使用阶数和临界点设计滤波器
从通带和阻带规格中找到阶数和临界点
使用阶数和临界频率进行一般滤波器设计
使用通带和阻带规格的一般滤波器设计
示例
设计一个数字带阻滤波器,从 0.2*(fs/2) 到 0.5*(fs/2) 拒绝 -60 dB,同时保持在 0.1*(fs/2) 以下或 0.6*(fs/2) 以上的 3 dB 内。绘制其频率响应图,显示通带和阻带约束为灰色。
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> N, Wn = signal.cheb2ord([0.1, 0.6], [0.2, 0.5], 3, 60)
>>> b, a = signal.cheby2(N, 60, Wn, 'stop')
>>> w, h = signal.freqz(b, a)
>>> plt.semilogx(w / np.pi, 20 * np.log10(abs(h)))
>>> plt.title('Chebyshev II bandstop filter fit to constraints')
>>> plt.xlabel('Normalized frequency')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.grid(which='both', axis='both')
>>> plt.fill([.01, .1, .1, .01], [-3, -3, -99, -99], '0.9', lw=0) # stop
>>> plt.fill([.2, .2, .5, .5], [ 9, -60, -60, 9], '0.9', lw=0) # pass
>>> plt.fill([.6, .6, 2, 2], [-99, -3, -3, -99], '0.9', lw=0) # stop
>>> plt.axis([0.06, 1, -80, 3])
>>> plt.show()
scipy.signal.ellip
原文:
docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.ellip.html#scipy.signal.ellip
scipy.signal.ellip(N, rp, rs, Wn, btype='low', analog=False, output='ba', fs=None)
椭圆(Cauer)数字和模拟滤波器设计。
设计一个 N 阶数字或模拟椭圆滤波器并返回滤波器系数。
参数:
N 整数
滤波器的阶数。
rp 浮点数
允许通过通带下方的最大波纹。以分贝表示,为正数。
rs 浮点数
在停止带中所需的最小衰减。以分贝表示,为正数。
Wn array_like
一个标量或长度为 2 的序列,给出关键频率。对于椭圆滤波器,这是增益第一次低于-rp的过渡带中的点。
对于数字滤波器,Wn与fs具有相同的单位。默认情况下,fs为 2 个半周期/样本,因此这些值在 0 到 1 之间归一化,其中 1 是奈奎斯特频率。 (Wn因此在半周期/样本中。)
对于模拟滤波器,Wn是角频率(例如,rad/s)。
btype {‘lowpass’,‘highpass’,‘bandpass’,‘bandstop’},可选
滤波器的类型。默认为‘lowpass’。
analog 布尔值,可选
当为 True 时,返回模拟滤波器,否则返回数字滤波器。
output {‘ba’,‘zpk’,‘sos’},可选
输出类型:分子/分母(‘ba’)、极点-零点(‘zpk’)或二阶段(‘sos’)。默认为‘ba’以保持向后兼容性,但一般用于通用滤波应该使用‘sos’。
fs浮点数,可选
数字系统的采样频率。
新版本 1.2.0 中新增。
返回:
b, a ndarray, ndarray
IIR 滤波器的分子(b)和分母(a)多项式。仅在output='ba'时返回。
z, p, k ndarray, ndarray, 浮点数
IIR 滤波器传递函数的零点、极点和系统增益。仅在output='zpk'时返回。
sos ndarray
IIR 滤波器的二阶段表示。仅在output='sos'时返回。
另见
ellipord,ellipap
注意
也称为 Cauer 或 Zolotarev 滤波器,椭圆滤波器在频率响应的通带和阻带之间的过渡速率最大化,但牺牲了两者的波纹,并增加了阶跃响应中的振荡。
当rp接近 0 时,椭圆滤波器变成 Chebyshev II 型滤波器(cheby2)。当rs接近 0 时,它变成 Chebyshev I 型滤波器(cheby1)。当两者都接近 0 时,它变成 Butterworth 滤波器(butter)。
等纹通带有 N 个极大值或极小值(例如,一个 5 阶滤波器有 3 个极大值和 2 个极小值)。因此,奇阶滤波器的直流增益为单位,偶阶滤波器为 -rp dB。
'sos' 输出参数在 0.16.0 版本中被添加。
示例
设计一个模拟滤波器,并绘制其频率响应图,显示关键点:
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> b, a = signal.ellip(4, 5, 40, 100, 'low', analog=True)
>>> w, h = signal.freqs(b, a)
>>> plt.semilogx(w, 20 * np.log10(abs(h)))
>>> plt.title('Elliptic filter frequency response (rp=5, rs=40)')
>>> plt.xlabel('Frequency [radians / second]')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.axvline(100, color='green') # cutoff frequency
>>> plt.axhline(-40, color='green') # rs
>>> plt.axhline(-5, color='green') # rp
>>> plt.show()
生成由 10 Hz 和 20 Hz 组成的信号,采样频率为 1 kHz。
>>> t = np.linspace(0, 1, 1000, False) # 1 second
>>> sig = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t)
>>> fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
>>> ax1.plot(t, sig)
>>> ax1.set_title('10 Hz and 20 Hz sinusoids')
>>> ax1.axis([0, 1, -2, 2])
设计一个数字高通滤波器,截止频率为 17 Hz,以去除 10 Hz 分量,并将其应用于信号。(建议在滤波时使用二阶段格式,以避免在传递函数 (ba) 格式中出现数值误差):
>>> sos = signal.ellip(8, 1, 100, 17, 'hp', fs=1000, output='sos')
>>> filtered = signal.sosfilt(sos, sig)
>>> ax2.plot(t, filtered)
>>> ax2.set_title('After 17 Hz high-pass filter')
>>> ax2.axis([0, 1, -2, 2])
>>> ax2.set_xlabel('Time [seconds]')
>>> plt.tight_layout()
>>> plt.show()