【发布时间】:2013-11-01 07:43:33
【问题描述】:
长话短说,我在 int r 中有一个音频信号输出,即 r 的值介于 32768 和 - 32768 之间。
我试图创建一个规范化例程,但由于某种原因,以下代码产生了一个半波,只有上部是可见的,或者换句话说,高于 0,没有负值。
在这里(dif 是一个 int,dif_vorher 也是)
if (r * 8 > 32768)
dif = dif_vorher;
else if (r * 8 < -32768)
dif = dif_vorher;
else
dif = r * 8;
dif_vorher = dif;
然后准备将其写入原始文件:
if (dif != 0)
{
putc((char) ( (unsigned)dif & 0xff),ausgabe);
putc((char) (((unsigned)dif >> 8) & 0xff),ausgabe);
}
这个原始文件只有上限值。我也试过了
if (r * 8 > 32768)
dif = 32768;
else if (r * 8 < -32768)
dif = -32768;
else
dif = r * 8;
和
if (r * 8 > 32768 || r * 8 < -32768)
dif = -32768;
else
dif = r * 8;
结果相同,除非我使用
if (r * 8 > 32768)
dif = 32768;
else if (r * 8 < -32768)
dif = -32768;
else
dif = r * 8;
上半部分也变形了。
为什么负面的部分被遗漏了?
编辑:我发现 r * 8 的最大值为 524272,最小值为 0。所以 r_max = 524272/8 = 65534; 65534/2 = 32767。所以看起来这个值被移动了32768以避免负值。
【问题讨论】:
-
您能否展示一些实际(典型)输入数据正在被这段代码处理?
-
乍一看猜你投错了
putc((char) ( (unsigned)dif & 0xff),ausgabe); -
@ryyker 我刚刚在阅读您的回复时这样做了。令人惊讶的是,我没有得到负值,但最多只有 524272。
-
刚刚删除了我的答案。它没有解决你的问题。我可以看到您正在尝试仅使用最低有效 8 位来准备数据,以便它适合 char,对吗?
-
为什么要保留从 32768 到 -32768 的数字,然后下面只保留最后 8 位。为什么不首先将其限制在 127 到 -128 之间?
标签: c raspberry-pi