2

我正在尝试从插件吉他获取输入,从中获取频率并检查用户是否弹奏了正确的音符。像吉他调音器之类的东西(我也需要做一个吉他调音器)。

我的第一个问题是,如何实时获取吉他输入的频率?

是否可以做类似的事情:

if (frequency == noteCFrequency)
{
//print This is a C note!!
}

我现在可以从声卡获取输入,录制和播放输入的声音了。

4

3 回答 3

1

对于 C# 中的 FFT 实现,您可以查看. 虽然我认为您不需要完全了解 FFT 即可使用它,但您应该了解一些基本限制:

  1. 您总是需要一个示例窗口。您可能有一个滑动窗口,但这里快速的本质是获取大量信号并接受一些错误。
  2. 你有频率的“桶”而不是确切的频率。结果类似于“在 420Hz - 440Hz 范围内,您有 30% 的信号”。(桶的“宽度”应该是可调的)
  3. 窗口大小必须包含多个 2 的幂的样本。
  4. 窗口大小必须至少是您要检测的最长波长的两个波长。
  5. 最高频率由采样率给出。(你不必担心这么多)
  6. 你希望你的频率分离得越精确,你的窗口就越长。
于 2013-01-27T14:01:46.763 回答
1

其他答案并没有真正解释如何做到这一点,他们只是有点放弃了他们的手臂。例如,从阅读这些答案中您不会知道 FFT 的输出是一组复数,并且您不知道如何解释它们。

此外,FFT 甚至不是最好的可用方法,尽管对于您的目的来说它工作得很好,而且大多数人认为它是最直观的。无论如何,这个问题已经被问死了,所以我只会向您推荐关于 SO 的其他问题。并非所有都适用于 C#,但您需要先了解(重要的)概念。您可以通过阅读这些问题的答案并点击链接来找到您的问题的答案。

假人的频率/音高检测

在android中每1/4秒获取一个音频文件的频率

如何检测 iPhone 上的声音频率/音高?

如何在android中计算声音频率?

如何在每个FFT计算中检索不同的原始频率并且在java中没有任何频率泄漏

于 2013-01-27T15:52:49.500 回答
0

您必须计算一个信号的 FFT - 快速傅里叶变换 - 并寻找一个峰值。对于 FFT 的种类、窗口类型、窗口大小......您必须阅读一些有关信号处理的文档。无论如何,一个 25 毫秒的窗口是可以的,例如,使用一个汉明窗口。网上有很多计算 FFT 的代码。祝你好运!

于 2013-01-27T11:06:18.747 回答