FFT算法:输入/输出是什么?(关于实时音高检测)

4

我正在尝试从音频流中提取音高数据。从我所看到的,FFT算法似乎是最好的选择。

不要直接深入数学,有人能帮我理解一下这个FFT算法吗?

请不要说像“FFT从原始信号中提取频率数据”这样显而易见的话。我需要更详细的内容。

我需要传入什么,我会得到什么?

一旦我清楚地了解了接口,这将帮助我理解实现。

我需要传入一个音频缓冲区,告诉它每次计算使用多少字节(例如,该缓冲区最近的1024个字节)。也许我需要指定我想要检测的音高范围。现在它会返回什么?一组频率箱?这些是什么?

(编辑:)我找到了一个可以使用的C++算法(如果我只能理解它)

Performous从麦克风中提取音高。此外,代码是开源的。以下是编写代码的人对算法的描述。

  • PCM输入(带缓冲)
  • FFT(每次1024个样本,之后从缓冲区的前面删除200个样本)
  • 重新分配方法(针对之前200个样本的FFT)
  • 峰值过滤(这部分可以做得更好,甚至可以省略)
  • 将峰值组合成一组谐波(我们称之为组合音)
  • 时间滤波器(更新之前检测到的音调集合,而不仅仅使用新检测到的音调)
  • 选择最佳声乐音调(频率限制,加权,也可以使用谐波数组,但我认为我们没有这样做)

但是有人能帮我理解这是如何工作的吗?从FFT到重新分配方法发送了什么?


大量重复,例如使用FFT进行实时音高检测 - Paul R
请注意,音高(pitch)频率(frequency)并不是同一回事-确保您理解差异,因为如果您想测量其中之一,您的解决方案将会非常不同。 - Paul R
3个回答

3
FFT只是整个过程中的一个构建模块,对于音高检测来说,可能不是最佳方法。请先阅读有关音高检测的资料,并决定首选算法(这将取决于您要测量的具体内容-语音、单个乐器、其他类型的声音等)。在深入到FFT等低级细节之前,请确保正确选择算法(某些但不是所有音高检测算法在内部使用FFT)。在SO上已经有很多类似的问题,例如使用FFT进行实时音高检测使用FFT进行小号音高检测,还有很好的维基百科概述材料等-阅读这些内容,然后决定是否仍要自己编写基于FFT的解决方案,或者使用适用于您特定应用程序的现有库。

2

这里有一个选择的因素。最简单的实现方法是对(2^n个)复数进行操作,输入2^n个复数,输出2^n个复数,您可以从此开始。

在离散余弦变换(DCT)的特殊情况下,通常输入2^n个样本(通常为浮点数),输出2^n个值,也通常是浮点数。DCT是一种FFT,但它仅考虑实数值,并通过余弦函数分析函数。

定义一个结构以处理复数值是明智的(但通常被省略)。传统上,FFT是就地完成的,但如果不进行就地处理,也能正常工作。

实例化一个包含FFT工作缓冲区的类可能是有用的(如果您不想进行就地FFT),并且可以将其重复用于多个FFT。


但是,DFT/FFT输出的这些值是什么? - P i

1
输入 N 个 PCM 样本(完全的实数复数),输出 N 个频域条带(每个频域条带对应于样本率的1/N切片)。每个条带都是一个复数。这些值通常应以极坐标格式(绝对值和参数)处理,而不是实部和虚部。绝对值告诉我们中心频率附近的声音强度,而参数则告诉我们相位(正弦波在哪个位置行进)。
大多数情况下,编写者只使用幅度(绝对值)并丢弃相位角(参数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接