通过截断还原性样品比特深度
-
26-09-2019 - |
题
我到数字音频信号的比特深度减少从24到16位。
以各样品的仅16个最显著位(即截断)等效于做(在*为0xFFFF / 0XFFFFFF出=)比例计算?
解决方案
我想你平均(in * 0xFFFF) / 0xFFFFFF
,在这种情况下,是的。
其他提示
您会得到更好的通过将精心制作的噪声信号与原始信号,略低于截断门槛,截断(又名抖动)之前探测结果。
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()
这我要去忽视了清晰的使用大的问题。