加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

告訴你一個音頻壓縮算法,讓你的Flash減小四倍

04/03 09:50
3357
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

我們生活中最常見的音頻壓縮算法就是我們的mp3,早些年大家都喜歡下載這種類型的音樂,一首歌3-4M字節(jié),空間占用少,畢竟那時候的MP3播放器還是256M或者512M的時候。

單片機中的音頻播放

音頻播放在小型單片機系統(tǒng)中也會經(jīng)常用到,最早我做的地鐵廣播系統(tǒng)中就是用的單片機播放的音頻。這人中音頻播放大體上有兩種方式,一種是使用vs1003這樣的外置模組來進(jìn)行數(shù)據(jù)解碼,另一種就是單片機自己解碼。單片機的運算能力有限,因此靠單片機來計算MP3還是一項比較沉重的工作,所以,一般的小型系統(tǒng)中,我們往往不使用MP3格式的音頻,而是直接播放wav格式的音頻。說白了,wav格式就是純音頻數(shù)據(jù)存儲,沒有進(jìn)行過壓縮的,也就意味著不需要解碼,這樣一來,單片機只需要將兩通道的音頻數(shù)據(jù)丟到IIS緩存區(qū)即可。沒有IIS外設(shè)的怎么辦?那就用DAC,12bit的DAC播放個音頻指示或人聲完全沒問題。什么?連DAC也沒有,讓我想想。。。那就用PWM吧,配置一個PWM,占空比可調(diào),具備10bit可調(diào)范圍的PWM,硬件方面,就在引腳上加一個RC濾波,一樣可以播放好聽的效果音樂。


PWM也沒有嗎?那也沒關(guān)系,有IO口就能搞,不過今天重點不是說這個,重點是想說,這個wav文件還是有點大,我們需要對他做一些壓縮算法來存儲到我們可憐的Flash空間中。

音頻格式初探

ADPCM算法是一種針對16bit的聲音波形數(shù)據(jù)的一種有損的壓縮算法,他將聲音流中每次采樣的16bit數(shù)據(jù),轉(zhuǎn)變成4bit來存儲,所以它的壓縮比為1:4。想想,音頻文件可以節(jié)省4倍,這得省好幾毛錢了,而且這種壓縮算法簡單,51單片機就能輕松應(yīng)對,因此這中壓縮算法是一種地空間消耗,高質(zhì)量音頻獲得的好途徑。ADPCM主要是針對連續(xù)的波形數(shù)據(jù),它保存的是波形的變化情況,以達(dá)到描述整個波形的目的。先科普一下音頻信號存儲的知識。

一般我們在PC機的游戲中或者公交車報站器中使用到的聲音,都是提前錄制好的,這種錄制就是一種模擬轉(zhuǎn)數(shù)字的過程,因此這里面涉及到了香濃的采樣定理。我們一般對于音頻的采樣率會設(shè)置在44.1Khz,根據(jù)香濃定律,我們可以還原出22KHz的聲音,這已經(jīng)是大多數(shù)人耳朵能分辨的頻率的上限了。也有異能人士可以聽到更高,或者跟老柴我一樣最高只能分辨到16KHz,因人而異吧。知道了采樣頻率,我們再看一下對于一個升壓,我們需要將他量化存儲,到底需要多少個bit才能表示真?zhèn)€聲音中的大大小小的賦值呢?這個一般我們音樂是按照16bit處理的,也不是想多高就能多高,還得看采樣的ADC強不強。有了一個一個的升壓賦值和采樣頻率,只要我們按照頻率把賦值送給揚聲器,我們就可以聽到錄制的音樂了。在wav中,數(shù)據(jù)的存儲非常的簡單粗暴,就一個挨著一個的放,所以我們定好時間挨著個的取數(shù)據(jù)就可以了。其實,8bit的采樣深度就足夠人耳享用的了,比如win95的開機音樂。16bit就已經(jīng)算是高音質(zhì)了,現(xiàn)在很多游戲中采用16bit,單片機系統(tǒng)中,比如報站什么的8bit足夠了。有了聲音的基本存儲,我們來看看如何壓縮。

ADPCM算法

因為聲音一般是連續(xù)的,也就是頻率足夠快的情況下,前后兩個采樣值之間的差異會比較小。我們就利用這個特性來對數(shù)據(jù)進(jìn)行壓縮,也就是對兩次采樣值的差再做一次量化,由于這個差值比較小,因此我們可以使用更少的bit來存儲,這樣就實現(xiàn)了壓縮的結(jié)果。

如上圖所示,直接存儲的方式中,我們存儲的數(shù)據(jù)是ABC三個16bit的數(shù)據(jù),如果按照ADPCM壓縮算法,我們存儲的將是相對值,也就是B-A,C-B這樣的更小的值,當(dāng)然重新播放的時候,我們要有一個初值。其實初值就是0,聲音怎么也得是慢慢變大的,不然喇叭受得了,你耳朵也受不了。接下來,我們看如何二次量化。如果我們想壓縮為4bit,那么也就是一共16個等級,你可以平均分配,但顯然這樣做很不明智,有大神發(fā)明了兩種重新量化的定律,叫A Law和u Law。其實就是非線性量化,至于做成什么樣的非線性,這得研究人耳朵對音樂的敏感性了,不在我們討論范圍內(nèi)。我們來看一個圖,大致了解下兩個Law的不同。

乍一看其實沒太大區(qū)別,所以這種非線性量化其實也挺隨意的。由于信號量噪比的不恒定而影響信號質(zhì)量,為了對不同的信號強度保持信號量噪比恒定,在理論上要求壓縮特性為對數(shù)特性。為了使信號量噪比保持恒定,引入A壓縮律與μ壓縮律以及相應(yīng)的近似算法-13折線法和15折線法。一般來說,U律的15折線比A律的13折線,各個段落的斜率都相差2倍,所以小信號的信號量噪比也比A律大一倍,但是對于大信號來說,u律比a律差。無論哪個折線法,到我們寫程序的時候都變成了一個數(shù)組而已,我們就根據(jù)采樣值的差值落到那個區(qū)間內(nèi)來定義他的編碼值。最后我附上代碼,大家可以琢磨一下,需要詳細(xì)討論可以后臺私我,也可以加入我的星球討論。

代碼

壓縮:

int index = 0, prev_sample = 0;
while (還有數(shù)據(jù)要處理) {    cur_sample = getnextsample();       // 得到當(dāng)前的采樣數(shù)據(jù)    delta = cur_sample-prev_sample;     // 計算出和上一個的增量    if(delta < 0) delta=-delta,sb=8;      else sb=0;                        // sb 保存的是符號位
    code = 4*delta/step_table[index]; // 根據(jù) steptable[] 得到一個 0~7 的值    if (code > 7) code = 7;                // 它描述了聲音強度的變化量
    index += index_adjust[code];    // 根據(jù)聲音強度調(diào)整下次取steptable 的序號    if(index < 0) index=0;            // 便于下次得到更精確的變化量的描述    else if (index > 88) index = 88;
    prev_sample = cur_sample;
    outputode(code|sb);                 // 加上符號位保存起來    }

解壓縮

int index = 0, cur_sample = 0;  //信號從0開始,否則耳朵不保
while (還有數(shù)據(jù)要處理) {    code=getnextcode();           // 得到下一個數(shù)據(jù)
    if ((code & 8) != 0) sb=1     else sb=0;
    code &= 7;                      // 將 code 分離為數(shù)據(jù)和符號
    delta=(step_table[index]*code) /4 + step_table[index] / 8;    // 后面加的一項是為了減少誤差
    if (sb == 1) delta =- delta;
    cur_Sample += delta;            // 計算出當(dāng)前的波形數(shù)據(jù)    if (cur_sample > 32767) cur_sample = 32767;    else if (cur_sample < -32768) cur_sample = -32768;
    output_sample(cur_sample);
    index += index_adjust[code];    if (index < 0) index = 0;    if (index > 88) index = 88;  }

附表

int index_adjust[8] = {-1,-1,-1,-1,2,4,6,8};

 

int step_table[89] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 };

 

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
SII1136CTU 1 Lattice Semiconductor Corporation Consumer Circuit,

ECAD模型

下載ECAD模型
暫無數(shù)據(jù) 查看
TSC2004IRTJR 1 Texas Instruments 12-Bit, Nanopower, 4-Wire Touch Screen Controller 20-QFN -40 to 85

ECAD模型

下載ECAD模型
$3.78 查看
TPS65950A2ZXNR 1 Texas Instruments Integrated Power Management IC (PMIC) with 3 DC/DCs, 11 LDOs, Audio Codec, USB HS Transceiver 209-NFBGA -40 to 85

ECAD模型

下載ECAD模型
$16.55 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

多年硬件從業(yè)經(jīng)驗,專注分享從研發(fā)到供應(yīng)鏈,再到精益制造過程中的經(jīng)驗和感悟!