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字节都算作一个值

我正在尝试检查是否可以使用Java创建反噪声或声音反转。()

我使用了以下格式:

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));