【发布时间】:2015-07-12 06:48:02
【问题描述】:
我正在尝试使用 TarsosDSP 库从 .wav 文件中检测音高,但频率的结果总是小于一半。
这是我的代码。
public class Main {
public static void main(String[] args){
try{
float sampleRate = 44100;
int audioBufferSize = 2048;
int bufferOverlap = 0;
//Create an AudioInputStream from my .wav file
URL soundURL = Main.class.getResource("/DetectPicthFromWav/329.wav");
AudioInputStream stream = AudioSystem.getAudioInputStream(soundURL);
//Convert into TarsosDSP API
JVMAudioInputStream audioStream = new JVMAudioInputStream(stream);
AudioDispatcher dispatcher = new AudioDispatcher(audioStream, audioBufferSize, bufferOverlap);
MyPitchDetector myPitchDetector = new MyPitchDetector();
dispatcher.addAudioProcessor(new PitchProcessor(PitchEstimationAlgorithm.YIN, sampleRate, audioBufferSize, myPitchDetector));
dispatcher.run();
}
catch(FileNotFoundException fne){fne.printStackTrace();}
catch(UnsupportedAudioFileException uafe){uafe.printStackTrace();}
catch(IOException ie){ie.printStackTrace();}
}
}
class MyPitchDetector implements PitchDetectionHandler{
//Here the result of pitch is always less than half.
@Override
public void handlePitch(PitchDetectionResult pitchDetectionResult,
AudioEvent audioEvent) {
if(pitchDetectionResult.getPitch() != -1){
double timeStamp = audioEvent.getTimeStamp();
float pitch = pitchDetectionResult.getPitch();
float probability = pitchDetectionResult.getProbability();
double rms = audioEvent.getRMS() * 100;
String message = String.format("Pitch detected at %.2fs: %.2fHz ( %.2f probability, RMS: %.5f )\n", timeStamp,pitch,probability,rms);
System.out.println(message);
}
}
}
329.wav 文件由http://onlinetonegenerator.com/ 网站生成,频率为 329Hz。 我不知道为什么结果音高总是 164.5Hz。我的代码有问题吗?
【问题讨论】:
-
这是一个 octave 错误,这个 YIN Pitch detection 的实现导致了这个问题,我没有时间更深入地看到 YIN 代码,但是原始论文中的一些步骤被忘记了,我做了一个音调跟踪 Tarsos 的 AMDF 代码,您可以使用
PitchEstimationAlgorithm.AMDF对其进行测试
标签: audio pitch-detection tarsosdsp