1

我正在制作一个 Android 移动应用程序,我一直在尝试使用TarsosDSP检测音高。只有当它大于 43hz 时,它才能很好地工作。但我有一个要求,让它在 40hz 下工作。当我播放声音时,它甚至不会给出低于 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();
}
4

1 回答 1

2

这听起来像是 Tarsos 内部使用的 FFT 的限制。FFT 将检测到的声音分成几个频率“箱”之一。每个 bin 的中心频率是以下函数:

  • 采样率,以及:
  • FFT 的宽度(以样本为单位)。

对于 22050Hz 采样率,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 的幂,并确保采样率的有效设置。

于 2020-02-03T23:12:29.003 回答