-
Notifications
You must be signed in to change notification settings - Fork 7
The PCM Samples
##Step 0 什麼是PCM?
**脈衝編碼調變 (Pulse Code Modulation - PCM)**是一種類比音訊資料的儲存格式,PCM將訊號的強度依照同樣的間距分成數段(取樣),然後用獨特的數位記號(通常是二進位數值)來量化。
一個週期的sine波被量化成0到255的8位元數值
既然叫做脈衝"編碼"調變,最種要的當然就是所謂的"編碼"。在本次範例裡,我們使用的是最簡單的 unsigned 8 bit PCM 格式進行編碼。也就是如上圖把音樂的波行縮放至0到255,總共256個位階的資料。
取樣頻率 (Sampling Frequency) 即每一秒內所紀錄或播放的資料點(samples)數。在這個範例中,我們使用 8KHz 的取樣頻率,代表每一秒的音訊是由 8000筆資料 所組成。
Audacity是一支相當優秀的音訊處理軟體,以下說明會教你如何使用Audacity搭配二進位編輯器 (Notepad++ HEX Viewer外掛模組) 匯出 8KHz 取樣率的 unsigned 8 bit PCM 格式成所需要的陣列
如果您還沒有安裝Audacity音訊編輯程式,請參考 安裝Audacity
開啟上方選單列的 [檔案] → [匯入] → [音訊]
選定您要轉換的音訊檔,完成後按下 [確定] 來匯入
至上方選單列 [軌道] → [立體聲音軌轉換為單聲道]
至上方六格工具欄內,選擇 [I] 符號的選擇工具
如果需要縮放波形圖,也可以使用縮放工具,或按鍵盤上的 [Ctrl] 配合滑鼠滾輪來縮放
使用選擇工具選定要轉換為 PCM Samples 的區段
開啟上方選單列的 [編輯] → [Clip Boundaries] → [分割並新增]
按下原來音軌左上角的 [X] 來刪除音軌
開啟上方選單列的 [軌道] → [當對齊時移動選擇部分] → [起點對齊原點]
至左下角 [專案頻率(赫茲)] 選單 更改匯出時的取樣頻率為 8000 (Hz)
至上方選單列選擇 [檔案] → [匯出音訊]
變更存檔類行為:其他非壓縮格式檔案
然後按下 [選項] 按鈕,更改
標頭:WAV (Microsoft)
編碼:Unsigned 8 bit PCM
更改完成後,輸入新檔名並按下 [存檔]
您會看到以下 [編輯後設資料] 視窗,不要變更,按 [確定] 即可
這時您可以直接進入我們的自製音效步驟,或是繼續往下手動將音效檔處理成陣列
如果您還沒有安裝 Notepad++ 文字編輯器,請參考 安裝 Notepad++
至上方選單列 [外掛模組] → [Plugin Manager] → [Show Plugin Manager]
在 Plugin Manager 視窗,找到 HEX-Editor 的選項打勾
然後記得按下右下角的 [Install] 按鈕
出現以下提示視窗請選擇 [是] 安裝程式會自動重新啟動您的 Notepad++
重新啟動以後就安裝完成了
按下左上角的 [開啟舊檔] 按鈕
選定您要先前匯出的.wav檔,完成後按下 [開啟]
開啟後會是亂碼沒錯,不過不要緊張,這時就派出我們準備已久的道具 "HEX Editor"
至上方選單列 [外掛模組] → [HEX-Editor] → [View in HEX]
如果您先前有匯出正確的格式,可以在第 3 行第 5 ~ 8 列的位置
找到 "data" 四個字元的16進位碼 "64 61 74 61"
data往左代表Microsoft WAV格式的檔頭,就如同一個容器一般
data往右的字元,會有一組二進位的 Samples 大小紀錄(Subchunk1Size),位在第 3 行第 9 ~ c 列的位置
Samples 大小紀錄之後才會是PCM Samples
詳細說明請點此
如果您先前匯出時並無更改 [後設資料] (Step 10),那您可以安心的選擇到最後一個位元
接著按下滑鼠 右鍵 → [copy]
按下左上方按鈕列的 [新增文件] 按鈕
接著按下滑鼠 右鍵 → [貼上]
使用空白鍵插入一個空格到第一行的第一個字元,讓文字對齊
至上方選單列選擇 [尋找] → [取代]
[尋找目標] 欄位填入空白鍵半形空格 " "
[取代成] 欄位填入 ",0x"
完成後按下 [全部取代]
取代成功之後,您所看到的即為可填入陣列中的 16 進制 8 位元 PCM Samples
我們從第一個逗點之後開始選擇
選擇好之後,即可按下滑鼠 右鍵 → [複製]
然後貼進你在範例程式中的const陣列即可
關於陣列的長度,只需要將您在底下狀態列中的 length 值除以 5 (5個字一組),即為您的陣列長度
例如這裡是 59400 / 5 = 11880,即為 11880 個bytes的 PCM Samples 陣列