ADPCM 音訊壓縮演算法

2021-06-18 06:24:45 字數 1993 閱讀 6180

adpcm(adaptive differential pulse code modulation),是一種針對 16bits( 或8bits或者更高) 聲音波形資料的一種有損壓縮演算法,它將聲音流中每次取樣的 16bit 資料以 4bit 儲存,所以壓縮比 1:4. 而且壓縮/解壓縮演算法非常簡單,是一種低空間消耗,高質量高效率聲音獲得的好途徑。儲存聲音的資料檔案字尾名為 .aud 的大多用adpcm 壓縮。

adpcm 主要是針對連續的波形資料的,儲存的是波形的變化情況,以達到描述整個波形的目的。

8bits取樣的聲音人耳是可以勉強接受的,而 16bit 取樣的聲音可以算是高音質了。adpcm 演算法卻可以將每次取樣得到的 16bit 資料壓縮到 4bit。需要注意的是,如果要壓縮/解壓縮得是立體聲訊號,取樣時,聲音頻號是放在一起的,需要將兩個聲道分別處理。

以上文字摘自

自己寫該演算法時參考了上述部落格中的內容。但後來才知道stm32官方也有該演算法的文件和程式,於是自己基於上面兩份資料寫了關於該演算法的**。當然還有很多不懂的,不對處望博友指正。

我用的是stm32的adc、dac,它是12bit取樣,所以我稍微將傳統的adpcm給改了下。

typedef __packed struct

_s_adpcm;

int8_t index_adjust[16] = ;

uint16_t step_table[89] = 

;void adpcm_encoder(_s_adpcm *state,int16_t* pinbuf,uint8_t *poutbuf,uint8_t len)

else

#if 1

tmpstep = step;

prediff = (step >>3);

if(delta >= tmpstep)

tmpstep = tmpstep>>1;

if(delta >= tmpstep)

tmpstep = tmpstep>>1;

if(delta >= tmpstep)

#else

code = (delta<<2)/(step);

if(code >7) 

code = 7;

prediff = (delta * step)>>2;

#endif

if(code & 8)

else

if(predata > 2047)

else if(predata < -2048)

index+=index_adjust[code];

if(index < 0)

index=0;

else if(index >59)

index=59;

if(i&0x01)

else

}state->valprev = (int16_t)predata;

state->index =(int8_t)index;

}void adpcm_decoder(uint8_t *pinbuf,int16_t *poutbuf,uint8_t len,_s_adpcm *state)

state->valprev = (int16_t)predsample;

state->index = (int8_t)index;

}對上述**進行簡單說明下:

編碼時將16bit壓縮成4bit,輸出時是8bit的資料,先接到的資料放在8bit的低4位,第二次接到的資料放在高4位。

其中在編碼函式中採用了條件編譯,現在採用的即為演算法介紹中編碼方式。演算法參考文件:

(當然也是stm32 adpcm編碼採用的方式)。另乙個條件選擇是一種粗略演算法,我感覺沒有前面一種編碼效果好(我只驗證了第一種編碼方式,第二種沒有試驗)。

解碼時就要將壓縮後的資料給分開來。即假如編碼數量為32個16bit的資料,經過壓縮可得到16個8bit的資料,再經過解壓縮可得到32個16bit資料。編譯碼侷限性在於編碼數量我只考慮了偶數情況,奇數情況我還沒考慮。

當然上述演算法還有待優化~~時間允許的話,一定仔細研究下,從而優化自己的**。

音訊壓縮編碼

只有當信源產生的訊號具有冗餘時,才能對其進行壓縮。下面介紹幾種音訊冗餘的概念 1 時域冗餘度 幅度的非均勻分布 統計表明,語音中的小幅度樣本比大幅度樣本出現的概率要高。週期之間的相關 在特定的瞬間,某一聲音往往只是有頻帶內少數頻率成分起作用。當聲音中只存在少數幾個頻率時,就會象波一樣,在週期與週期之...

常見音訊演算法

注 紅色標記,是經常的稱呼。aec acoustic echo cancellation 回聲消除 演算法agc automatic gain control 增益控制 自動增益控制 anc active noise control 雜訊抑制 降噪 主動雜訊控制 雜訊消除 主動降噪 ans auto...

資料壓縮 MPEG音訊編碼

一.實驗原理 2.mpeg 1音訊編碼器框架圖 多相濾波器組 polyphasefilter bank 將pcm 樣本變換到 32個子帶的頻域訊號 如果輸入的取樣頻率為 48khz 那麼子帶的頻率寬度為 48 2 32 0.75hz 心理聲學模型 psychoacousticmodel 計算訊號中不...