Quantcast
Channel: iCoding »行動開發
Viewing all articles
Browse latest Browse all 13

基礎 Audio Raw Data 處理

$
0
0

時間很快來到 2013 年末,已經荒廢了一陣子沒有新文章了,今天要有始有終,在年底前再來分享一個最近習得的技能。音訊處理雖然有點冷門,但是最近在看得東西好像也沒有什麼是不冷門的 XD

好吧,進入正題,因工作需要,看了一下如何解讀 Audio raw data,正確的來說應該是 16bits PCM Wave data 的解讀。
假設我們所要處理的資料是 16bits / 2 channel / signed short / little endian 的 PCM Wave data 的話,一個 audio 取樣點是 32bits,舉例來說,如果一個 audio sample 的資料室 0x00FF00FF ,那麼這代表的意義就是:

前面的兩個 bytes 代表左聲道,後面的兩個 bytes 代表右聲道。左右聲道各自的兩個 bytes 所代表的是一個 signed short。 以左聲道來說,由於 little endian 的關係 0x00FF 實際上應該先被換成 0xFF00,而 0xFF00 的 signed short 值是 -256,所以這個取樣的左聲道的振幅就等於  -256 / 32768 ~= -0.0078。

而我們平常看到的聲音格式會寫類似 44.1Khz 或是 32Khz 的意義代表的是在一秒鐘之類對聲音取幾個這樣的資料數量,所以如果是 44.1Khz 的話,那一秒鐘取樣 44100 個點,那個一秒鐘的 audio 資料量就會有 44100 * 4 bytes,大約相當於 0.168MB,一首四分鐘的歌大概就會有將近 40MB 這麼大的量。

有了大致的了解之後,最基本的音訊處理就是如何做重新取樣了,比如說要把 44.1khz 的 CD 音樂轉檔成 32khz 的 MP3,那麼首先一定要先把原始音訊資料的 44.1khz 重新取樣為 32khz 之後再進行壓縮。先把問題簡化為將一秒取樣 3 個 sample 的資料轉成 2 個 sample 的資料的話,其實就是一個簡單的線性內差法運算可以達到最簡單的效果。以下圖來看上面的波形是一秒鐘三個取樣點構成,那如果要用兩個取樣點來逼近這個波形的話:s’0 = s0 * (x1 – x’0) / (x1 – x0) + s1 * (x1 – x’0) / (x1 – x0)。s’1 的話以此法類推。但由於這是最基本的做法,所以其實可以看到逼近的波形已經失真了,據說這種線性取樣會有 aliasing 的問題,但是我簡單測試過這個方法將 44.1Khz audio 轉成 32Khz audio,播放出來並沒有聽出什麼問題。可能因為 32Khz 取樣點還是很細,所以波形還算逼近。

以下根據以上說明所實作的一段簡單的 Java Code:

另外值得一提的是在做音訊處理的過程如果要 debug 的話一定要有一個好的 tool 可以看 audio raw data ,有很多工具可以匯入 raw data,這邊比較推薦的是 Audacity,簡單好用而且又跨 MacOS / Window / Ubuntu。

題外話,小弟並不在 audio 領域,若有什麼錯誤還請該領域先進指教。

K

我是 K,幻想可以做些偉大的事,但最後都只能做些不着邊際的無謂的事情。

More Posts - Website

Follow Me:
Twitter


Viewing all articles
Browse latest Browse all 13

Latest Images

Trending Articles



Latest Images