gpt4 book ai didi

c - C 中的 ADPCM 解码

转载 作者:行者123 更新时间:2023-11-30 16:19:55 26 4
gpt4 key购买 nike

当我尝试将 IMA ADPCM 解码为 16 位签名 PCM 时,我得到了半垃圾 PCM

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

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 ADPCM 中没有将其存储为连续的编码声音流。相反,它存储为 block ,其中 block 的前 4 个字节是初始 ADPCM 解码器状态。

例如:WAV.align=36;// block 大小为36字节, block 结构为--|当前(2字节)|步长索引(2字节)|data(WAV.align-4(36-4) =32) 字节)|--

关于c - C 中的 ADPCM 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55442623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com