我正在制作一款安卓手机应用程序,我一直在尝试用TarsosDSP来检测音高。只有当它大于43 it时,它才能发挥很大的作用。但我有一个要求,使它与40赫兹的工作。当我播放声音时,它甚至没有给出低于43的结果。这是您可以在线生成所需频率的曲调的地方。这是密码。
void connectsAudioDispatchertoMicrophone() {
AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050, 1024, 0);
PitchDetectionHandler pdh = new PitchDetectionHandler() {
@Override
public void handlePitch(final PitchDetectionResult result, AudioEvent e) {
final float pitchInHz = result.getPitch();
runOnUiThread(new Runnable() {
@Override
public void run() {
if (pitchInHz > 1)
Log.d(TAG, "pitchInHz: " + pitchInHz);
}
});
}
};
AudioProcessor p = new PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.FFT_YIN,
22050,
1024,
pdh);
dispatcher.addAudioProcessor(p);
thread = new Thread(dispatcher, "Audio Dispatcher");
thread.start();
}发布于 2020-02-03 23:12:29
这听起来像是Tarsos内部使用的FFT的一个限制。FFT将检测到的声音分成几个频率“回收箱”中的一个。每个垃圾箱的中心频率是一个函数:
对于220 FFT采样率,1024采样宽FFT:
Fmin = 22050 / 1024 *2= 43.066Hz
(Fmin是第二个最低的"bin“的中心频率。显然,这是算法能够检测到的最低频率。)
降低Fmin,A.)降低采样率,或者B)增加FFT的宽度:
Fmin = 16000 / 1024 *2= 31.25Hz Fmin = 22050 / 2048 *2= 21.53Hz
对于FFT的宽度,一定要坚持2的幂,并批准采样率的有效设置。
https://stackoverflow.com/questions/60046129
复制相似问题