11-1 Filter Applications (oi)

本節將介紹在數位訊號處理常用到的濾波器(Filters),並簡單介紹其應用。一般人大概都聽過濾波器,但是對於相關的數學分析,可能都覺得很複雜,敬而遠之。本節將從應用面來著手,並說明相關的 MATLAB 指令,所以並不會牽涉到複雜的分析。

簡單的說,一個濾波器可以用兩個向量 ab 來代表,其中 a 的長度是 p,b 的長度是 q,而且 a 的第一個元素 a1 永遠是 1,如下:

a = [1, a2, ... ap]
b = [b1, b2, ... bq]
當我們把具有參數 ab 的濾波器應用到一段離散時間訊號 x[n],所得到的結果是 y[n],可以表示如下:
y[n] = b1x[n] + b2x[n-1] + ... + bqx[n-q+1]
-a2y[n-1] - a3y[n-2] - ... - apx[n-p+1]
這個式子看起來有點複雜,下面我們來看起個特例,就會比較清楚。

首先,如果

a = [1]
b = [1/5, 1/5, 1/5, 1/5, 1/5]
那麼濾波器的輸出就是
y[n] = (x[n] + x[n-1] + x[n-2] + x[n-3] + x[n-4])/5
這就是一個簡單的濾波器,換句話說,濾波器的輸出值,等於原訊號在過去五點的平均值,因此這個濾波器就有「低通」(Low Pass)的效果,換句話說,比較尖銳的訊號(高頻的部分),經過了五點求平均,會變的比較平滑,因此整個訊號的高頻部分會被壓低,而低頻部分則比較不受到影響,所以這一類濾波器就稱為「低通濾波器」(Low Pass Filter)。低通濾波器的效果,就好像用紙杯罩著嘴巴講話,只剩下低沈、模糊、悶悶的聲音。

Hint
為什麼罩上紙杯講話,會有低通濾波器的效果?請想想看...

以下是一個範例:

Example 1: lpf01.mwaveFile='whatMovies.wav'; au=myAudioRead(waveFile); % Filter parameters a = [1]; b = [1, 1, 1, 1, 1]/5; y = filter(b, a, au.signal); % Plot the result time = (1:length(au.signal))/au.fs; subplot(2,1,1); plot(time, au.signal); title('Original signal x[n]'); subplot(2,1,2); plot(time, y); title('Output signal y[n]'); au.signal=y; myAudioWrite(au, 'lpf01.wav'); % Save the output signal

在上述範例中,y = filter(b, a, x) 即是由原始訊號 x 及濾波器參數 a 和 b,來產生濾波器的輸出訊號 y。由上述範例圖形可以看出,在高頻的部分(尤其是氣音的部分),訊號震幅明顯降低,這就是低通濾波器的效果。我們也可以直接聽看看訊號的差異: 我們在看另一組濾波器:
a = [1]
b = [1, -1]
那麼濾波器的輸出就是
y[n] = x[n] - x[n-1]
換句話說,濾波器的輸出值,等於原訊號目前的值減掉原訊號在前一個時間點的值,因此變化劇烈的訊號(即高頻訊號),其差異會被突顯出來,而變化不劇烈的訊號(即低頻訊號),其差異會被壓抑,所以這一類的濾波器就稱為「高通濾波器」(High Pass Filter),請見下列範例:

Example 2: hpf01.mwaveFile='whatMovies.wav'; au=myAudioRead(waveFile); % Filter parameters a = [1]; b = [1, -1]; y = filter(b, a, au.signal); % Plot the result time = (1:length(au.signal))/au.fs; subplot(2,1,1); plot(time, au.signal); title('Original signal x[n]'); subplot(2,1,2); plot(time, y); title('Output signal y[n]'); au.signal=y; myAudioWrite(au, 'hpf01.wav'); % Save the output signal

由上述範例圖形可以看出,在高頻的部分(尤其是氣音的部分),訊號震幅相對明顯變大,這就是高通濾波器的效果。我們也可以直接聽看看訊號的差異: 經過了高通濾波器之後,訊號聽起來的感覺,好像就是小型收音機(沒有重低音喇叭)的播放效果,比較尖銳刺耳。

除了高通和低通濾波器外,濾波器也可以產生各種不同的音效,例如

a = [1]
b = [1, 0, 0, 0, ..., 0, 0.8] (中間夾雜了3199個零)
那麼濾波器的輸出就是
y[n] = x[n] + 0.8*x[n-3200]
換句話說,這個濾波器的功能就是「單次迴音器」,會產生一次迴音,若取樣頻率 fs = 16kHz,則迴音和原音的時間差是 3200/fs = 3200/16000 = 0.2 秒。請見下列範例:

Example 3: echo01.mwaveFile='whatMovies.wav'; au=myAudioRead(waveFile); % Filter parameters delay=0.2; gain=0.8; a = [1]; b = [1, zeros(1, round(delay*au.fs)-1), gain]; y = filter(b, a, au.signal); % Plot the result time = (1:length(au.signal))/au.fs; subplot(2,1,1); plot(time, au.signal); title('Original signal x[n]'); subplot(2,1,2); plot(time, y); title('Filter output y[n]'); au.signal=y; myAudioWrite(au, 'echo01.wav'); % Save the output signal[Warning: Data clipped when writing file.] [> In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('audiowrite>clipInputData', 'E:\MATLAB\R2015a\toolbox\matlab\audiovideo\audiowrite.m', 396)" style="font-weight:bold">audiowrite>clipInputData</a> (<a href="matlab: opentoline('E:\MATLAB\R2015a\toolbox\matlab\audiovideo\audiowrite.m',396,0)">line 396</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('audiowrite', 'E:\MATLAB\R2015a\toolbox\matlab\audiovideo\audiowrite.m', 176)" style="font-weight:bold">audiowrite</a> (<a href="matlab: opentoline('E:\MATLAB\R2015a\toolbox\matlab\audiovideo\audiowrite.m',176,0)">line 176</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('myAudioWrite', 'd:\users\jang\matlab\toolbox\sap\myAudioWrite.m', 29)" style="font-weight:bold">myAudioWrite</a> (<a href="matlab: opentoline('d:\users\jang\matlab\toolbox\sap\myAudioWrite.m',29,0)">line 29</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('echo01', 'D:\users\jang\books\audioSignalProcessing\example\echo01.m', 16)" style="font-weight:bold">echo01</a> (<a href="matlab: opentoline('D:\users\jang\books\audioSignalProcessing\example\echo01.m',16,0)">line 16</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile>dummyFunction', 'D:\users\jang\books\goWriteOutputFile.m', 85)" style="font-weight:bold">goWriteOutputFile>dummyFunction</a> (<a href="matlab: opentoline('D:\users\jang\books\goWriteOutputFile.m',85,0)">line 85</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile', 'D:\users\jang\books\goWriteOutputFile.m', 55)" style="font-weight:bold">goWriteOutputFile</a> (<a href="matlab: opentoline('D:\users\jang\books\goWriteOutputFile.m',55,0)">line 55</a>)]

在上述範例中,gain = 0.8 代表迴音的衰減比值,而 delay = 0.2 則是迴音的時間差。我們可以聽看看原訊號和濾波器輸出的差異: 上述濾波器只能產生一個迴音,比較不像一般多重迴音。若要產生多重迴音,可用下列濾波器:
a = [1, 0, 0, 0, ..., 0, -0.8] (中間夾雜了3199個零)
b = [1]
那麼濾波器的輸出就是
y[n] = x[n] + 0.8*y[n-3200]
這個濾波器的功能就是「多重迴音器」,會產生多重迴音,若取樣頻率 fs = 16kHz,則迴音之間的時間差是 3200/fs = 3200/16000 = 0.2 秒。請見下列範例:

Example 4: echo02.mwaveFile='whatMovies.wav'; au=myAudioRead(waveFile); % Filter parameters delay=0.2; gain=0.8; a = [1 zeros(1, round(delay*au.fs)), -gain]; b = [1]; y = filter(b, a, au.signal); % Plot the result time = (1:length(au.signal))/au.fs; subplot(2,1,1); plot(time, au.signal); title('Original signal x[n]'); subplot(2,1,2); plot(time, y); title('Filter output y[n]'); au.signal=y; myAudioWrite(au, 'echo02.wav'); % Save the output signal[Warning: Data clipped when writing file.] [> In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('audiowrite>clipInputData', 'E:\MATLAB\R2015a\toolbox\matlab\audiovideo\audiowrite.m', 396)" style="font-weight:bold">audiowrite>clipInputData</a> (<a href="matlab: opentoline('E:\MATLAB\R2015a\toolbox\matlab\audiovideo\audiowrite.m',396,0)">line 396</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('audiowrite', 'E:\MATLAB\R2015a\toolbox\matlab\audiovideo\audiowrite.m', 176)" style="font-weight:bold">audiowrite</a> (<a href="matlab: opentoline('E:\MATLAB\R2015a\toolbox\matlab\audiovideo\audiowrite.m',176,0)">line 176</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('myAudioWrite', 'd:\users\jang\matlab\toolbox\sap\myAudioWrite.m', 29)" style="font-weight:bold">myAudioWrite</a> (<a href="matlab: opentoline('d:\users\jang\matlab\toolbox\sap\myAudioWrite.m',29,0)">line 29</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('echo02', 'D:\users\jang\books\audioSignalProcessing\example\echo02.m', 16)" style="font-weight:bold">echo02</a> (<a href="matlab: opentoline('D:\users\jang\books\audioSignalProcessing\example\echo02.m',16,0)">line 16</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile>dummyFunction', 'D:\users\jang\books\goWriteOutputFile.m', 85)" style="font-weight:bold">goWriteOutputFile>dummyFunction</a> (<a href="matlab: opentoline('D:\users\jang\books\goWriteOutputFile.m',85,0)">line 85</a>) In <a href="matlab:matlab.internal.language.introspective.errorDocCallback('goWriteOutputFile', 'D:\users\jang\books\goWriteOutputFile.m', 55)" style="font-weight:bold">goWriteOutputFile</a> (<a href="matlab: opentoline('D:\users\jang\books\goWriteOutputFile.m',55,0)">line 55</a>)]

我們可以聽看看原訊號和濾波器輸出的差異:
Audio Signal Processing and Recognition (音訊處理與辨識)