- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为嵌入式处理器(ARM Cortex-M4)编写代码
此代码的目的是解码 Intel/DVI 格式(也称为 IMA 格式)的 4 位 ADPCM。我使用 Python 的 audioop
对方波的 ADPCM 样本进行了编码。模块。然后我使用相同的 audioop
成功解码了这个样本。模块,它与输入非常匹配。
但是,我无法在嵌入式处理器上正确解码输入数据。 valpred
代表输出的值似乎在大的正值和大的负值之间失控和振荡。这似乎是由 sign
的行为驱动的。值(value)。我的问题是,这段代码实际上是 audioop
的 C 实现代码的复本。 ,删除了 Python 部分。据我所知,该算法是相同的。然而,对于几乎每个输入数据值,它似乎仍处于振荡状态。这显然是由 sign
驱动的。翻转vpdiff
值,但我看不出如何避免这种情况,因为量化步长如此之高(通常在最大步长 88 处)并且数据似乎确实有交替的符号。
这是我现在正在使用的实现。 adpcm_step_size
数组包含量化步骤(例如 7、8、9 ... 29794、32767),而 adpcm_step_size_adapt
包含步长增量(-1、-1、-1、-1、2、4、6、8、重复)。
void audio_adpcm_play(uint8_t *sample_data, uint16_t sample_size)
{
int sign, delta, step, vpdiff, valpred, index, half;
uint32_t debug_data;
uint32_t result;
uint8_t data = 0x00;
// Initial state
half = 0;
valpred = 0;
index = 0;
step = adpcm_step_size[index];
while(sample_size > 0) {
// Extract the appropriate word
if(half) {
delta = data & 0x0f;
} else {
data = *sample_data++;
delta = (data >> 4) & 0x0f;
sample_size--;
}
half = !half;
debug_data = delta;
// Find new index value
index += adpcm_step_size_adapt[delta];
if(index < 0)
index = 0;
if(index > 88)
index = 88;
// Separate sign and magnitude
sign = delta & 8;
delta = delta & 7;
// Compute difference and the new predicted value
vpdiff = step >> 3;
if(delta & 4)
vpdiff += step;
if(delta & 2)
vpdiff += step >> 1;
if(delta & 1)
vpdiff += step >> 2;
if(sign)
valpred -= vpdiff;
else
valpred += vpdiff;
// Clamp values that exceed the valid range
if(valpred > 32767)
valpred = 32767;
else if(valpred < -32768)
valpred = -32768;
step = adpcm_step_size[index];
result = (valpred + 32767) >> AUDIO_CODE_SHIFT;
uart_printf(DBG_LVL_INFO, \
"data=%02x, source_byte=%02x, samples_rem=%5d, valpred=%7d, vpdiff=%5d, sign=%02x, delta=%02x, index=%3d, step=%3d, adapt=%3d, res=%5d/%5d\r\n", \
debug_data, data, sample_size, valpred, vpdiff, sign, delta, index, step, \
adpcm_step_size_adapt[delta], result, AUDIO_CODE_DUTY_MAX);
}
}
data=07, source_byte=f7, samples_rem= 7999, valpred= 19, vpdiff= 30, sign=00, delta=07, index= 16, step= 34, adapt= 8, res= 128/ 256
data=0f, source_byte=f7, samples_rem= 7998, valpred= -44, vpdiff= 63, sign=08, delta=07, index= 24, step= 73, adapt= 8, res= 127/ 256
data=07, source_byte=f7, samples_rem= 7998, valpred= 92, vpdiff= 136, sign=00, delta=07, index= 32, step=157, adapt= 8, res= 128/ 256
data=0f, source_byte=f7, samples_rem= 7997, valpred= -201, vpdiff= 293, sign=08, delta=07, index= 40, step=337, adapt= 8, res= 127/ 256
data=07, source_byte=f7, samples_rem= 7997, valpred= 430, vpdiff= 631, sign=00, delta=07, index= 48, step=724, adapt= 8, res= 129/ 256
data=0f, source_byte=f7, samples_rem= 7996, valpred= -927, vpdiff= 1357, sign=08, delta=07, index= 56, step=1552, adapt= 8, res= 124/ 256
data=07, source_byte=f7, samples_rem= 7996, valpred= 1983, vpdiff= 2910, sign=00, delta=07, index= 64, step=3327, adapt= 8, res= 135/ 256
data=0f, source_byte=f7, samples_rem= 7995, valpred= -4253, vpdiff= 6236, sign=08, delta=07, index= 72, step=7132, adapt= 8, res= 111/ 256
data=07, source_byte=f7, samples_rem= 7995, valpred= 9119, vpdiff=13372, sign=00, delta=07, index= 80, step=15289, adapt= 8, res= 163/ 256
data=0d, source_byte=d5, samples_rem= 7994, valpred= -11903, vpdiff=21022, sign=08, delta=05, index= 84, step=22385, adapt= 4, res= 81/ 256
data=05, source_byte=d5, samples_rem= 7994, valpred= 18876, vpdiff=30779, sign=00, delta=05, index= 88, step=32767, adapt= 4, res= 201/ 256
data=0b, source_byte=b3, samples_rem= 7993, valpred= -9793, vpdiff=28669, sign=08, delta=03, index= 87, step=29794, adapt= -1, res= 89/ 256
data=03, source_byte=b3, samples_rem= 7993, valpred= 16276, vpdiff=26069, sign=00, delta=03, index= 86, step=27086, adapt= -1, res= 191/ 256
data=0c, source_byte=c4, samples_rem= 7992, valpred= -14195, vpdiff=30471, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 72/ 256
data=04, source_byte=c4, samples_rem= 7992, valpred= 22667, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 216/ 256
data=09, source_byte=9c, samples_rem= 7991, valpred= 10381, vpdiff=12286, sign=08, delta=01, index= 87, step=29794, adapt= -1, res= 168/ 256
data=0c, source_byte=9c, samples_rem= 7991, valpred= -23137, vpdiff=33518, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 37/ 256
data=04, source_byte=4c, samples_rem= 7990, valpred= 13725, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 181/ 256
data=0c, source_byte=4c, samples_rem= 7990, valpred= -23137, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 37/ 256
data=04, source_byte=4c, samples_rem= 7989, valpred= 13725, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 181/ 256
data=0c, source_byte=4c, samples_rem= 7989, valpred= -23137, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 37/ 256
data=04, source_byte=4c, samples_rem= 7988, valpred= 13725, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 181/ 256
data=0c, source_byte=4c, samples_rem= 7988, valpred= -23137, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 37/ 256
data=04, source_byte=4c, samples_rem= 7987, valpred= 13725, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 181/ 256
data=0c, source_byte=4c, samples_rem= 7987, valpred= -23137, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 37/ 256
data=04, source_byte=4c, samples_rem= 7986, valpred= 13725, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 181/ 256
data=0c, source_byte=4c, samples_rem= 7986, valpred= -23137, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 37/ 256
data=04, source_byte=4c, samples_rem= 7985, valpred= 13725, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 181/ 256
data=0c, source_byte=4c, samples_rem= 7985, valpred= -23137, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 37/ 256
data=04, source_byte=4c, samples_rem= 7984, valpred= 13725, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 181/ 256
data=0c, source_byte=4c, samples_rem= 7984, valpred= -23137, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 37/ 256
data=01, source_byte=14, samples_rem= 7983, valpred= -10851, vpdiff=12286, sign=00, delta=01, index= 87, step=29794, adapt= -1, res= 85/ 256
data=04, source_byte=14, samples_rem= 7983, valpred= 22667, vpdiff=33518, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 216/ 256
data=0c, source_byte=c4, samples_rem= 7982, valpred= -14195, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 72/ 256
data=04, source_byte=c4, samples_rem= 7982, valpred= 22667, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 216/ 256
data=0c, source_byte=c4, samples_rem= 7981, valpred= -14195, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 72/ 256
data=04, source_byte=c4, samples_rem= 7981, valpred= 22667, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 216/ 256
data=0c, source_byte=c4, samples_rem= 7980, valpred= -14195, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 72/ 256
data=04, source_byte=c4, samples_rem= 7980, valpred= 22667, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 216/ 256
data=0c, source_byte=c4, samples_rem= 7979, valpred= -14195, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 72/ 256
data=04, source_byte=c4, samples_rem= 7979, valpred= 22667, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 216/ 256
data=0c, source_byte=c4, samples_rem= 7978, valpred= -14195, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 72/ 256
data=04, source_byte=c4, samples_rem= 7978, valpred= 22667, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 216/ 256
data=0c, source_byte=c4, samples_rem= 7977, valpred= -14195, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 72/ 256
data=04, source_byte=c4, samples_rem= 7977, valpred= 22667, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 216/ 256
data=0c, source_byte=c4, samples_rem= 7976, valpred= -14195, vpdiff=36862, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 72/ 256
data=04, source_byte=c4, samples_rem= 7976, valpred= 22667, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 216/ 256
data=09, source_byte=9c, samples_rem= 7975, valpred= 10381, vpdiff=12286, sign=08, delta=01, index= 87, step=29794, adapt= -1, res= 168/ 256
data=0c, source_byte=9c, samples_rem= 7975, valpred= -23137, vpdiff=33518, sign=08, delta=04, index= 88, step=32767, adapt= 2, res= 37/ 256
data=04, source_byte=4c, samples_rem= 7974, valpred= 13725, vpdiff=36862, sign=00, delta=04, index= 88, step=32767, adapt= 2, res= 181/ 256
audioop
的来源模块可以在这里找到
https://github.com/python/cpython/blob/master/Modules/audioop.c ,ADPCM解码器为
audioop_adpcm2lin_impl
.
最佳答案
我设法解决了这个问题。它是由一个愚蠢的错误引起的,一次读取一个字节的 16 位输入数据,然后使用相同的错误解压缩数据,在 Python 中产生了正确的结果。但这显然不利于解码器的 C 实现。
事后看来,我不确定为什么我没有注意到音频文件的大小是应有的两倍。
关于c - 为什么我的 ADPCM 解码器似乎在振荡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49254529/
令我惊讶的是,dart 没有内置的对象到 json 和 json 到对象的映射器。 我读到我们必须自己手动编写映射代码,这并不令人愉快。 无论如何,虽然我没有针对我的用例对其进行彻底测试,但我发现了
我有 16 位 PCM 音频,我想将其转换为 8 位 PCMU。据我所知,16 位到 8 位的转换很容易 - 只需从每个样本中删除最后 8 位即可。 我想知道如何将8位pcm转换为8位pcmu?任何文
我的任务是使用动态霍夫曼修改 JPEG 格式。所以我试图找到用Java编写的简单Jpeg解码器的源代码。谁能帮我? 最佳答案 看看这个:http://www.dreamincode.net/forum
我收到错误代码(如下),并且无法解码该字符串,我知道它正在查找 JSON 和我也保存的文件,但它无法解析。错误代码: Unexpected token VALUE(-10) at position 8
我制作了这个程序,它是一个随 secret 码。 public class SaadAbdullahCipher { private char[] alphabet = {'a', 'b'
总的来说,我对编程还很陌生,我想知道如何对输入的文本进行编码/解码。 对于 ex A -> D,所有字母必须减去 3 个字母B -> E等等 我将输入一些伪代码作为示例: INPUT MESSAGE:
是否有内置函数或受支持的包中的函数来获取基于输入字符集字符串,例如 ISO-8859-1 或 ISO-8859-15?现在我看到的唯一方法是自己匹配它: func getEncoderForChars
我是新来的。不知何故,我能够理解如何做到这一点。 我在下面做,但它给出了错误 - 无法读取数据,因为它的格式不正确。有人可以帮助我吗?从过去的 4 天开始,我一直坚持这一点。我真的很感激。 impor
就像标题所说,我正在尝试为一个我定义的类的对象编写一个自定义解码器,该对象包含我定义的类的其他对象。 “外部”类是一个 Edge,定义如下: class Edge: def __init__(
我想重新编码音频文件的音频流。以下gstreamer管道可以正常工作: gst-launch-1.0 filesrc location=input.flac ! decodebin ! audioco
使用Swift4、iOS11.1、Xcode9.1, 尝试匹配 Swift4 的可编码结构中的 JSON 文件,我遇到以下问题: 这是我的代码: struct Station: Codable {
正如标题所示,我正在寻找遵循 1.3 版本的 Java(+Android) WBXML 解析器/解码器。如果有必要的话,我什至可以考虑调用 native 代码。谢谢。 最佳答案 我确实记得不久前我使用
当 JABX 解码器尝试解码 xml 时,我遇到以下错误 线程“main”中出现异常 javax.xml.bind.UnmarshalException - 带有链接异常:[org.xml.sax.S
我正在处理不同尺寸(x,y)的图像。当在 MaxPooling2D 之后使用 UpSampling2D 时,它不能很好地重建它,因为 x-dim 不等于 y-dim。当 x=y (例如 28x28)时
http://www.lotterypost.com/js-compress.aspx 这个网站非常适合压缩 JS 但我想解码.... 除了在线之外,有没有最好的免费工具来编码/解码 Js 最佳答案
我刚刚在验证 JWT 时遇到了问题。我正在运行的代码是一个相当肮脏的黑客,它采用 JWT 的第二个组件并通过 Base64 解码器运行它。然而事实证明,通过一些 super 特殊的 JWT,我得到了一
我正在尝试使用 CUDA 解码器项目中的代码将解码后的图像文件保存回 BMP 图像。 if (g_bReadback && g_ReadbackSID)
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
在自己尝试 URL 解码之后,我设法想出了一些可行的想法 - 但它们不是很有效。由于 URL 解码是我的程序中可能出现严重瓶颈的地方,我决定上网寻找更有效的解决方案。我遇到了这篇 codeguru 文
是否可以“拦截” JAXB 的解码过程? 我有一个 xml 响应,部分应该转换为不同的 java 字段结构: ... 在我的 java 类中,我更愿意将其解码为 List ,
我是一名优秀的程序员,十分优秀!