我正在尝试从插件吉他获取输入,从中获取频率并检查用户是否弹奏了正确的音符。像吉他调音器之类的东西(我也需要做一个吉他调音器)。
我的第一个问题是,如何实时获取吉他输入的频率?
是否可以做类似的事情:
if (frequency == noteCFrequency)
{
//print This is a C note!!
}
我现在可以从声卡获取输入,录制和播放输入的声音了。
我正在尝试从插件吉他获取输入,从中获取频率并检查用户是否弹奏了正确的音符。像吉他调音器之类的东西(我也需要做一个吉他调音器)。
我的第一个问题是,如何实时获取吉他输入的频率?
是否可以做类似的事情:
if (frequency == noteCFrequency)
{
//print This is a C note!!
}
我现在可以从声卡获取输入,录制和播放输入的声音了。
对于 C# 中的 FFT 实现,您可以查看此. 虽然我认为您不需要完全了解 FFT 即可使用它,但您应该了解一些基本限制:
其他答案并没有真正解释如何做到这一点,他们只是有点放弃了他们的手臂。例如,从阅读这些答案中您不会知道 FFT 的输出是一组复数,并且您不知道如何解释它们。
此外,FFT 甚至不是最好的可用方法,尽管对于您的目的来说它工作得很好,而且大多数人认为它是最直观的。无论如何,这个问题已经被问死了,所以我只会向您推荐关于 SO 的其他问题。并非所有都适用于 C#,但您需要先了解(重要的)概念。您可以通过阅读这些问题的答案并点击链接来找到您的问题的答案。
您必须计算一个信号的 FFT - 快速傅里叶变换 - 并寻找一个峰值。对于 FFT 的种类、窗口类型、窗口大小......您必须阅读一些有关信号处理的文档。无论如何,一个 25 毫秒的窗口是可以的,例如,使用一个汉明窗口。网上有很多计算 FFT 的代码。祝你好运!