scipy.signal.firls

scipy.signal.firls(numtaps, bands, desired, weight=None, nyq=None, fs=None)[源代码]

FIR过滤设计采用最小二乘误差最小化。

计算线性相位有限冲激响应(FIR)的过滤系数,该系数与由描述的所需频率响应具有最佳近似 bandsdesired 在最小二乘意义下(即,指定频带内的加权均方误差的积分被最小化)。

参数
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]. 如上所述,最小二乘设计有多个优点:

  1. 在最小二乘意义下是最优的。

  2. 简单、非迭代的方法。

  3. 通解可以通过解线性方程组得到。

  4. 允许使用频率相关的加权函数。

此函数构造一个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()
../../_images/scipy-signal-firls-1.png