我转换与16位单声道PCM波形文件和48 kHz至单质量问题签署了16位,并适用于电话8kHz的线性PCM文件AU使用javax.sound.sampled中:与音频转换
public void convertSO(final String in, final String out) throws Exception {
try (final AudioInputStream ais = AudioSystem.getAudioInputStream(new File(in))) {
final AudioFormat af = new AudioFormat(Encoding.PCM_SIGNED, 8000f, 16, 1, 2, 8000, false);
try (final AudioInputStream cais = AudioSystem.getAudioInputStream(af, ais)) {
AudioSystem.write(cais, AudioFileFormat.Type.AU, new File(out));
}
}
}
它的工作原理一样,这听起来不错,但如果我与SOX做了类似的转换比较质量怎么样
sox in.wav -b 16 -r 8000 -c 1 -e signed-integer out.au
与javax.sound.sampled中完成转换的高频率范围的声音沙哑而与SOX听起来很顺利。
两个输出文件具有相同的大小,并且它们的属性与mediainfo
比较没有差别。
我主要想知道差异可以从哪里来。 SoX是否将采样率从48 kHz转换为8 kHz?或者SoX是否应用了一些奇特的过滤器或心理声学模型来改善音质?
更好的程序可能会做的抽样前过滤掉高频噪声。如果没有完成,它将围绕新的采样频率(它本身处于可听范围!)。你可以尝试用大胆的东西来观察光谱能量。你也可以记录从1-24 KHz的斜坡,看看每个程序用它做什么 - 理想情况下,你应该得到一个斜坡到3.5 KHz,然后褪去任何东西。相反,如果您获得了一系列反射斜坡,则转换过程不会进行别名过滤。 – 2014-11-03 02:12:27
在SoX中执行缩减采样的源代码在这里:http://sourceforge.net/p/sox/code/ci/master/tree/src/downsample.c它没有很好的记录,但它看起来像他们使用'p-> carry'中样本之间的某种结转。这可能是原因。 – Ghostkeeper 2014-11-03 02:27:26