firwin#
- scipy.signal.firwin(numtaps, cutoff, *, width=None, window='hamming', pass_zero=True, scale=True, fs=None)[原始碼]#
使用窗函數法設計 FIR 濾波器。
此函數計算有限脈衝響應濾波器的係數。濾波器將具有線性相位;如果 numtaps 是奇數,則為 Type I 型;如果 numtaps 是偶數,則為 Type II 型。
Type II 型濾波器在奈奎斯特頻率處始終具有零響應,因此如果呼叫 firwin 時 numtaps 為偶數且通帶的右端位於奈奎斯特頻率,則會引發 ValueError 異常。
- 參數:
- numtapsint
濾波器的長度(係數數量,即濾波器階數 + 1)。如果通帶包含奈奎斯特頻率,則 numtaps 必須是奇數。
- cutofffloat 或 1-D 類陣列
濾波器的截止頻率(以與 fs 相同的單位表示)或截止頻率陣列(即頻帶邊緣)。在前一種情況下,作為浮點數,截止頻率應對應於半振幅點,衰減將為 -6dB。在後一種情況下,cutoff 中的頻率應為正值,並且在 0 和 fs/2 之間單調遞增。值 0 和 fs/2 不得包含在 cutoff 中。應注意,這與
scipy.signal.iirdesign
的行為不同,後者中截止頻率是半功率點 (-3dB)。- widthfloat 或 None,可選
如果 width 不是 None,則假定它是過渡區域的近似寬度(以與 fs 相同的單位表示),用於 Kaiser FIR 濾波器設計。在這種情況下,將忽略 window 參數。
- window字串或字串和參數值元組,可選
要使用的所需窗函數。請參閱
scipy.signal.get_window
以取得窗函數和所需參數的列表。- pass_zero{True, False, ‘bandpass’, ‘lowpass’, ‘highpass’, ‘bandstop’}, 可選
如果為 True,則頻率 0(即「DC 增益」)的增益為 1。如果為 False,則 DC 增益為 0。也可以是所需濾波器類型的字串參數(等效於 IIR 設計函數中的
btype
)。版本 1.3.0 新增: 支援字串參數。
- scalebool,可選
設定為 True 以縮放係數,使頻率響應在特定頻率下正好為單位值。該頻率為
0 (DC),如果第一個通帶從 0 開始(即 pass_zero 為 True)
fs/2 (奈奎斯特頻率),如果第一個通帶在 fs/2 結束(即濾波器是單頻帶高通濾波器);否則為第一個通帶的中心
- fsfloat,可選
訊號的取樣頻率。cutoff 中的每個頻率都必須介於 0 和
fs/2
之間。預設值為 2。
- 返回:
- h(numtaps,) ndarray
長度為 numtaps 的 FIR 濾波器的係數。
- 引發:
- ValueError
如果 cutoff 中的任何值小於或等於 0 或大於或等於
fs/2
,如果 cutoff 中的值不是嚴格單調遞增,或者如果 numtaps 是偶數但通帶包含奈奎斯特頻率。
另請參閱
範例
從 0 到 f 的低通
>>> from scipy import signal >>> numtaps = 3 >>> f = 0.1 >>> signal.firwin(numtaps, f) array([ 0.06799017, 0.86401967, 0.06799017])
使用特定的窗函數
>>> signal.firwin(numtaps, f, window='nuttall') array([ 3.56607041e-04, 9.99286786e-01, 3.56607041e-04])
高通(從 0 到 f 的 ‘stop’)
>>> signal.firwin(numtaps, f, pass_zero=False) array([-0.00859313, 0.98281375, -0.00859313])
帶通
>>> f1, f2 = 0.1, 0.2 >>> signal.firwin(numtaps, [f1, f2], pass_zero=False) array([ 0.06301614, 0.88770441, 0.06301614])
帶阻
>>> signal.firwin(numtaps, [f1, f2]) array([-0.00801395, 1.0160279 , -0.00801395])
多頻帶(通帶為 [0, f1]、[f2, f3] 和 [f4, 1])
>>> f3, f4 = 0.3, 0.4 >>> signal.firwin(numtaps, [f1, f2, f3, f4]) array([-0.01376344, 1.02752689, -0.01376344])
多頻帶(通帶為 [f1, f2] 和 [f3,f4])
>>> signal.firwin(numtaps, [f1, f2, f3, f4], pass_zero=False) array([ 0.04890915, 0.91284326, 0.04890915])