使用音频字节数据创建反相/反向声音/噪声消除

时间:2015-08-13 09:00:48

标签: java audio bit-manipulation buffer

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

我使用以下格式:

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

上面的代码读取每个2字节,将它们转换为16位短路,反转其值,然后将其插回到相同的字节位置。

然而,当它运行时,它听起来就像原始一样。

sourceLine.write(data, 0, readBytes);

2 个答案:

答案 0 :(得分:2)

因为声音是相同的,只有压力值反转。 你的耳朵测量压力波的绝对值,对于反向波也是如此。 只有当波和反向波一起播放时,它们的总和才为0,并且只有在完全同步的情况下播放。

答案 1 :(得分:1)

如果样本流是snort.conf,则它是反向的(或反相,如果您愿意)是SELECT A.*, 'Exist' FROM DEALS A WHERE A.RUN_ID = 2550 AND A.DEAL_ID IN ('4385601', '4385602',...) UNION SELECT B.*, 'Not Exist' FROM DEALS B WHERE B.RUN_ID = 2550 AND B.DEAL_ID NOT IN ('4385601', '4385602',...);

简单地否定X0.....Xn会解决问题:

-X0.....-Xn

当然,在自由空间中没有相位消除的情况下,倒置的音频将与原始声音完全相同。