2017-02-21 103 views
0

我正在尝试执行音频输入的线性缩放,每个通道上的缩放比例相同。缩放声音Java

总体效果是,输入流的幅度逐渐减小直到其静音。因此,我的第一个样本将保持不变,而我的最后一个样本的幅度将为0。我想知道你是如何实现这一点的。

到目前为止,这是我的缩放代码,并想知道是否还需要这样它位于16位二进制补码范围之间缩放样本。

for (int i=0; i<data.length; ++i){ // data[i] is sample in intger form 
     data[i] = (int) (data[i]*(something/something)); 
} 

如果可以解释缩放到某个特定因素,这会有帮助吗?

谢谢!

+1

你真正的问题是什么?如果你正确地进行了缩放,而你只是在减小幅度,它将自动处于16位的范围内。然而,你的代码是不正确的 - 为什么你需要将样本与最大值相乘 - 这使得它的32位范围和更大声?如果在循环的第一次迭代中除以零,会发生什么?你甚至运行过代码吗? –

+0

@erwin bolwidt我的问题是你如何线性缩放到0.我只是将每个样本除以0? – Hawwa

回答

1

我假设您正在使用短价值观合作,为您的音频数据(例如,[-32768..32767])和转换和从字节别处处理。

在你的分数,“东西/某事”,分子会而分母仍然是一个固定值的范围从零等于分母下降的值。

实施例,如果要破坏体积范围为128个的步骤中,最响亮的体积将是128/128,最安静的体积将是0/128。

为了避免除法,则可以预先计算等于1/128的因子,和包容在范围[0..128]内的值相乘。

然后,你会有“东西* precalculatedFactor”这可能会运行一点点快。

但是,存在线性体积缩放问题。实际感知量不会线性跟踪。因此,X的音量区间可能几乎不会在高端产生音量差异,但会很大以至于导致不连续并在低端点击。

我认为人们经常使用指数函数来更好地将音量映射到线性输入。有哪些是最好的分歧。但是,假设您的音量拨号从[0..1]开始。例如,如果您在应用该值之前对该值进行了三次幂化,例如,为了创建1/2的响度而输入0.5(0.5 * 0.5 * 0.5)=> 0.125,这将比0.5更接近1/2的响度。

因此, “什么事* * *的东西precalculatedFactorCubed” 可能会更好地工作。

+0

如何使用两个通道进行缩放? – Hawwa

+0

渠道左右交错。您可以将相同的因子和计算应用于这两个值中的每一个。 –