我轉換與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