首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C语言实现ADPCM译码

用C语言实现ADPCM译码
EN

Stack Overflow用户
提问于 2019-03-31 15:46:50
回答 1查看 1.5K关注 0票数 0

当我试图将IMA ADPCM解码为16位签名PCM时,我有半垃圾PCM。

我试图在WAV文件中解码和编码IMA ADPCM (22050个样本/s,4位/样本,36(!)字节(?对齐(?!),1个通道)。

代码语言:javascript
复制
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文件的完整项目:QhPDWhrQY7nmz8ycBE1cgyL

转换为PCM的ADPCM文件包含一些垃圾,但是ffmpeg通常会对其进行转换。PCM WAV到ADPCM WAV的转换目前尚未实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-05 15:55:36

这是因为WAV不连接普通IMA ADPCM。块的前4个字节都是ADPCM状态。

例如:WAV.准直= 36;//块大小为36字节,块结构为-\x当前(16位)x-步骤索引(16字节)\x数据( For .对齐-4(36-4=32)字节)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55442623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档