本文簡要介紹 python 語言中 scipy.signal.remez
的用法。
用法:
scipy.signal.remez(numtaps, bands, desired, *, weight=None, Hz=<object object>, type='bandpass', maxiter=25, grid_density=16, fs=None)#
使用 Remez 交換算法計算 minimax 最優濾波器。
使用 Remez 交換算法計算有限脈衝響應 (FIR) 濾波器的 filter-coefficients,該濾波器的傳遞函數可最大限度地減少指定頻帶中所需增益和實現增益之間的最大誤差。
- numtaps: int
濾波器中所需的抽頭數。抽頭數是過濾器中的項數,或過濾器階數加一。
- bands: array_like
包含帶邊的單調序列。所有元素必須是非負的,並且小於 fs 給出的采樣頻率的一半。
- desired: array_like
在每個指定頻帶中包含所需增益的頻帶大小的一半的序列。
- weight: 數組,可選
賦予每個波段區域的相對權重。重量的長度必須是帶子長度的一半。
- Hz: 標量、可選、已棄用
采樣頻率(以 Hz 為單位)。默認值為 1。
- type: {‘bandpass’, ‘differentiator’, ‘hilbert’},可選
過濾器類型:
‘bandpass’ : flat response in bands. This is the default.
‘differentiator’ : frequency proportional response in bands.
- ‘hilbert’ filter with odd symmetry, that is, type III
(for even order) or type IV (for odd order) linear phase filters.
- maxiter: 整數,可選
算法的最大迭代次數。默認值為 25。
- grid_density: 整數,可選
網格密度。
remez
中使用的密集網格的大小為(numtaps + 1) * grid_density
。默認值為 16。- fs: 浮點數,可選
信號的采樣頻率。默認值為 1。
- out: ndarray
包含最優(在極小極大意義上)濾波器的係數的 rank-1 數組。
參數 ::
返回 ::
參考:
[1]J. H. McClellan 和 T. W. Parks,“優化 FIR 線性相位數字濾波器設計的統一方法”,IEEE Trans。電路理論,第一卷。 CT-20,第 697-701 頁,1973 年。
[2]J. H. McClellan、T. W. Parks 和 L. R. Rabiner,“用於設計最佳 FIR 線性相位數字濾波器的計算機程序”,IEEE Trans。音頻電聲,卷。 AU-21,第 506-525 頁,1973 年。
例子:
在這些示例中,
remez
用於設計low-pass、high-pass、band-pass 和band-stop 濾波器。定義每個濾波器的參數包括濾波器階數、頻帶邊界、邊界的過渡寬度、每個頻帶中所需的增益以及采樣頻率。我們將在所有示例中使用 22050 Hz 的采樣頻率。在每個示例中,每個頻帶中的所需增益為 0(對於阻帶)或 1(對於通帶)。
freqz
用於計算每個濾波器的頻率響應,下麵定義的實用函數plot_response
用於繪製響應。>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt
>>> fs = 22050 # Sample rate, Hz
>>> def plot_response(w, h, title): ... "Utility function to plot response functions" ... fig = plt.figure() ... ax = fig.add_subplot(111) ... ax.plot(w, 20*np.log10(np.abs(h))) ... ax.set_ylim(-40, 5) ... ax.grid(True) ... ax.set_xlabel('Frequency (Hz)') ... ax.set_ylabel('Gain (dB)') ... ax.set_title(title)
第一個示例是 low-pass 濾波器,截止頻率為 8 kHz。濾波器長度為 325,從通過到停止的過渡寬度為 100 Hz。
>>> cutoff = 8000.0 # Desired cutoff frequency, Hz >>> trans_width = 100 # Width of transition from pass to stop, Hz >>> numtaps = 325 # Size of the FIR filter. >>> taps = signal.remez(numtaps, [0, cutoff, cutoff + trans_width, 0.5*fs], ... [1, 0], fs=fs) >>> w, h = signal.freqz(taps, [1], worN=2000, fs=fs) >>> plot_response(w, h, "Low-pass Filter") >>> plt.show()
此示例顯示了 high-pass 過濾器:
>>> cutoff = 2000.0 # Desired cutoff frequency, Hz >>> trans_width = 250 # Width of transition from pass to stop, Hz >>> numtaps = 125 # Size of the FIR filter. >>> taps = signal.remez(numtaps, [0, cutoff - trans_width, cutoff, 0.5*fs], ... [0, 1], fs=fs) >>> w, h = signal.freqz(taps, [1], worN=2000, fs=fs) >>> plot_response(w, h, "High-pass Filter") >>> plt.show()
此示例顯示了 band-pass 濾波器,其中 pass-band 的頻率範圍為 2 kHz 至 5 kHz。過渡寬度為 260 Hz,濾波器的長度為 63,小於其他示例:
>>> band = [2000, 5000] # Desired pass band, Hz >>> trans_width = 260 # Width of transition from pass to stop, Hz >>> numtaps = 63 # Size of the FIR filter. >>> edges = [0, band[0] - trans_width, band[0], band[1], ... band[1] + trans_width, 0.5*fs] >>> taps = signal.remez(numtaps, edges, [0, 1, 0], fs=fs) >>> w, h = signal.freqz(taps, [1], worN=2000, fs=fs) >>> plot_response(w, h, "Band-pass Filter") >>> plt.show()
低階導致更高的紋波和不太陡峭的轉變。
下一個示例顯示band-stop 過濾器。
>>> band = [6000, 8000] # Desired stop band, Hz >>> trans_width = 200 # Width of transition from pass to stop, Hz >>> numtaps = 175 # Size of the FIR filter. >>> edges = [0, band[0] - trans_width, band[0], band[1], ... band[1] + trans_width, 0.5*fs] >>> taps = signal.remez(numtaps, edges, [1, 0, 1], fs=fs) >>> w, h = signal.freqz(taps, [1], worN=2000, fs=fs) >>> plot_response(w, h, "Band-stop Filter") >>> plt.show()
相關用法
- Python SciPy signal.residue用法及代碼示例
- Python SciPy signal.residuez用法及代碼示例
- Python SciPy signal.resample_poly用法及代碼示例
- Python SciPy signal.resample用法及代碼示例
- Python SciPy signal.ricker用法及代碼示例
- Python SciPy signal.czt_points用法及代碼示例
- Python SciPy signal.chirp用法及代碼示例
- Python SciPy signal.iirdesign用法及代碼示例
- Python SciPy signal.max_len_seq用法及代碼示例
- Python SciPy signal.kaiser_atten用法及代碼示例
- Python SciPy signal.oaconvolve用法及代碼示例
- Python SciPy signal.hilbert用法及代碼示例
- Python SciPy signal.group_delay用法及代碼示例
- Python SciPy signal.cheb2ord用法及代碼示例
- Python SciPy signal.get_window用法及代碼示例
- Python SciPy signal.lfilter用法及代碼示例
- Python SciPy signal.morlet用法及代碼示例
- Python SciPy signal.coherence用法及代碼示例
- Python SciPy signal.dfreqresp用法及代碼示例
- Python SciPy signal.TransferFunction用法及代碼示例
- Python SciPy signal.dbode用法及代碼示例
- Python SciPy signal.bilinear_zpk用法及代碼示例
- Python SciPy signal.firls用法及代碼示例
- Python SciPy signal.impulse用法及代碼示例
- Python SciPy signal.buttord用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.signal.remez。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。