簡體   English   中英

C中的ADPCM解碼

[英]ADPCM decoding in C

當我嘗試將IMA ADPCM解碼為16位有符號PCM時,我有半耗盡的PCM

我嘗試在WAV文件中解碼和編碼IMA ADPCM(22050個樣本/秒,4位/樣本,36(!)字節(?)對齊(?!),1個通道)。

int16_t decodeImaAdpcmSampleUIS(struct AdpcmState* state, const uint8_t sample){
int diff;
int8_t si=state->stepindex;
int step=i_step_table[si];
int cur=state->current;

diff=step>>3;
if( sample&0x04 ) diff += step;
if( sample&0x02 ) diff += step>>1;
if( sample&0x01 ) diff += step>>2;
if( sample&0x08 ){
cur -= diff;
if(cur<-32768)
    cur=-32768;
}else{
cur += diff;
if(cur>32767)
    cur=32767;
}
//predictor: cur, state.current
//step_index: si, stepindex
si+=ima_index_table[sample&0b111];
if(si < 0)
    si = 0;
if(si > 88)
    si = 88;
state->stepindex=si;

return state->current=cur;
}

void decodeImaAdpcm(uint8_t* src, int16_t* dst, size_t srcLen){
    struct AdpcmState state={0,0};

    for(size_t i=0; i<srcLen; i++){
        *(dst++)=decodeImaAdpcmSampleUIS(&state, (*src)&0xf);
        *(dst++)=decodeImaAdpcmSampleUIS(&state, (*src)>>4);
        src++;
    }
}

包含WAV文件的完整項目: https//drive.google.com/open?id = 1xuxwXj3Y_QhPDWhrQY7nmz8ycBE1cgyL

轉換為PCM WAV的ADPCM WAV文件包含一些垃圾,但ffmpeg正常轉換它。 PCM WAV到ADPCM WAV轉換目前尚未實現。

發生這種情況是因為WAV 支持PLAIN IMA ADPCM。 每個前4個字節的塊都是ADPCM狀態。

例如:WAV.align = 36; //塊大小為36字節,塊結構為 - |當前(16位)|步驟索引(16字節)|數據(WAV.align-4(36-4 = 32)字節)| -

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM