我到数字音频信号的比特深度减少从24到16位。

以各样品的仅16个最显著位(即截断)等效于做(在*为0xFFFF / 0XFFFFFF出=)比例计算?

有帮助吗?

解决方案

我想你平均(in * 0xFFFF) / 0xFFFFFF,在这种情况下,是的。

其他提示

您会得到更好的通过将精心制作的噪声信号与原始信号,略低于截断门槛,截断(又名抖动)之前探测结果。

抖动通过一般给你更好的结果增加噪音。这里的关键是噪声的形状。该地区人口的 POW-R 抖动算法具有特定的形状,其在很多的数字音频工作站的应用程序(步态的SONAR,逻辑等)非常流行。

如果您不需要完整的POW-R的保真度,你可以简单地产生一些噪音在相当低的幅度,并将其混入你的信号。你会发现这掩盖了一些量化的效果。

x * 0xffff / 0xffffff过于迂腐,但不是一个好办法,如果你的样品签字 - 并且可能不是一般的好办法

是的,你想在你的源范围内的最大值来匹配您的目的地范围的最大值,但值使用的只有无符号的范围,以及量化步骤进行分配,这将是非常罕见的,您使用的最大可能输出值。

如果将样品签署那么峰值正值将是0x7FFF的和0x7fffff,而峰值负值将-0x8000和-0x800000。你的第一个问题是决定+1是否等于到0x7FFF,或-1等于-0x8000。如果你选择后者,然后它是一个简单的移位操作。如果你试图同时拥有那么零不再是零。

在你有一个问题,即划分轮趋向于零。这意味着,太多的价值得到圆润零与其他值进行比较。这会导致失真。

如果要根据峰值正值按比例绘制,正确的形式将是:

out = rint((float)in * 0x7fff / 0x7fffff);

如果你钓鱼了一下周围,你也许可以找到一种有效的方式来做到这一点与整数运算和分割。

此形式应该正确圆到对任何给定输入最近的可用的输出值,并且它应该映射的最大可能的输入值的最大可能输出值,但是它会具有散布于整个范围的量化步骤的丑陋分布

大多数人都喜欢:

out = (in + 128) >> 8;
if (out > 0x7fff) out = 0x7fff;

此形式使事情最微小的位响,到如此地步,正值可能略有剪辑,但量化步骤被均匀地分布。

您添加128因为右移轮朝负无穷大。在平均量化误差是-128和添加128以纠正此在精确0保持0溢出测试是必要的,因为0x7fffff的输入值,否则给出的为0x8000的结果,并且当你这些信息存储在一个16位字,它会环绕给人一种负峰值。

Ç悬挂物可戳在约右移位和分裂行为的假设孔,但我俯瞰那些为了清楚起见。

然而,正如其他人所指出的那样,你一般不应降低音频比特深度不抖动,理想的噪声整形。 TPDF抖动如下:

out = (in + (rand() & 255) - (rand() & 255)) >> 8;
if (out < -0x8000) out = -0x8000;
if (out > 0x7fff) out = 0x7fff;

再次与rand()这我要去忽视了清晰的使用大的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top