音频信号处理
(重定向自Audio signal processing)
音頻訊號處理,又稱音訊處理,音樂訊號處理(英語:Audio signal processing)等,用來調整音樂訊號的振幅、頻率、波形等資訊。利用某些四则运算,升降頻,及窗函数,就可以处理出各式各样的聲音訊號。
透過一些訊號處理的技巧,可以從聲音訊號取得背後所代表的頻率高低,做更進一步的分析與應用。
音訊的來源
- 當物體发生震動時,就會產生聲音,舉例來說:當用力揮動手掌時,就會產生聲音,以及蚊子翅膀快速震動時,所發出的擾人聲音。
- 但是,在上述例子中,所聽到的聲音是來自於空氣震動,而不是因為手掌擺動,
- 原因是人耳可以聽到的聲音頻率介於20Hz到20000Hz之間,所以我們可以聽到空氣振動產生的聲音,卻聽不到手掌擺動產生的聲音,因為擺動的頻率不夠快。
音訊的資訊
- 音量:從訊號來看,音量代表的是訊號的振幅,訊號振幅越大,所發出的音量也越大。
- 音頻:訊號的頻率,就是所謂的音頻,也就是聲音震動的頻率。其代表的是音調的高低,頻率越高,音調就越高。除此之外,樂器所產生的聲音訊號,並非是單一頻率的訊號,而是有基頻和泛音(倍頻)的存在。
- 音色:每一個人或樂器所發出的音色都不一樣,從訊號上來看,音色就是訊號的波形,因此只要利用波形分析,就可以判斷出聲音的來源,從下圖可以看到小提琴跟鋼琴的音色差異非常大。
音訊的三個特徵:音量、音頻、音色。
音訊的檔案
- 取樣頻率:在訊號處理中,取樣頻率所代表的是聲音的品質,取樣的頻率越高,數位訊號的波形越接近類比訊號的波形,因此聲音的品質也越好。而在做取樣時,必須遵守奈奎斯特頻率,簡單來說,頻率在取樣時至少要大於原訊號頻率的2倍,才可以得到有意義的訊號,也能還原成原本的訊號。
- 聲音解析度:存取訊號資料點所用的位元數,即代表其解析度。所使用的位元數越大,每個資料點的數值就越精確,聲音的解析度也越好。比較16bit與8bit兩種存取位元,16bit可以存取到較精確的數值,但是也會花比較大的硬體儲存空間。
- 聲道:聲道就是聲音的來源數,常聽到的單聲道及雙聲道,代表的是聲音是否有立體感。利用兩個喇叭,撥放單聲道的聲音,左右兩個喇叭發出的聲音完全相同,因此會感覺聲音是來自兩個喇叭中間,但若是雙聲道聲音,左右兩個喇叭發出的聲音會有一定差異,因此會覺得聲音聽起來有立體感。
- 舉例來說,藉由MATLAB輸入指令audioinfo(音訊檔案名稱),可以得到音訊檔案的相關資訊如下圖:
- 因為檔案格式是*.wav,所以是無壓縮 (uncompressed)。
- 聲道 (NumChannels): 1
- 取樣頻率 (SampleRate): 44100Hz
- 聲音解析度 (BitsPerSample): 16
執行MATLAB函數:audioinfo(音訊檔案名稱)
音訊的處理
- 由於聲音訊號是一段長時間的訊號,因此在處理時必須要分段進行,在處理之前會先開一個範圍,選擇出想要處理的部分,再針對範圍內的部分做處理,聲音資訊主要包含:响度、音色和音高,三個部分,也是最常處理的部分。
- 响度控制:音量是一種相對訊號,在訊號中代表得是振幅,其計算方式是將範圍內的訊號取平方相加,在以10為底取log,單位是分貝(dB)如下公式: 但是,在對人耳來說,音量是一種主觀的感受,根據佛萊徹森曲線(Fletcher-Munson Curve),在不同頻率之下,人耳要聽到聲音的話,對音量有一個最低要求,如下圖所示。反過來說,雖然聲音訊號的振幅相同,但是因為頻率高低不同,對人耳的感受大小也會不同,相同聲音強度,耳朵對低頻的感受度較差,對3000Hz左右的聲音感受度最高,越往高頻又會慢慢降低。調整音量最簡單的方式就是用加減法,首先把要處理的範圍框出來,接著計算出振幅大小,最後再減掉想要減少的振幅強度,就可以降低音量,反之用加法就可以增強區域的音量。
在不同頻率之下,人耳對聲音的敏感度會有所不同。
- 音頻控制:音頻是聲音訊號處理的核心部分,最常用的簡單處理方式是增頻和降頻。音頻代表得是訊號的音高,中音Do的頻率約在262Hz,在音樂中,有C(Do),#C(#Do,♭Re),D(Re),#D(#Re,♭Mi),E(Mi,♭Fa),F(Fa),#F(#Fa,♭Sol),G(Sol),#G(#Sol,♭La),A(La),#A(#La,♭Si),B(Si),12個特定的音階,每差12個音階,頻率會變為原來的兩倍,其頻率設定是以440Hz為標準音頻,做進一步數學推算,其頻率為440乘上2的n/12次方,其中n是上面列出的第幾個音階。音頻的處理最常用的是升頻和降頻,先選出想要處理的區域,接著做升降頻的動作,這其中必須要注意奈奎斯特理論,避免訊號失真。 frequency = 2n/12 * 440
- 頻率分析:透過離散傅立葉轉換(Discrete Fourier Transform),通常簡稱為DFT,可以將一段聲音訊號轉換成其各個頻率的正弦波分量,方便做更進一步的分析、運算。下圖是將頻率為440Hz的正弦波訊號,藉由MATLAB function: fft,可以得到訊號組成頻率的分量,從圖上可以看到在440Hz的地方有特別大的值。
-
將正弦波的訊號,經由傅立葉轉換,可以得到訊號組成的頻率。
- 音色:每一組聲音訊號的波形都不一樣,其物理意義是音色,因此如果改變波形的變化,就可以產生出音色類似的聲音,處理波形最簡單的方法就是用窗函數(window function),利用既有或自製的窗函數,將訊號做簡單的卷积运算就可以改變訊號的波形,創造出不同的音色。
- 倍頻:通常音樂的訊號不是單一頻率的訊號,而是由基頻,以及其泛音(基頻的整數倍,倍頻)所組成,因此若自製電子音樂時,必須注意倍頻對聲音飽和度產生的影響。下圖將音樂訊號經過頻率分析後,可以看到除了在左右的基頻外,在、的部分也會有較大的分量。
音樂訊號會由基頻、泛音所組成,經過頻率分析後,分量在基頻倍數的地方有較大的值。
- 端點偵測:端點偵測的目的是使訊號處理的範圍更精確,方法很簡單,只要設定一個音量閾值,若訊號小於閾值,則將其視為沒訊號,但是若雜訊過高,則會產生誤差。
MATLAB聲音信號處理指令
- [y, fs] = audioread(檔名):y是聲音訊號的向量,fs是取樣頻率。
- audioinfo(檔名):回傳各種聲音檔案的相關資訊,像是取樣頻率、通道數量、聲音解析度...等。
- sound(y, fs):以fs的頻率播放聲音訊號y。
- wavwrite(y, fs, filename):將y訊號,以取樣速率fs,寫到filename.wav之中。
- Y = fft(y):將時間軸上的訊號y,轉換為頻率軸上的訊號Y。