如何使用ADPCM微芯片



我在.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位

好的,我找到了我的答案

当你在任何数字上有错误时,你的错误都在低位!所以我的预测是在两个数字上,然后这个数字在低位,有很多错误!

最新更新