昨天簡單介紹了音訊的檔案格式,今天來聊聊聲音是怎麼轉換成數位訊號的。
簡單講講聲音的性質與組成。
振幅、頻率、波長我就當作基本常識帶過去了。
每個聲音的波形都不同,聽起來音色就不同。一個波形可以拆解成許多種不同頻率的 sin 波,因此我們也能反向用許多 sin 波製造出全新的音色,就是 DAC (Digital to Analog Converter)、合成器在玩的事情。
要如何使用數位訊號紀錄聲音呢?更具體一點,要如何用 bits 描述一個波形呢?
引用自 演算法筆記
以固定時間間隔(水平軸)量測振幅(垂直軸),就可以得到很多 (X, Y) 值。我們來詳細聊聊這兩個值。
每隔一段時間對聲音量測,這個動作稱為 Sample 取樣,也就是前面提到的 X 。
X 因間隔固定,我只需要知道間隔大小就行了,因此用一秒內取幾次數值代表,也就是 sample rate。常見的 sample rate 從 8 khz to 48khz。
要如何決定使用多少取樣率進行取樣呢?這個跟聲音本身的頻率有關。Nyquist Theorm (取樣定理)提到,對頻率 n 的聲波取樣,要能夠保證結果波形與原始波形相似,至少需要 2n 的 sample rate。 sample rate 小於 2n 有機會出現完全錯誤的波形。
一般人類的聲音約在 4khz,人耳可以識別的聲音範圍是 20hz - 20khz,因此常見的 sample rate 才會是 8khz - 48khz。
每次量測得到的聲音振幅,也就是 Y 值,數值每次都不同,因此可以用 N 位元表示一次取樣點聲音的振幅,也就是位元深度 (bit-depth),常見使用 8 bits (早期遊戲的音樂)、16 bits (CD 音質)、24 bits。
位元深度越高,能夠表示的振幅範圍越多,以 1 bit 換算約為 6 dB 來說,像是 16 bits 可以表示 96 dB、24 bits 可以表示 144 dB。
因位元有限 (Y 軸的刻度有限),不可能剛好每個數值都在刻度上,勢必需要四捨五入去表示,因此會產生 Quantization Noise (Quantization Error),造成部分的失真。這個刻度間隔稱為 decision boundaries,而四捨五入後的值稱為 reconstruction level。
decision boundaries == coder mapping ==> recinstruction level
decision boundaries <== decode mapping == recinstruction level
當然,沒有人規定每個間隔都要相等,因此等間距的稱做 uniform quantize,非等間距的稱做 non-uniform,代表的有 u-law 與 A-law。
中文名稱脈衝編碼調變技術非常的不直覺。基本上用上述 Quantization 與 Sampling 取出的資料,就稱為 PCM Data。它將每個取樣點看成直條圖的脈衝,可以簡單比喻成積分的概念,sample rate 越高表示的波形越精準。
一個數位訊號要怎麼轉成聲音讓人聽到呢?主要有兩種方式:
因為聲波可以疊加,所以 FM 以給定的頻率建立基底 sin 波,並根據一套計算公式混和各種頻率的 sin 波產出聲音。聲音比較假,一般用在較低規格的音效卡。
與其合成聲音,不如將真實樂器的聲音按每個音錄製,並存在音效卡的記憶體中,播放指定頻率的音檔。這些音檔可以被軟體操作、合成,與後面會提到的 MIDI 息息相關。
好吧 ~ 今天只能到這裡了,真的是非常非常的淺談,原文書好硬啊 (嗑嗑嗑....)。其實大致了解概念即可,要細講的話 30 天大概都念不完吧 Orz