當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy signal.firls用法及代碼示例


本文簡要介紹 python 語言中 scipy.signal.firls 的用法。

用法:

scipy.signal.firls(numtaps, bands, desired, *, weight=None, nyq=<object object>, fs=None)#

使用最小二乘誤差最小化的 FIR 濾波器設計。

計算linear-phase 有限衝激響應 (FIR) 濾波器的濾波器係數,該濾波器最接近頻帶說明的所需頻率響應,並且在最小二乘意義上是所需的(即加權 mean-squared 誤差在指定的頻段被最小化)。

參數

numtaps int

FIR 濾波器中的抽頭數。 numtaps 必須是奇數。

bands array_like

包含頻帶邊(以 Hz 為單位)的單調非遞減序列。所有元素必須為非負且小於或等於 nyq 給出的奈奎斯特頻率。這些頻段被指定為頻率對,因此,如果使用一維數組,其長度必須是偶數,例如 np.array([0, 1, 2, 3, 4, 5])。或者,可以將 band 指定為 nx2 大小的二維數組,其中 n 是 band 的數量,例如 np.array([[0, 1], [2, 3], [4, 5]])。

desired array_like

與在每個波段的起點和終點包含所需增益的波段大小相同的序列。

weight 數組,可選

解決最小二乘問題時給予每個波段區域的相對權重。重量必須是帶子大小的一半。

nyq 浮點數,可選,已棄用

這就是奈奎斯特頻率。頻段中的每個頻率必須介於 0 和 nyq(含)之間。默認值為 1。

fs 浮點數,可選

信號的采樣頻率。每個頻率在樂隊必須介於 0 和fs/2(包括的)。默認值為 2。

返回

coeffs ndarray

最佳(在最小二乘意義上)FIR 濾波器的係數。

注意

此實現遵循 [1] 中給出的算法。如上所述,最小二乘設計具有多種優勢:

  1. Optimal in a least-squares sense.

  2. Simple, non-iterative method.

  3. The general solution can obtained by solving a linear system of equations.

  4. Allows the use of a frequency dependent weighting function.

該函數構造一個 I 型線性相位 FIR 濾波器,其中包含奇數個係數滿足\(n < numtaps\)

奇數個係數和濾波器對稱性避免了在 Nyquist 和 0 頻率下可能出現的邊界條件(例如,對於 II、III 或 IV 型變體)。

參考

[1]

Ivan Selesnick,Linear-Phase 最小二乘法的 Fir 濾波器設計。 OpenStax CNX。 2005 年 8 月 9 日。http://cnx.org/contents/eb1ecb35-03a9-4610-ba87-41cd771c95f2@7

例子

我們要構造一個band-pass 過濾器。請注意,我們的阻帶和通帶之間的頻率範圍內的行為是未指定的,因此可能會根據我們濾波器的參數而過衝:

>>> import numpy as np
>>> 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()
scipy-signal-firls-1.png

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.signal.firls。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。