从吉他输入实时获取频率

时间:2013-01-27 10:51:47

标签: c# signal-processing naudio

我正在尝试从插件吉他获取输入,从中获取频率并检查用户是否正在播放正确的音符。像吉他调音器(我也需要做吉他调音器)。

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

是否可以执行以下操作:

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

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

3 个答案:

答案 0 :(得分:1)

要在C#中实现FFT,您可以查看at this。 我认为您不需要完全理解使用它的FFT,您应该了解一些基本限制:

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

答案 1 :(得分:1)

其他答案并没有真正解释如何做到这一点,他们只是放弃了他们的武器。例如,你不知道从读取那些FFT的输出是一组复数的答案,你就不知道如何解释它们。

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

frequency / pitch detection for dummies

Get the frequency of an audio file in every 1/4 seconds in android

How to detect sound frequency / pitch on an iPhone?

How to calculate sound frequency in android?

how to retrieve the different original frequency in each FFT caculating and without any frequency leakage in java

答案 2 :(得分:0)

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