在Arduino DSP系列的第二部分中,我們將繼續深入研究數位訊號處理的基礎知識。我們將學習數位濾波器的特性以及在MATLAB中處理訊號時如何應用這些特性。在下一篇文章中,我們將製作一期有關傅裡葉變換的深入課程,並研究語音訊號最重要的參數:頻率。
用Audacity錄製語音訊號後,現在是時候在MATLAB中進行處理了。此功能可以透過wavread函數完成,該函數負責讀取(.wav)音效檔。Audacity的輸出訊號具有此副檔名。此函數的輸入是訊號名稱(testSound.wav),在MATLAB函數中,您只需要寫“testSound”即可。該函數的輸出如下所示:
我們可以使用以下代碼實現此函數。該代碼還能夠播放聲音,讓使用者在訊號處理過程中聽到訊號如何隨時間變化。
1 2 3 4 5 6 7 8 9 |
[s0,fs,bits] = wavread('testSound'); sound(s0,fs); pause(9) t=(0:length(s0)-1)/fs; figure plot(t,s0),grid title('The initial signal.'); xlabel ('tTime') ylabel('s0(n)'); |
如果您想獲得人聲訊號的更多資訊,您只需輸入音訊檔案名稱(尾碼名為.wav),然後函數audioinfo就會給您返回聲音參數。
1 |
audioinfo('testSound.wav') |
此函數非常方便,尤其是當一個訊號是未知訊號時。比如,如果在處理一個訊號時無法確定取樣速率、持續時間和位元/樣本等必要資訊,那麼就可以使用上述函數查詢該訊號的更多資訊。
直流(DC)分量是添加到純交流(AC)波形(比如語音訊號)的恒定電壓。純AC波形的真實平均電壓為零。語音訊號是類比訊號,但是用Audacity將其轉換為數位訊號時,會獲得一個DC分量。發生這種情況是因為Audacity擁有自己的範圍並對訊號進行了重新調整。通常,類比訊號範圍為-0.5至0.5V。我們需要0.5V的直流分量,這是因為程式使用一系列正數來縮放樣本值(每個樣本值被轉換為從0到N的數位;N是自然數)。
但是,如果存在DC分量,那麼AC的幅度會根據DC分量的值發生變化。我們來看一下圖 4。假設您有一個幅度為2V峰-峰值的正弦波,同時疊加了一個0.5V的直流分量,那麼最終訊號的幅度最高為1.5 V,最低為-0.5 V。
我們應該查看一下訊號是否具有直流分量,並且要確定直流分量的值。我們可以透過繪製數值來實現,也可以在命令視窗中輸入M實現。
1 2 3 4 5 6 7 |
M = mean(s0) figure subplot(2,1,1), plot(t,M) title('Mean value.'); s1 = removeDC(s0); subplot(2,1,2), plot(t,s1) title('The Signal without the mean value'); |
去除平均分量很重要,因為語音訊號本身不含直流分量,而我們希望使用純淨的音訊波形。removeDC函數中的以下代碼能夠計算訊號的平均值並將其從原始訊號中除去。
1 2 3 4 |
function [sOut] = removeDC(sInput) DC = mean(sInput); sOut = sInput - DC; end |
我們的取樣頻率現在為48000Hz,我們希望將其變成16000Hz。透過抽取,我們可以降低訊號的取樣速率。抽取可以透過MATLAB中的decimate函數實現。當我們對一個語音訊號進行取樣時,根據奈奎斯特取樣定理,最小頻率應為8kHz——這是因為人類聽覺最大頻寬為4kHz。
這樣做是因為我們想比較原始訊號與抽取訊號之間的差異,並瞭解這種修改如何改變原始訊號。
進行抽取(或下取樣)時,我們將取樣速率修改成較低的速率(與之前的取樣速率相比)。如下圖所示,左側類比訊號的取樣速率高於右側的類比訊號。這意味著我們對取樣頻率進行抽取。
我們還可以進行上取樣——下取樣的反過程,並增加取樣頻率。這可以透過插值技術和低通濾波器來完成。
1 2 3 4 5 6 7 8 9 10 11 |
fe2=fs/3; %s2 = decimate(s1,3); s2 = decimate(s0,3); t1=linspace(0,length(s2)/fe2, length(s2)); figure plot(t1,s2),grid title('Decimate the signal'); ylabel('s(n)'); sound(s2,fe2); pause(9) |
簡單來講,數位濾波器是一種離散時間、離散幅度的卷積器。數位濾波器在訊號處理中很重要,因為與類比濾波器相比,它可以處理多個操作。(我們可以假設數位濾波器的成本更高,因為我們需要特殊的數位訊號處理器來運行濾波演算法的功能。)
每個數位濾波器都有不同的規格:通帶、阻帶和漣波。我們首先回顧一下以下術語。
數位濾波器可以分為兩類:FIR(有限脈衝響應),濾波器係數為整數。IIR(無限脈衝響應),具有類比等效模型,並且階數較低時更有效。
FIR/IIR濾波器最重要的特性之一是相位特性:
FIR濾波器屬性 – dspGuru by Iowegian International
“線性相位是指濾波器的相位響應是頻率的線性(直線)函數(不包括+/-180度的相位纏繞)。這使得透過濾波器的所有頻率的延遲都相同。因此,這種濾波器不會引起“相位失真”或“延遲失真”。在某些系統中,比如在數位資料資料機中,沒有相位/延遲失是FIR濾波器相對於IIR和類比濾波器的關鍵優勢。”
MATLAB中有眾多類型的數位濾波器可供選擇,但是我們需要瞭解如何將其應用於我們的具體場景。對於本項目,我們選用IIR濾波器,因為它更有效,即與FIR濾波器相比,我們需要更小的階數。
以下代碼可以在MATLAB中創建一個Butterworth濾波器。添加濾波器階數和截止頻率後,此函數會返回濾波器係數。
1 2 3 |
fn = fe2/2; fc=3400; % cutoff frequency [Bd,Ad] = butter(40,3400/fn,'low'); |
在命令列中輸入 help butter ,就可以透過MATLAB幫助瞭解為什麼取樣速率會除以2。“[b,a] = butter(n,Wn)會返回一個n階低通數位Butterworth濾波器的傳遞函數係數以及歸一化截止頻率Wn”,且“截止頻率Wn必須滿足0.0 < Wn < 1.0,1.0對應於取樣速率的一半。”
濾波器係數存儲在 Bd 和 Ad 變數中。
數位濾波器術語 – dspGuru by by Iowegian International
濾波器係數 – 與數位濾波器結構內的延遲訊號取樣值相乘的常數集。數位濾波器設計就是要確定產生所需濾波器頻率響應的濾波器係數。對於FIR濾波器,根據定義,濾波器係數就是濾波器的脈衝響應。
濾波器階數 – 上述每種濾波器都有一個階數(N)特長;N階是指實現濾波器所需無功元件的數量。對於IIR濾波器,濾波器階數等於濾波器結構中的延遲元件數。通常,濾波器階數越大,濾波器的頻率幅度響應性能越好。
此濾波器的另一個重要方面是頻率響應——濾波器如何影響頻譜分量。濾波器的理想頻率響應應該是一個完整的矩形,其幅度為1,截止頻率為0.5。在現實生活中,您可以根據自己的應用場景選擇濾波器類型。
一個數位濾波器的頻率響應如下圖所示。在我們的例子中,通帶的幅度平坦,沒有漣波。截止頻率為3400Hz,這意味著我們的訊號透過了一個低通濾波器,其頻率不會超過此限值。如圖所示,截止頻率後面沒有阻帶,這就是為什麼可能有其他頻率比它高的原因。這可以透過增加濾波器的階數來改善。
如圖10所示,橢圓濾波器 在截止頻率處的幅頻曲線下降最陡,但振幅不穩定。切比雪夫1和2 在通帶和阻帶中有幅度波動。Butterworth濾波器在這兩個頻段上都沒有幅度波動,因此我們在應用中採用了這種濾波器;然而,這種濾波器的缺點是其暫態帶較大。
IIR濾波器的階數小於FIR濾波器的階數。
在本文應用中,我們將濾波器的階數設為40,以使頻率響應盡可能地接近理想頻率響應。如圖11所示,隨著濾波器階數的增加,性能在頻率響應方面也會提高。
對訊號進行濾波和抽取之後,我們需要觀察原始訊號與變換訊號之間的差異。我們使用繪圖功能並生成一個音訊訊號。
驗證結果是否有效的最簡單方法就是查看這些訊號。我們來比較一下原始訊號(48kHz取樣速率)和最終訊號(16kHz取樣速率)。最終訊號沒有太大的噪音,這是一件非常好的事情。
在第2部分中,我們的目標是學習數位濾波器的特性並用MATLAB進行測試。到目前為止,我們已經設法瞭解了取樣速率的含義以及取樣速率的變化如何影響音訊訊號。在下一篇文章中,我們將從另一個角度——利用傅裡葉變換(即頻域)——處理音訊訊號。