我正在尝试从音频流中提取音高数据。从我所看到的,FFT算法似乎是最好的选择。
不要直接深入数学,有人能帮我理解一下这个FFT算法吗?
请不要说像“FFT从原始信号中提取频率数据”这样显而易见的话。我需要更详细的内容。
我需要传入什么,我会得到什么?
一旦我清楚地了解了接口,这将帮助我理解实现。
我需要传入一个音频缓冲区,告诉它每次计算使用多少字节(例如,该缓冲区最近的1024个字节)。也许我需要指定我想要检测的音高范围。现在它会返回什么?一组频率箱?这些是什么?
(编辑:)我找到了一个可以使用的C++算法(如果我只能理解它)
Performous从麦克风中提取音高。此外,代码是开源的。以下是编写代码的人对算法的描述。
- PCM输入(带缓冲)
- FFT(每次1024个样本,之后从缓冲区的前面删除200个样本)
- 重新分配方法(针对之前200个样本的FFT)
- 峰值过滤(这部分可以做得更好,甚至可以省略)
- 将峰值组合成一组谐波(我们称之为组合音)
- 时间滤波器(更新之前检测到的音调集合,而不仅仅使用新检测到的音调)
- 选择最佳声乐音调(频率限制,加权,也可以使用谐波数组,但我认为我们没有这样做)
但是有人能帮我理解这是如何工作的吗?从FFT到重新分配方法发送了什么?
音高(pitch)
和频率(frequency)
并不是同一回事-确保您理解差异,因为如果您想测量其中之一,您的解决方案将会非常不同。 - Paul R