ADPCM編碼和解碼

原文:http://www.znmcu.cn/znx_51_alltest_shell_fj_adpcm1.htmlhtml

 

ADPCM音頻解碼,其實放在這裏有些不太合適。算法

在編寫ZN-X開發板整板測試程序的後期,振南開始轉向專一於ADPCM音頻的解碼算法。對於音視頻的編解碼,振南一直是很感興趣的。shell

VS1003錄音向外輸出的數據是通過ADPCM編碼的,所謂ADPCM編碼是一種自適應差分脈碼調製技術。它能夠對音頻數據在毫無損失的前提下,將數據量壓縮爲原來的1/4,這對於音頻來講,意義是重大的。我很想深刻去研究一下ADPCM,但由於沒有時間,一直被擱置。測試

ADPCM源於微軟的Windows,通常的WAV文件就是使用它來編碼的,WAVWindows上的標準音頻格式。ADPCM算法已經被標準化了,現行使用的是IMA-ADPCM,即IMA組織制訂的ADPCM算法。這種算法比較簡單,但卻有較高的壓縮比。編碼

 

 

ADPCM編碼的原理(我會盡可能說的通俗的):spa

若是咱們對一個聲音信號進行採樣,採用16位量化,好比採集53個點,以下圖:視頻

 

 

若是咱們直接存儲每個點的16位的採樣值,這樣就須要53X16=848個位,大約是106字節。但咱們換個思路,咱們不存儲採樣值,而存儲採樣點兩兩之間的差值(採樣值可能會很大,須要更多的位數來表達,好比16個位,可是兩點之間通常來講是比較連續的,差值不會太大,因此這個差值只須要不多的幾個位便可表達,好比4個位)。這樣,咱們只須要知道前一個點的值,又知道它與下一個點的差值,就能夠計算獲得下一個點了。這個差值就是所謂的「差分」!htm

這就是DPCM的主要思想精髓!!blog

「什麼?DPCM?咱們不是說ADPCM嗎?」是的,DPCM是差分脈碼調製,多一個A,就是自適應!爲何要自適應?開發

你有沒有考慮到一個問題?若是取兩點之差,這個差值超過了4個位能夠表達的範圍,該如何處理?音頻信號雖然具備很高的連續性,可是咱們並不能保證兩點之間產生突變的可能!

 

 

前面的差值多是35812,後面忽然變成2040,甚至更大,這時4個位還夠用嗎?數據量的減小,不能以數據丟失和失真做爲代價!!

若是有一種方法,能夠把兩點之間的差值變換到固定的幾個位便可表達的範圍內,那就行了!並且這種變換是實時的,而且具備自適應性和預測能力的。這就是ADPCM的基本思想。它定義了一些因子,這種算法若是發現兩點之間差值變大以後,就會用差值去和相應的因子做除法,從而減少了差值,讓它能夠減小到幾個位可表達的數值範圍內。而選擇哪個因子來除它,這就是ADPCM編碼要做的事情了。

ADPCM算法巧妙的利用了音頻信號的特色,也就是音頻信號上的點與它前面的若干個點是有必定的相關性的,從而能夠對下一個點進行預測,從而預先估計這個差值,從而選取相應的除數因子,去把差值歸化到數值範圍內!!

 

以上就是ADPCM對音頻信號進行編碼大致思想和過程!!

 

咱們從VS1003中讀取到的,就是通過ADPCM編碼後的數據,也就是音頻信號採樣點之間的差值!(只是這些差值並不能直接用來去計算下一個採樣點,而須要與因子相乘,計算獲得真正的差值,這與編碼是一個相逆的過程。乘數因子就是編碼時用的那個除數因子,解碼時要根據當前的音頻信號去預判,以便取合適的因子!!)

 

以上是對ADPCM編碼音頻的解碼的方法,它適用於VS1003輸出的音頻數據,一樣適用於使用ADPCM編碼的WAV文件,以及全部使用ADPCM編碼的聲音數據!!!

【好比一些語音產品,像數字對講機、數字廣播等等,也均可以使用ADPCM編碼,這樣能夠很好的下降數據帶寬要求!!】

相關文章
相關標籤/搜索