我正在尝试检查是否可以使用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);
答案 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
当然,在自由空间中没有相位消除的情况下,倒置的音频将与原始声音完全相同。