我正在尝试从音频流中提取音高数据。据我所见,FFT 似乎是最好的算法。
与其直接钻研数学,有人可以帮我理解这个 FFT 算法的作用吗?
请不要说“FFT 从原始信号中提取频率数据”之类的明显内容。我需要更详细的信息。
我输入什么,输出什么?
一旦我清楚地理解了接口,这将有助于我理解实现。
我认为我需要传入一个音频缓冲区,我需要告诉它每次计算要使用多少字节(比如这个缓冲区中最近的 1024 个字节)。也许我需要指定我希望它检测到的音高范围。现在它要回传什么?一组频率区间?这些是什么?
(编辑:)我找到了一个可以使用的 C++ 算法(如果我只能理解的话)
Performous从麦克风中提取音高。代码也是开源的。下面是对算法功能的描述,来自编写它的人。
- PCM 输入(带缓冲)
- FFT(一次 1024 个样本,之后从缓冲区前面删除 200 个样本)
- 重新分配方法(针对之前 200 个样本的 FFT)
- 峰值过滤(这部分可以做得更好,甚至可以省略)
- 将峰值组合成谐波组(我们称组合为音调)
- 音调的时间过滤(更新之前检测到的音调集,而不是简单地使用新检测到的音调)
- 选择最好的人声(频率限制,加权,也可以使用谐波阵列,但我不认为我们这样做)
但是有人可以帮我理解这是如何工作的吗?从 FFT 发送到重新分配方法的内容是什么?