简体   繁体   English

C中的ADPCM解码

[英]ADPCM decoding in C

When I try to decode IMA ADPCM to 16-bit signed PCM I have half-garbaged PCM 当我尝试将IMA ADPCM解码为16位有符号PCM时,我有半耗尽的PCM

I try to decode and encode IMA ADPCM in WAV file(22050 samples/s, 4 bit/sample, 36(!) byte(?) align(?!), 1 channel). 我尝试在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++;
    }
}

Full project with WAV files: https://drive.google.com/open?id=1xuxwXj3Y_QhPDWhrQY7nmz8ycBE1cgyL 包含WAV文件的完整项目: https//drive.google.com/open?id = 1xuxwXj3Y_QhPDWhrQY7nmz8ycBE1cgyL

ADPCM WAV files converted to PCM WAV contains some garbage, but ffmpeg converts it normally. 转换为PCM WAV的ADPCM WAV文件包含一些垃圾,但ffmpeg正常转换它。 PCM WAV to ADPCM WAV conversion currently not implemented. PCM WAV到ADPCM WAV转换目前尚未实现。

This happens because WAV DOES NOT conntains PLAIN IMA ADPCM. 发生这种情况是因为WAV 支持PLAIN IMA ADPCM。 Each first 4 bytes of block are ADPCM state. 每个前4个字节的块都是ADPCM状态。

For example: WAV.align=36;//Block size is 36 bytes, block structure is --|current(16 bits)|step index(16 bytes)|data(WAV.align-4(36-4=32) bytes)|-- 例如: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