音频信号处理

**音頻訊號處理**，又稱**音訊處理**，或**音樂訊號處理**（）等，它是一种用來調整音樂訊號的振幅、頻率、波形等資訊的处理方式。利用适合的四则运算、升降頻，及窗函数，就可以处理出各式各样的聲音訊號。

使用一些訊號處理的技巧，可以從聲音訊號取得背後所代表的頻率高低，做更進一步的分析與應用。

## 音訊的來源
當物體发生震動時，就會產生聲音。

舉例來說：當用力揮動手掌時，就會產生聲音，以及蚊子翅膀快速震動時，所發出的擾人聲音。

在上述例子中，所聽到的聲音是來自於空氣震動，而不是因為手掌擺動。

原因是人耳可以聽到的聲音頻率介於20Hz到20000Hz之間，所以我們可以聽到空氣振動產生的聲音，卻聽不到手掌擺動產生的聲音，因為擺動的頻率不夠快。

## 音訊的資訊
聲音訊號是一種力學波，因此在傳播過程中是一種類比連續的訊號，然而由於人耳是天然的傅立葉轉換器，因此音訊經過人耳後會變成數位訊號。在這些訊號中，有三個特徵是處理時經常考慮的部分，可以參考下圖：
# 音量：從訊號來看，音量代表的是訊號的振幅，訊號振幅越大，所發出的音量也越大。
# 音頻：訊號的頻率，就是所謂的音頻，也就是聲音震動的頻率。其代表的是音調的高低，頻率越高，音調就越高。除此之外，樂器所產生的聲音訊號，並非是單一頻率的訊號，而是有基頻和泛音（倍頻）的存在。
# 音色：每一個人或樂器所發出的音色都不一樣，從訊號上來看，音色就是訊號的波形，因此只要利用波形分析，就可以判斷出聲音的來源，從下圖可以看到小提琴跟鋼琴的音色差異非常大。
File:Sound Jeff.png|音訊的三個特徵：音量、音頻、音色。


## 音訊的檔案
音訊的檔案儲存可以分成壓縮和無壓縮兩種，常見的無壓縮檔案格式為*.wav，而壓縮檔案格式為*.mp3，關於這一部分的詳細資料可以參照音訊檔案格式。聲音檔的存取時，主要有三個需要考慮因素：
# 取樣頻率：在訊號處理中，取樣頻率所代表的是聲音的品質，取樣的頻率越高，數位訊號的波形越接近類比訊號的波形，因此聲音的品質也越好。而在做取樣時，必須遵守奈奎斯特頻率，簡單來說，頻率在取樣時至少要大於原訊號頻率的2倍，才可以得到有意義的訊號，也能還原成原本的訊號。
# 聲音解析度：存取訊號資料點所用的位元數，即代表其解析度。所使用的位元數越大，每個資料點的數值就越精確，聲音的解析度也越好。比較16bit與8bit兩種存取位元，16bit可以存取到較精確的數值，但是也會花比較大的硬體儲存空間。
# 聲道：聲道就是聲音的來源數，常聽到的單聲道及雙聲道，代表的是聲音是否有立體感。利用兩個喇叭，撥放單聲道的聲音，左右兩個喇叭發出的聲音完全相同，因此會感覺聲音是來自兩個喇叭中間，但若是雙聲道聲音，左右兩個喇叭發出的聲音會有一定差異，因此會覺得聲音聽起來有立體感。
舉例來說，藉由MATLAB輸入指令audioinfo（音訊檔案名稱），可以得到音訊檔案的相關資訊如下圖：
# 因為檔案格式是*.wav，所以是無壓縮 (uncompressed)。
# 聲道 (NumChannels)： 1
# 取樣頻率 (SampleRate)： 44100Hz
# 聲音解析度 (BitsPerSample)： 16
File:Audioinfo Jeff.png|執行MATLAB函數：audioinfo(音訊檔案名稱)


## 音訊的處理
由於聲音訊號是一段長時間的訊號，因此在處理時必須要分段進行，在處理之前會先開一個範圍，選擇出想要處理的部分，再針對範圍內的部分做處理，聲音資訊主要包含：响度、音色和音高，三個部分，也是最常處理的部分。
# 响度控制：音量是一種相對訊號，在訊號中代表得是振幅，其計算方式是將範圍內的訊號取平方相加，在以10為底取log，單位是分貝（dB）如下公式： Amplitude (dB) = 10log_{10} \sum_{k=1}^N k^2    但是，在對人耳來說，音量是一種主觀的感受，根據佛萊徹森曲線（Fletcher-Munson Curve），在不同頻率之下，人耳要聽到聲音的話，對音量有一個最低要求，如下圖所示。反過來說，雖然聲音訊號的振幅相同，但是因為頻率高低不同，對人耳的感受大小也會不同，相同聲音強度，耳朵對低頻的感受度較差，對3000Hz左右的聲音感受度最高，越往高頻又會慢慢降低。調整音量最簡單的方式就是用加減法，首先把要處理的範圍框出來，接著計算出振幅大小，最後再減掉想要減少的振幅強度，就可以降低音量，反之用加法就可以增強區域的音量。
File:Fletcher-Munson Curve.png|在不同頻率之下，人耳對聲音的敏感度會有所不同。

# 音頻控制：音頻是聲音訊號處理的核心部分，最常用的簡單處理方式是增頻和降頻。音頻代表得是訊號的音高，中音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的地方有特別大的值。


File:FFT.png|將正弦波的訊號，經由傅立葉轉換，可以得到訊號組成的頻率。

# 音色：每一組聲音訊號的波形都不一樣，其物理意義是音色。因此如果改變波形的變化，就可以產生出音色類似的聲音，處理波形最簡單的方法就是用窗函數(window function)。利用既有或自製的窗函數，將訊號做簡單的卷积运算就可以改變訊號的波形，創造出不同的音色。
# 倍頻：通常音樂的訊號不是單一頻率的訊號，而是由基頻，以及其泛音(基頻的整數倍，倍頻)所組成。因此若自製電子音樂時，必須注意倍頻對聲音飽和度產生的影響。下圖將音樂訊號經過頻率分析後，可以看到除了在f_0=330Hz左右的基頻外，在2f_0、3f_0的部分也會有較大的分量。
File:Chord.png|音樂訊號會由基頻、泛音所組成，經過頻率分析後，分量在基頻倍數的地方有較大的值。

# 端點偵測：端點偵測的目的是使訊號處理的範圍更精確。舉例來說，只要設定一個音量閾值，若訊號小於閾值，則將其視為沒訊號。但是若雜訊過高，則會產生誤差。

## 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。

## 參考資料
http://djj.ee.ntu.edu.tw/ADSP7.pdf