scipy.signal.firls¶
- scipy.signal.firls(numtaps, bands, desired, weight=None, nyq=None, fs=None)[源代码]¶
FIR过滤设计采用最小二乘误差最小化。
计算线性相位有限冲激响应(FIR)的过滤系数,该系数与由描述的所需频率响应具有最佳近似 bands 和 desired 在最小二乘意义下(即,指定频带内的加权均方误差的积分被最小化)。
- 参数
- numtaps集成
冷杉过滤中的点击次数。 numtaps 一定很奇怪。
- bandsarray_like
包含频带边缘的单调非递减序列,单位为Hz。所有元素都必须是非负的,并且小于或等于由给定的奈奎斯特频率 nyq 。
- desiredarray_like
大小与的序列相同的序列 bands 在每个频带的起始点和终点处包含所需的增益。
- weightARRAY_LIKE,可选
解决最小二乘问题时要给予每个波段区域的相对权重。 weight 必须是大小的一半 bands 。
- nyq浮动,可选
Deprecated. Use `fs` instead. 奈奎斯特频率。输入的每个频率 bands 必须介于0和0之间 nyq (含)。默认值为1。
- fs浮动,可选
信号的采样频率。输入的每个频率 bands 必须介于0和0之间
fs/2
(含)。默认值为2。
- 退货
- coeffsndarray
最优(最小二乘)过滤的系数。
注意事项
此实现遵循中给出的算法 [1]. 如上所述,最小二乘设计有多个优点:
在最小二乘意义下是最优的。
简单、非迭代的方法。
通解可以通过解线性方程组得到。
允许使用频率相关的加权函数。
此函数构造一个I型线性相位FIR过滤,它包含奇数个 coeffs 令人满意的 \(n < numtaps\) :
\[Coeffs(N)=Coeffs(Numtaps-1-n)\]奇数个系数和过滤对称性避免了原本可能出现在奈奎斯特频率和0频率(例如,对于类型II、III或IV变体)的边界条件。
0.18 新版功能.
参考文献
- 1
伊万·塞莱斯尼克,线性相位FIR过滤最小二乘设计。OpenSTax CNX。2005年8月9日。http://cnx.org/contents/eb1ecb35-03a9-4610-ba87-41cd771c95f2@7
示例
我们想要建造一个带通过滤。请注意,我们的阻带和通带之间的频率范围内的行为未指定,因此可能会超调,具体取决于过滤的参数:
>>> from scipy import signal >>> import matplotlib.pyplot as plt >>> fig, axs = plt.subplots(2) >>> fs = 10.0 # Hz >>> desired = (0, 0, 1, 1, 0, 0) >>> for bi, bands in enumerate(((0, 1, 2, 3, 4, 5), (0, 1, 2, 4, 4.5, 5))): ... fir_firls = signal.firls(73, bands, desired, fs=fs) ... fir_remez = signal.remez(73, bands, desired[::2], fs=fs) ... fir_firwin2 = signal.firwin2(73, bands, desired, fs=fs) ... hs = list() ... ax = axs[bi] ... for fir in (fir_firls, fir_remez, fir_firwin2): ... freq, response = signal.freqz(fir) ... hs.append(ax.semilogy(0.5*fs*freq/np.pi, np.abs(response))[0]) ... for band, gains in zip(zip(bands[::2], bands[1::2]), ... zip(desired[::2], desired[1::2])): ... ax.semilogy(band, np.maximum(gains, 1e-7), 'k--', linewidth=2) ... if bi == 0: ... ax.legend(hs, ('firls', 'remez', 'firwin2'), ... loc='lower center', frameon=False) ... else: ... ax.set_xlabel('Frequency (Hz)') ... ax.grid(True) ... ax.set(title='Band-pass %d-%d Hz' % bands[2:4], ylabel='Magnitude') ... >>> fig.tight_layout() >>> plt.show()