0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡單的聲音數(shù)據(jù)ADPCM壓縮方法

聚豐開發(fā) ? 2019-01-11 18:12 ? 次閱讀

| 聚豐開發(fā)方案開發(fā)設(shè)計(jì)及PCBA批量交付|

▼▼▼


前兩天有朋友發(fā)郵件給我,他有2~3k大小的圖像,想用AVR的單片機(jī)進(jìn)行壓縮處理,看我有什么建議。


《刪繁就簡-單片機(jī)入門到精通》(我寫的~(#^.^#))一書中有一章節(jié)的內(nèi)容和數(shù)據(jù)壓縮有關(guān),我在網(wǎng)上也發(fā)布了相關(guān)的測試源代碼,這些代碼可以用做參考。


我們常使用的JPG圖片是一種效率較高的壓縮方法,在圖像細(xì)節(jié)沒有明顯失真的情況下可以達(dá)到10倍的壓縮率,不過這個10倍是針對尺寸比較大的圖像,對于小尺寸圖像并不適用。原因是通用的壓縮方法,都需要包含一個頭信息,頭信息會占用一定空間,這樣對于小尺寸圖像雖然圖像數(shù)據(jù)能有比較好的壓縮率,但加上頭信息最后得到的全部數(shù)據(jù)縮小的比率就有限。


越是壓縮率高的方法,其算法自然也越復(fù)雜,像這位朋友用的是AVR單片機(jī),處理復(fù)雜算法的能力有限,幾年前我們用51的單片機(jī)測試過160*120大小的圖像,壓縮成JPG需要3~4秒的時間,完全不能滿足應(yīng)用需求。(壓縮會比解壓縮更費(fèi)時間)


除了圖像,聲音數(shù)據(jù)也常常需要進(jìn)行壓縮處理
,不過聲音的壓縮處理方法和圖像會有所不同,大多是提取聲音數(shù)據(jù)的規(guī)律,用數(shù)學(xué)模型來模擬人喉嚨發(fā)聲,這種方法壓縮率高,但需要非常復(fù)雜的運(yùn)算,也不適合低速的單片機(jī)用程序?qū)崿F(xiàn)。


但有一種簡單的聲音壓縮方法例外,這種方法完全是基于被壓縮的數(shù)據(jù)分布特性,認(rèn)為聲音數(shù)據(jù)是在0幅度上下正態(tài)分布,幅度越大的值出現(xiàn)的幾率越小,而且采樣所得的數(shù)據(jù)通常是平滑相連,出現(xiàn)上一點(diǎn)幅度為正最大而下一點(diǎn)幅度為負(fù)最小的可能性幾乎為零,兩點(diǎn)間的變化差異大都局限于一定范圍之內(nèi),于是將聲音數(shù)據(jù)處理相鄰兩點(diǎn)的變化值,從而起到壓縮效果,這樣處理的算法也比較簡單。

這里給大家介紹
一種簡單的ADPCM處理方法,是我以前在網(wǎng)上收集的。用這種方法實(shí)際上也可以用來處理前面圖像數(shù)據(jù)壓縮的問題,只是需要先將圖像數(shù)據(jù)預(yù)處理為RGB或YUV分量,然后進(jìn)行壓縮處理


IMA-ADPCM 算法

-------------------------------------------------------


IMA-ADPCM (ADPCM Adaptive Differential Pulse Code Modulation), 是一種針對 16bit (或者更高?) 聲音波形數(shù)據(jù)的一種有損壓縮算法, 它將聲音流中每次采樣的 16bit 數(shù)據(jù)以 4bit 存儲, 所以壓縮比 1:4. 而壓縮/解壓縮算法非常的簡單, 所以是一種低空間消耗,高質(zhì)量聲音獲得的好途徑. 著名的 WestWood 在它的許多游戲里都使用了這個技術(shù), DUNE II, C&C, RA 等等, 保存聲音的數(shù)據(jù)文件后綴名為 .AUD 的大多用 IMA-ADPCM 壓縮. (不過 WestWood 的游戲數(shù)據(jù)文件大多經(jīng)過打包, 這些小文件統(tǒng)統(tǒng)放進(jìn)了一個 .MIX 文件包中, 關(guān)于解開 .MIX 文件包, 見http://www.geocities.com/SiliconValley/8682)


ADPCM 主要是針對連續(xù)的波形數(shù)據(jù)的, 保存的是波形的變化情況, 以達(dá)到描述整個波形的目的. 本文并不想詳細(xì)介紹 ADPCM 算法原理, 那些是數(shù)學(xué)知識,有高等數(shù)學(xué)基礎(chǔ)的朋友可以自己研究, 云風(fēng)數(shù)學(xué)馬馬虎虎, 這里也講不清楚, 但是它的編碼和解碼的過程卻很簡潔, 列在后面, 相信大家能夠看明白.


先給不熟悉聲音信號的儲存的朋友補(bǔ)一課, 不想看就跳過吧 ^_^: 一般游戲中用到的聲音有兩種不同性質(zhì)的, 一是波形數(shù)據(jù), 是經(jīng)過事先聲音采樣錄制下來的, 采樣時一般按每秒 8千到 4 萬次的頻率(8Khz ~44.4Khz)記錄每次采樣時的聲音強(qiáng)度, 在播放時, 再以同一頻率, 按樣本聲音的強(qiáng)弱變化觸發(fā)揚(yáng)聲器, 聲音就被重現(xiàn)了, 如果你將采樣數(shù)據(jù)流標(biāo)在坐標(biāo)紙上,就會發(fā)現(xiàn)是一條波形曲線, 如果采樣時將聲音信號強(qiáng)弱分為 256 級, 就是我們說的 8bit 采樣, 如果分為 65536 級, 就是 16bit 采樣了; 另一是 MIDI 類的, 它是將各種樂器的聲學(xué)性質(zhì)都事先記錄下來, 而數(shù)據(jù)流中仍舊是按一定頻率記錄, 但不是每秒數(shù)千上萬次了, 大約只有幾 Hz 到幾十 Hz, 將幾種樂器按某一音頻和強(qiáng)度觸發(fā)描述下來, 經(jīng)過聲卡合成為波形信號就可以播放了.


8bit 采樣的聲音人耳是可以接受的, 比如 Win95 啟動的音樂, 而 16bit 采樣的聲音可以算是高音質(zhì)了, 現(xiàn)代游戲中也多采用它. (將聲音強(qiáng)度分的更細(xì)沒有太多的意義, 通常都是提高采樣頻率來近一步提高音質(zhì)) ADPCM 算法卻可以將每次采樣得到的 16bit 數(shù)據(jù)壓縮到 4bit ;-) 需要注意的是, 如果要壓縮/接壓縮立體聲信號, 請注意采樣時, 聲音信號是放在一起的, 需要將兩個聲道分別處理. OK, 下面列出了其中的奧妙, 請細(xì)細(xì)品味:


----------------------------------------------------------------


IMA-ADPCM 壓縮過程


首先我們認(rèn)為聲音信號都是從零開始的,那么需要初始化兩個變量


int index="0",prev_sample:=0;


下面的循環(huán)將依次處理聲音數(shù)據(jù)流, 注意其中的 getnextsample() 應(yīng)該得到一個 16bit 的采樣數(shù)據(jù), 而 outputdata() 可以將計(jì)算出來的數(shù)據(jù)保存起來,程序中用到的 step_table[], index_adjust[] 附在后面:
int index="0",prev_sample:=0;


while (還有數(shù)據(jù)要處理) {
cur_sample=getnextsample(); // 得到當(dāng)前的采樣數(shù)據(jù)
delta="cur"_sample-prev_sample; // 計(jì)算出和上一個的增量
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"; // 它描述了聲音強(qiáng)度的變化量


index+=index_adjust[code]; // 根據(jù)聲音強(qiáng)度調(diào)整下次取 steptable 的序號
if (index<0) index="0";??????????? // 便于下次得到更精確的變化量的描述
else if (index>88) index="88";


prev_sample=cur_sample;


outputode(code|sb); // 加上符號位保存起來
}


---------------------------------------------------------


IMA-ADPCM 解壓縮過程


接壓縮實(shí)際是壓縮的一個逆過程, 同樣其中的 getnextcode() 應(yīng)該得到一個編碼, 而 outputsample() 可以將解碼出來的聲音信號保存起來. 這段代碼同樣使用了同一個的 setp_table[] 和 index_adjust() 附在后面:


int index="0",cur_sample:=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;
// 后面加的一項(xiàng)是為了減少誤差


if (sb==1) delta="-delta";


cur_Sample+=delta; // 計(jì)算出當(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 };



---------------------------------------------------------
關(guān)于 WestWood 的 .AUD 文件,結(jié)構(gòu)比較簡單, 這里順帶提一下, 有興趣可以自己寫處理 AUD 文件的程序 ;-) 其 8bit 的聲音壓縮算法尚不知曉, 但用的最廣泛的 16bit 聲音正是用 IMA-ADPCM 壓縮, 每個 AUD 文件都有一個文件頭, 結(jié)構(gòu)如下:


struct {
unsigned short int samplespersec; // 頻率
long int size; // 除掉文件頭的大小
long int outsize; // 輸出數(shù)據(jù)大小 (通常是 4 倍)
unsigned char flags; // 位 0 描述是否立體聲, 位 1 描述是否 16 bit
unsigned char type; // 1=WW 壓縮, 99=IMA ADPCM
}


AUD 文件的聲音信號是按塊存放的, 每塊大約 512 字節(jié), 沒一塊都有一個塊頭結(jié)構(gòu):


struct {
unsigned short int size; // 壓縮過的數(shù)據(jù)大小
unsigned short int outsize; // 輸出數(shù)據(jù)大小 (通常是 4 倍)
long int id; // 永遠(yuǎn)是 0x0000DEAF
}


---------------------------------------------------------
本文參考了 Vladan Bato 寫的 AUD 文件格式描述. 可以去他的網(wǎng)頁
http://www.geocities.com/SiliconValley/8682找到原文和他寫的 AUD,WAV 轉(zhuǎn)換程序.另外, Allegro 的愛好者可能想自己加入 AUD 的支持(Allegro 3.1 新增 Plug-In 支持, 增加新文件類型很方便), 不妨看看http://www.alphalink.com.au/~tjaden, 這里有完成了的 AUD 支持庫.
---------------------------------------------------------


聚豐開發(fā)網(wǎng)址:http://wenjunhu.com/kf/

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 方案開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    2677
  • 電子開發(fā)者
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    3649
收藏 人收藏

    評論

    相關(guān)推薦

    TLV320AIC23Baic23輸出結(jié)果的是聲音波形的采樣值,還是經(jīng)過編碼或壓縮后的數(shù)據(jù)?

    TLV320AIC23Baic23輸出結(jié)果的是聲音波形的采樣值,還是經(jīng)過編碼或壓縮后的數(shù)據(jù)? 把數(shù)據(jù)拿出來繪制成波形,怎么看都不像聲音信號
    發(fā)表于 11-08 06:02

    TAS5711聲音卡卡的,有沒有加強(qiáng)抗干擾的方法?

    請問聲音輸出容易受開關(guān)電源干擾,聲音卡卡的,有沒有加強(qiáng)抗干擾的方法?電源12V,喇叭是4Ω的,LC取多大值比較合適?
    發(fā)表于 10-31 08:15

    壓縮算法的類型和應(yīng)用

    壓縮算法是一種通過減少數(shù)據(jù)量來節(jié)省存儲空間或傳輸數(shù)據(jù)的技術(shù)。壓縮算法可以分為兩種類型:有損壓縮和無損壓縮
    的頭像 發(fā)表于 10-21 13:50 ?269次閱讀

    利用AIC3268進(jìn)行錄音和放音時,播放的聲音中包含大量的白噪聲,有什么方法可以抑制白噪聲,提高聲音品質(zhì)?

    利用AIC3268進(jìn)行錄音和放音時,發(fā)現(xiàn)播放的聲音中包含大量的白噪聲,噪聲的頻率分布從0到fs/2,請問有什么方法可以抑制白噪聲,提高聲音品質(zhì)?
    發(fā)表于 10-17 06:50

    AP23682/ap23341/ap23170/ap23085語音OTP IC英文手冊

    的采樣率和4位ADPCM壓縮下,可以存儲長達(dá)682秒的語音。聲音組數(shù)量:支持最多1024組聲音,可以通過聲音切片組合來延長播放時間。
    發(fā)表于 08-08 14:46 ?0次下載

    AP89042高性能的語音集成電路(IC)英文手冊

    ADPCM 壓縮下,可存儲 42 秒的語音長度。最多支持 32 組聲音。支持聲音切片組合,以延長播放時間。提供 960 段語音模塊可重復(fù)組合。用戶可選擇 PCM 或
    發(fā)表于 08-08 14:37 ?0次下載

    aP89341/170/085語音集成電路(IC)的產(chǎn)品英文規(guī)格書

    ADPCM 壓縮下,可存儲 341 秒 170秒 ?085秒的語音。聲音組數(shù)量:最多支持 254 組聲音。聲音模塊組合:提供 7680 段
    發(fā)表于 08-08 14:34 ?0次下載

    收錄機(jī)聲音小什么故障

    收錄機(jī)聲音小可能是由多種原因?qū)е碌?,以下是一些可能的原因及解決方法的分析: 音量調(diào)節(jié)問題 收錄機(jī)的音量調(diào)節(jié)可能沒有調(diào)到合適的位置,導(dǎo)致聲音較小。解決方法是檢查音量調(diào)節(jié)旋鈕或按鈕,確保其
    的頭像 發(fā)表于 07-16 14:37 ?1889次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的壓縮方法

    ,CNN模型的參數(shù)量和計(jì)算量也隨之劇增,這對硬件資源提出了嚴(yán)峻挑戰(zhàn)。因此,卷積神經(jīng)網(wǎng)絡(luò)的壓縮方法成為了研究熱點(diǎn)。本文將從多個角度詳細(xì)介紹卷積神經(jīng)網(wǎng)絡(luò)的壓縮方法,包括前端
    的頭像 發(fā)表于 07-11 11:46 ?357次閱讀

    將格式化數(shù)據(jù)存儲到char數(shù)組的最簡單方法是什么?

    os_printf將文本格式化為 UART 輸出的函數(shù)。 將格式化數(shù)據(jù)存儲到 char 數(shù)組的最簡單方法是什么?
    發(fā)表于 07-11 08:01

    聲音測量的定義和典型應(yīng)用

    一、什么是聲音測量?聲音測量是聲學(xué)測量的一種。聲學(xué)測量是研究聲學(xué)測量技術(shù)的科學(xué),包括測量方法和測量儀器。基本的聲學(xué)測量包括聲強(qiáng)測量、聲質(zhì)點(diǎn)速度測量、波長測量、加速度測量、傳聲器和水聽器絕對校準(zhǔn)、通信
    的頭像 發(fā)表于 06-29 08:31 ?1590次閱讀
    <b class='flag-5'>聲音</b>測量的定義和典型應(yīng)用

    高性能無損數(shù)據(jù)壓縮FPGA IP,LZO無損數(shù)據(jù)壓縮IP

    LZOAccel-D是一個無損數(shù)據(jù)壓縮引擎的FPGA硬件實(shí)現(xiàn),兼容LZO 2.10標(biāo)準(zhǔn)。 Core接收壓縮的輸入數(shù)據(jù)塊,產(chǎn)生解壓縮后的
    的頭像 發(fā)表于 02-25 09:59 ?320次閱讀
    高性能無損<b class='flag-5'>數(shù)據(jù)</b>解<b class='flag-5'>壓縮</b>FPGA IP,LZO無損<b class='flag-5'>數(shù)據(jù)</b>解<b class='flag-5'>壓縮</b>IP

    高性能無損數(shù)據(jù)壓縮FPGA IP,LZO無損數(shù)據(jù)壓縮IP

    LZOAccel-C是一個無損數(shù)據(jù)壓縮引擎的FPGA硬件實(shí)現(xiàn),兼容LZO 2.10標(biāo)準(zhǔn)。 Core接收未壓縮的輸入數(shù)據(jù)塊,產(chǎn)生壓縮后的數(shù)據(jù)
    的頭像 發(fā)表于 01-25 13:39 ?477次閱讀
    高性能無損<b class='flag-5'>數(shù)據(jù)壓縮</b>FPGA IP,LZO無損<b class='flag-5'>數(shù)據(jù)壓縮</b>IP

    伺服電機(jī)最簡單控制方法

    伺服電機(jī)是一種特殊的電機(jī),可以根據(jù)控制信號準(zhǔn)確地控制角度、速度和位置。伺服電機(jī)的最簡單控制方法可以分為開環(huán)控制和閉環(huán)控制兩種。 開環(huán)控制:開環(huán)控制是指通過直接提供控制信號,使伺服電機(jī)旋轉(zhuǎn)到所設(shè)
    的頭像 發(fā)表于 01-14 14:40 ?1952次閱讀

    labview聲音采集與處理

    LabVIEW是一種用于數(shù)據(jù)采集與處理的編程語言和開發(fā)環(huán)境。它具有強(qiáng)大的聲音采集和處理功能,可以幫助用戶實(shí)現(xiàn)聲音信號的采集、分析和處理。本文將詳細(xì)介紹LabVIEW在聲音采集與處理方面
    的頭像 發(fā)表于 01-04 10:48 ?2382次閱讀