-2

我对 .wav(声音)文件中的 adpcm 有一些问题。首先,我应该说我没有阅读有关 ADPCM 的所有内容,只是想快速实现并继续工作......(只是培训代码)我从MicroChip 的 pdf guid adpcm实现它。(更好说复制/粘贴和编辑,创建类)

测试代码:

    const std::vector<int8_t> data = {
    64,  67,  71,  75,  79,  83,  87,  91,  94,  98,  101, 104, 107, 110, 112,
    115, 117, 119, 121, 123, 124, 125, 126, 126, 127, 127, 127, 126, 126, 125,
    124, 123, 121, 119, 117, 115, 112, 110, 107, 104, 101, 98,  94,  91,  87,
    83,  79,  75,  71,  67,  64,  60,  56,  52,  48,  44,  40,  36,  33,  29,
    26,  23,  20,  17,  15,  12,  10,  8,   6,   4,   3,   2,   1,   1,   0,
    0,   0,   1,   1,   2,   3,   4,   6,   8,   10,  12,  15,  17,  20,  23,
    26,  29,  33,  36,  40,  44,  48,  52,  56,  60,  64};
void function() {
  std::vector<uint8_t> en;
  std::vector<uint8_t> de;
  {  // encode
    wave::ADPCM adpcm;
    // 32768
    for (size_t i{0}; i < data.size() - 3; i += 4) {
      int16_t first{static_cast<int16_t>(
          ~((static_cast<uint16_t>(data[i]) & 0xff) |
            ((static_cast<uint16_t>(data[i + 1]) << 8) & 0xff00)) +
          1)};
      int16_t second{static_cast<int16_t>(
          ~((static_cast<uint16_t>(data[i + 2]) & 0xff) |
            ((static_cast<uint16_t>(data[i + 3]) << 8) & 0xff00)) +
          1)};
      en.push_back(static_cast<uint8_t>((adpcm.ADPCMEncoder(first) & 0x0f) |
                                        (adpcm.ADPCMEncoder(second) << 4)));
    }
  }
  {  // decode
    wave::ADPCM adpcm;
    for (auto val : en) {
      int16_t result = ~adpcm.ADPCMDecoder(val & 0xf) + 1;
      int8_t temp0 = ((result)&0xff);
      int8_t temp1 = ((result)&0xff00) >> 8;
      de.push_back(temp0);
      de.push_back(temp1);
      result = ~adpcm.ADPCMDecoder(val >> 4) + 1;
      temp0 = ((result)&0xff);
      temp1 = (result & 0xff00) >> 8;
      de.push_back(temp0);
      de.push_back(temp1);
    }
  }
  int i{0};
  for (auto val : de) {
    qDebug() << "real:" << data[i] << "decoded: " << val;
    i++;
  }
}

我确定我的课程和编码/解码是正确的,就在解码之后我应该做一些事情来显示正确的数字(但我不知道哪个转换失败)

为什么我确定?因为当我在 QDebug 中看到我的输出时,其他所有样本(解码后)都是正确的(几乎没有错误,在大数据中错误会比现在小),但其他样本都失败了

我的输出:

real: 26 decoded:  6
real: 29 decoded:  32
real: 33 decoded:  5
real: 36 decoded:  48
real: 40 decoded:  6
real: 44 decoded:  32
real: 48 decoded:  5
real: 52 decoded:  48
real: 56 decoded:  4
real: 60 decoded:  64

设备中的数据为 8 位

4

1 回答 1

0

好的,我找到了答案

当您对任何数字有错误时,您的错误在低位!所以我的预测是对两个数字相加,然后那个数字在低位位置有很多错误!

于 2021-01-22T18:41:32.107 回答