我正在尝试对音频输入执行线性缩放,每个 channel 上的缩放比例相同。
总体效果是输入流的幅度逐渐减小,直到静音。因此,我的第一个样本将保持不变,而我的最后一个样本的幅度将为 0。我想知道你是如何实现这个的。
到目前为止,这就是我所拥有的缩放代码,并且想知道您是否仍然需要缩放示例,以便它位于 16 位二进制补码范围之间。
for (int i=0; i<data.length; ++i){ // data[i] is sample in intger form
data[i] = (int) (data[i]*(something/something));
}
如果可以解释缩放到特定因素的情况会很有帮助吗?
谢谢!
最佳答案
我假设您正在使用音频数据的短值(例如,[-32768..32767]),并且字节之间的转换在其他地方处理。
在分数“某物/某物”中,分子的范围从等于分母的值一直到零,而分母保持固定值。
例如,如果您将音量范围分为 128 级,则最大音量将为 128/128,最安静音量将为 0/128。
为了避免除法,您可以预先计算等于 1/128 的系数,然后将其乘以 [0..128](含)范围内的值。
然后你就会得到“一些* precalculatedFactor”,它可能运行得更快一点。
但是,线性体积缩放会带来一些问题。实际感知的音量不是线性跟踪的。因此,X 的音量间隔可能几乎不会在高端产生音量差异,但会很大以致于在低端造成不连续性和咔嗒声。
我认为人们经常使用指数函数来更好地将音量映射到线性输入。对于哪一个最好存在分歧。但假设您的音量旋钮从 [0..1] 开始。如果在应用该值之前对其进行立方,例如,输入 0.5 试图创建 1/2 响度,则变为 (0.5 * 0.5 * 0.5) => 0.125,这将比 0.5 更接近 1/2 响度。
因此,“某事 * 某事 * 某事 * precalculatedFactorCubed”可能效果更好。
关于java - Java 声音缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42356762/