java - Java 声音缩放

标签 java audio javasound

我正在尝试对音频输入执行线性缩放,每个 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/

相关文章:

java - 为什么会收到此LineUnavailableException?

Java:有时从 TargetDataLine 读取声音和写入 ByteArrayOutPutStream 的时间不同

java - 在Android设备上实现RTP流媒体播放器

java - 如何从父类和子类的相同方法返回泛型类型

node.js - 如何降低nodejs服务器端音频文件的音调?

java - 用java在树莓派上播放音频

绘制函数中的 Java 音频

java - Eclipse 中 Mule 的代码覆盖工具

java - Java中如何实现 "Duotone"效果

php - 可以使用PHP保护音频文件吗?