使用MATLAB進行數位訊號處理簡介-第1部分

arduino dsp

在本課程中,我們將分析語音訊號。我們人類發出的聲波是連續的類比訊號,然而對於訊號處理,我們需要一個非連續時間模型——電腦的數位模型。本文的主要目的是説明大家瞭解如何實現數位訊號處理。我們將會比較自己錄製的聲音和一個失真訊號,從中尋找2個語音訊號之間的相似點和不同點。

對於這個項目,有一點比較重要:我們應該在應用不同的參數時,著重瞭解波形模式以及它們如何隨時間變化。在本文(第1部分)中,我們將探討語音訊號的一些特性以及如何使用MATLAB處理這種訊號;然後,我們使用Arduino對錄製的語音訊號進行詳細分析。

軟體

  • Audacity
  • Matlab
  • Arduino IDE

 

第1步:關於語音訊號

處理語音訊號時,我們要瞭解“訊號”的含義,這一點很重要。那訊號是什麼?

通信訊號處理,作者Paolo Prandoni與Martin Vetterli:

訊號是對隨時間或空間演變的現象的一種形式描述;透過訊號處理,我們可以描述任何手動或“機械”操作,從而修改、分析或操控一個訊號中包含的資訊。我們舉個環境溫度的簡單例子:我們就這個物理變數的正式模型達成一致——比如攝氏度——之後,我們可以用各種方式記錄溫度隨時間的變化,而結果資料集就代表一個溫度“訊號”。

第一步,我們將瞭解語音訊號的屬性。錄製自己的聲音之前,讓我們首先在Audacity中瞭解一些不同的參數。

 

聲道數量:

  • 單聲道:您使用一個聲道進行錄音,這意味著只有一個音訊訊號——錄音分佈在同一音量級別。因此如果您有兩個或更多揚聲器,您聽不出差異。這是最常用的方法,因為聲音是用一個麥克風錄製的,這意味著單聲道佔用的頻寬較少,因此對許多應用(比如電話和無線電)來說非常有用。對於不太熟悉音訊裝置放置技術細節的使用者來說,單聲道是正確的選擇。
arduino dsp

圖1:單個音訊訊號在同一音量級別上分配給多個揚聲器(單聲道)

  • 身歷聲:您用兩個或更多聲道錄音。由於訊號來自多個訊號源,因此能夠描述聲音的方向和位置。使用身歷聲設定意味著您需要將至少2個麥克風放置在適當的位置。透過這種方式,您可以確定多個聲源的不同位置。這種錄製通常用於電影和音樂,以獲得更廣泛的聲場解析。
arduino dsp

圖2:兩個或多個訊號通道分配到揚聲器(身歷聲)

專案速率(取樣速率):在一秒內對連續時間訊號的取樣次數,然後將其轉換為離散時間訊號(數值)。取樣的度量單位是S/s(即每秒取樣數)。

由於音訊訊號是類比訊號,我們需要將其轉換為數位訊號,以便由電腦進行處理。我們可以使用下面的取樣定理完成此操作。

我們假設有一個類比訊號,如下圖所示。想像一下,您需要向您的朋友描述這個訊號。這項任務並不是最簡單的任務。在這種情況下,將訊號描述為數位序列將更加簡單。

arduino dsp

圖3:類比訊號範例

每個樣本都以其自身的幅度進行描述。使用者可以根據自己的喜好選擇取樣速率。下圖顯示了如何根據取樣定理將類比訊號轉換為數位訊號。

arduino dsp

圖4:類比訊號轉換為數位訊號

取樣速率必須根據人類聽覺範圍——20Hz至20000Hz——進行選擇。為了能夠獲得特定訊號(即準確聲音)的所有必要資訊,我們的取樣速率必須滿足以下奈奎斯特-香農定理才能將其轉換為離散時間訊號:

arduino dsp

取樣速率必須大於訊號頻譜中最高(最大)頻率的兩倍。在我們的例子中,最大頻率為20000Hz。

本專案我們選擇48000Hz——這是處理音訊訊號時的一個標準值。在這種情況下,訊號處理時連續時間訊號中的所有資訊都沒有丟失。

說到取樣速率,一般有2種情況:

取樣頻率顯著高於奈奎斯特速率。從理論上講,如果以奈奎斯特速率或高於奈奎斯特速率進行取樣,就可以完美重建有限頻寬的訊號。奈奎斯特速率的定義為訊號中最高頻率分量的兩倍。

這種技術以低於其奈奎斯特速率(高截止頻率的兩倍)的取樣速率取樣帶通濾波訊號,但是仍然能夠重建訊號。如果以欠取樣方式取樣一個帶通訊號時,取樣點與高頻訊號的低頻分量取樣點無法區分(即訊號變得難以區分)。

接下來,我們透過正弦波進行演示。

arduino dsp

圖5:一個正弦波(在MATLAB中繪製)

這是一個頻率為2Hz、時域為[-1,1]的正弦波。該波形包含4個週期,這意味著每0.5秒(1/2 Hz)發生一個週期。我們會對這個訊號實施多種取樣案例,以瞭解取樣的工作原理。

取樣點數表示在一個週期內添加了多少個點,並這些點會用插值演算法連接起來。一個週期的最小點數應為20,否則線性插值訊號看起來就會失真。這尤其適用於平滑的類比訊號,取樣後會丟失圓邊圖案。點的數量越多,取樣訊號越準確。

arduino dsp

圖6:正弦波的必要點數(在MATLAB中繪製)

在本課程中,我們會在MATLAB中繪製一些正弦波,並觀察取樣頻率不同時這些正弦波的行為。在語音訊號系列的第二部分中,我們將使用MATLAB進行傅立葉分析。使用Arduino時,MATLAB也是一個非常有用的工具,因為它可以利用序列介面很好地進行通信。我們將在本系列的第三部分中詳細介紹如何用Arduino錄製語音訊號並在MATLAB中進行處理。

對於那些不完全熟悉MATLAB的人,繪製函數的一般步驟如下所示:

要創建腳本或函數,請轉到 [HOME] → [New],然後選擇“Script”(腳本)或“Function”(函數)。

arduino dsp

要繪製圖7中所示的正弦波,我們需要創建一個Script。複製並粘貼以下代碼:

 

 

要查看結果,您只需按Run按鈕即可。

arduino dsp

我們還需要創建另一個圖——就在剛剛創建的圖上繪製,以查看我們對訊號進行取樣時訊號的形式如何變化。訊號長度我們選取0.5秒,但是頻率增加為60。我們處理的點數也修改為頻率數的20倍。假設在這個區間內我們以50Hz的頻率進行取樣;這意味著每個點都位於T=1/50(其中T是取樣週期)處。圖7中的小紅點就是訊號上的取樣點。

arduino dsp

圖7:欠取樣正弦波

在圖7中,由於缺少取樣點,我們無法掌握原始訊號的形狀。連接取樣點後,由於訊號的點不足,紅色訊號的形狀異常(圖8)。這些點無法以正弦形式插值,紅色訊號不能重建藍色訊號。

arduino dsp

圖8:正弦波,fs = 50 Hz

arduino dsp

圖9:正弦波,fs = 240 Hz

 

如圖9和圖10所示,當我們以2倍頻率進行取樣時,圖中的唯一取樣點就是頂部和底部的最大值。根據取樣定理,這兩個點足以重建訊號。

第2步:處理語音訊號

 

上文介紹了訊號及其屬性。現在我們需要用一個實際例子進行測試。Audacity的錄音屬性如下:

  • 取樣速率:48000 Hz
  • 位數:16
arduino dsp

圖11:Audacity錄製所需的設定

訊號長度應至少為10秒左右(項目會進行許多處理,因此不建議超過20秒)。

arduino dsp

圖 12: Audacity

與其他錄製平臺相比,Audacity非常直觀。在下圖中,您可以看到一個中間有圓圈的紅色按鈕(record圖示)– 這就是開始錄音的按鈕。要停止錄製,只需按下黃色方塊按鈕(stop 按鈕)即可。程式會記錄錄音的聲波,並將其繪製處理,如下圖所示。

arduino dsp

圖13:錄製的音訊訊號

第1部分簡要介紹了數位訊號處理理論。我們使用MATLAB探索了不同的訊號波形,並用Audacity錄製了自己的聲音。在下一個課程中,我們將深入探討“處理”的更多細節。我們將涉及各種演算法和時頻域。我們會繼續利用MATLAB作為函數編寫的主要工具,以處理我們錄製的語音並獲得分析結果。

點擊此處繼續閱讀本文的第2部分>