一、前言:
近期因為專案中沒有和硬體溝通好,導致在android的alsa中錄製資料時,硬體給過來的資料引數和需要的不一樣,沒辦法,需要進行重取樣,故看了下網上的重取樣介紹,這裡簡單記錄下。
二、重取樣演算法:
首先對錄製的資料,當兩聲道及以上時,需要確認一點就是是否交織,這將決定我們的演算法如何剝離資料。
這是網上找到的關於交織與非交織資料的圖示,簡單來說,交織的資料就是對每乙個取樣點都寫上所有聲道的資料之後才進行下乙個取樣點的資料寫入,而非交織則是按到聲道個數,一次性寫入所有的取樣資料。
在我本次的專案中,因為是對android中tinyalsa的資料進行處理,所以確認資料是交織的。
而重取樣的目的是將底層錄製的48k取樣率資料改為16k取樣率資料,所以我們只需要在原來資料的基礎上每隔三個點儲存一下,儲存完畢後,就是16k取樣率的資料了。
具體**實現如下:
/* data_buf為從alsa獲取的48k原數資料,xmos_data_buf為重取樣之後的資料 */
int count =0;
int readcount =0;
short
* pu16src =
null
;short
* pu16dst =
null
; pu16src =
(short*)
(data_buf)
; pu16dst =
(short*)
(xmos_data_buf)
;/* 重取樣處理:48k->16k,每隔三個點重取樣一次 */
for(count =
0; count <
320; count++
)
從**中可以看到,因為資料位寬是16bit的,所以以short指標的方式去讀取快取中的資料,其次,只要計算出需要處理的幀數(幀數 = 取樣率/1000 * 位寬 * 時間),那麼轉換就可以完成了,經過重取樣處理之後的資料體積肯定只有原來的三分之一。
三、分離聲道資料:
上面經過重取樣之後獲取的資料是兩個聲道的總資料,我們還需要對資料進行聲道分離,因為是交織方式獲取的,所以演算法如下:
/* 分離兩個channel的資料 */
int u32channel =0;
int i =0;
for(u32channel =
0; u32channel <
2; u32channel++
)}
這裡就實現了資料的重取樣和分離,但是,對於這種操作我還是推薦硬體給過來的資料就是對的,畢竟,每一次錄製都需要使用軟體操作還是很占用系統資源的。 Andriod下音訊的相關操作
audiomanger物件通過getsystemservice service.audio service 獲取 audiomanger常用的幾個方法void android.media.audiomanager.adjuststreamvolume int streamtype,int direc...
Android音訊開發(5) 音訊資料的編譯碼
1.android 官方的 mediacodec api 首先,我們了解一下 android 官方提供的音訊編譯碼的 api,即 mediacodec 類,該 api 是在 andorid 4.1 api 16 版本引入的,因此只能工作於 android 4.1 以上的手機上。樂搏學院 1.1 me...
Android音訊開發(5) 音訊資料的編譯碼
1.android 官方的 mediacodec api 首先,我們了解一下 android 官方提供的音訊編譯碼的 api,即 mediacodec 類,該 api 是在 andorid 4.1 api 16 版本引入的,因此只能工作於 android 4.1 以上的手機上。1.1 mediaco...