我正在尝试从音频流中提取音高数据。据我所知,FFT 似乎是最适合使用的算法。
与其直接深入数学,有人可以帮助我理解这个 FFT 算法的作用吗?
请不要说“FFT 从原始信号中提取频率数据”这样明显的话。我需要更详细的信息。
我传入什么,输出什么?
一旦我清楚地理解了接口(interface),这将帮助我理解实现。
我认为我需要传入一个音频缓冲区,我需要告诉它每次计算要使用多少字节(比如说来自这个缓冲区的最近的 1024 个字节)。也许我需要指定我希望它检测的音高范围。现在它要传回去什么?一组频率仓?这些是什么?
(编辑:)我找到了一个可以使用的 C++ 算法(如果我只能理解它的话)
Performous从麦克风中提取音高。而且代码是开源的。以下是编写算法的人对算法功能的描述。
- PCM 输入(带缓冲)
- FFT(一次 1024 个样本,之后从缓冲区前面移除 200 个样本)
- 重新分配方法(针对之前的 200 个样本的 FFT)
- 峰值过滤(这部分可以做得更好,甚至可以忽略)
- 将峰值组合成谐波集(我们称这种组合为音调)
- 音调的时间过滤(更新较早检测到的音调集,而不是简单地使用新检测到的音调)
- 选择最好的声调(频率限制、加权,也可以使用谐波阵列,但我认为我们不会)
但是有人可以帮助我理解这是如何工作的吗?从 FFT 发送到重新分配方法的是什么?
最佳答案
FFT 只是该过程中的一个组成部分,它可能不是音调检测的最佳方法。阅读音高检测并决定您首先要使用哪种算法(这将取决于您尝试测量音高的具体内容 - 语音、单一乐器、其他类型的声音等。在进入低音之前做好这项工作级细节,例如 FFT(一些但不是所有音高检测算法在内部使用 FFT)。
SO 上已经有很多类似的问题,例如Real-time pitch detection using FFT和 Pitch detection using FFT for trumpet ,还有很好的overview material on Wikipedia等等 - 阅读这些内容,然后决定您是仍想推出自己的基于 FFT 的解决方案,还是使用适合您特定应用的现有库。
关于algorithm - FFT 算法 : What goes IN/OUT?(关于:实时音调检测),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4067976/