Java 使用音频字节数据创建反相位/反向声音/噪声消除
我正在尝试检查是否可以使用Java创建反噪声或声音反转。() 我使用了以下格式:Java 使用音频字节数据创建反相位/反向声音/噪声消除,java,audio,bit-manipulation,buffer,Java,Audio,Bit Manipulation,Buffer,我正在尝试检查是否可以使用Java创建反噪声或声音反转。() 我使用了以下格式: AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 16000, 16, 2, 4, 16000, false); 一旦捕获了一条记录,我计划使用java的SourceDataLine类将流写出来。玩起来很正常。然而,由于目标是“反转”声音,我必须将方向更改为其相反的值(正如我所读到的,这是通过将值的值乘以-1来实现的) 由于我们使用16位格式,流中的每个2字节都算作一个值
AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 16000, 16, 2, 4, 16000, false);
一旦捕获了一条记录,我计划使用java的SourceDataLine类将流写出来。玩起来很正常。然而,由于目标是“反转”声音,我必须将方向更改为其相反的值(正如我所读到的,这是通过将值的值乘以-1来实现的)
由于我们使用16位格式,流中的每个2字节都算作一个值
for(int i = 0; i < readBytes; i+=2)
{
inverse = (short)(data[i+1] << 8 | data[i] & 0xff);
System.out.println(inverse/100);
data[i] = (byte) (inverse & 0xff);
data[i+1] = (byte) ((inverse >> 8) & 0xff);
}
因为声音是一样的,只是压力值颠倒了。 您的耳朵测量压力波的绝对值,这与反向波相同。
只有当波和反向波一起播放时,它们的和才是0,并且只有在播放完全同步的情况下。如果采样流是,
X0…..Xn
,则它的逆(或反相位,如果您愿意)是-X0….-Xn
简单地否定逆
即可:
inverse = -((short)(data[i+1] << 8 | data[i] & 0xff));
inverse=-((short)(data[i+1]hmm)如果是这样的话,那是因为它在java中转换的时间很慢。音频与音源之间有半秒的延迟。这在java技术中是否可能产生,或者java对于处理这样的事情来说太慢了。
inverse = -((short)(data[i+1] << 8 | data[i] & 0xff));