Butterworth Band-pass Filter

scipy.signal.lfilter函數可用來建立Butterworth Band-pass Filter。[0]

圖1 Frequency response of band-pass filter for human speech (low cut frequency=300, high cut frequency=3000)

圖1是Butterworth Band-pass Filter的頻率響應。

圖1呈現butterworth band-pass fitler的頻率響應,低截止頻率為300Hz,高截止頻率為3000Hz,Order代表在截止頻率附近頻率響曲線的陡峭程度,order越小(3),響應曲線越平滑,order越大(9),響應曲線越陡峭。

021 def butter_bandpass(lowcut, highcut, fs, order=5):
022     nyq = 0.5 * fs
023     low = lowcut / nyq
024     high = highcut / nyq
025     b, a = butter(order, [low, high], btype='band')
026     return b, a
027 
028 
029 def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
030     b, a = butter_bandpass(lowcut, highcut, fs, order=order)
031     y = lfilter(b, a, data)
032     return y

程式A區塊:\colon Butterworth Band-pass Filter的程式碼

行21定義函數butter_bandpass,輸入的參數有:\colon

  • lowcut 低截止頻率(Hz)
  • highcut 高截止頻率(Hz)
  • fs 音頻採樣頻率(Hz)
  • order=5 filter的階數,預設是5

行22是計算Nyquist frequency nyq,等於fs2\frac{fs}{2}

行23把低截止頻率轉成以Nyquist frequecy為單位表示。

行24把高截止頻率轉成以Nyquist frequecy為單位表示。

行25呼叫spicy.signal.butter函數,產生butterworth band-pass filter的Infinite Impulse Response(IIR) coefficients a,ba, b

IIR函數形式如公式1所示。

Y(z)=b[0]+b[1]z1++b[M]zMa[0]+a[1]z1++a[N]zNX(z) \textrm{Y}(z)= \frac{b[0]+b[1]z^{-1}+ \cdots + b[M]z^{-M}}{a[0]+a[1]z^{-1}+\cdots+a[N]z^{-N}}\textrm{X}(z) \qquad (公式1)

scipy.signal.butter裡面,M=N=2×order+1M=N=2\times \textrm{order}+1btype='band'指將採用bandpass filter,[low high]指頻帶的範圍。

由行26,b,a為函數butter_bandpass的輸出。

行29定義函數butter_bandpass_fitler,輸入的參數有:\colon

  • data 實際音頻訊號
  • lowcut 低截止頻率(Hz)
  • highcut 高截止頻率(Hz)
  • fs 音頻採樣頻率 (Hz)
  • order butterworth band-pass filter的階數

行30透過函數butter_bandpass產生butterworth bandpass Infinite Impulse Response(IIR) coefficients a,ba, b

行31把IIR係數b,ab,adata輸入scipy.signal.lfilterylfiter的輸出,即是經過帶通濾波後的結果。

行32把y輸出到函數butter_bandpass_fitler外,在transcribe_file_with_word_offset.py裡是返回函數batch_transcribe_speechFile (行135)。 。

[0] https://stackoverflow.com/questions/12093594/how-to-implement-band-pass-butterworth-filter-with-scipy-signal-butter

[1]
https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.signal.lfilter.html

results matching ""

    No results matching ""