长话短说,我在 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。