2010-11-01 109 views
4

我正在尝试从音频流中提取音高数据。从我所看到的看来,FFT看起来就是最好的算法。FFT算法:什么是IN/OUT? (重新:实时音高检测)

而不是直接挖掘数学,有人能帮我理解这个FFT算法的作用吗?

请不要说像'FFT从原始信号中提取频率数据。我需要更高层次的细节。

我通过什么,我该退出什么?

一旦我清楚地理解接口,这将帮助我理解实现。我需要传递一个音频缓冲区,我需要告诉它每个计算使用多少个字节(比如说这个缓冲区中最近的1024个字节)。也许我需要指定我希望它检测的音高范围。现在它会传回什么?一组频率箱?这些是什么?

(编辑:)我已经找到了C++算法来使用(如果我只能理解它)

Performous提取从麦克风球场。代码也是开源的。下面是对该算法做什么的描述,来自编码它的人。

  • PCM输入(带缓冲)
  • FFT(1024个样本的时间,从缓冲器的前后来除去200个样本)
  • 重新分配方法(上日FFT,这是200个样本更早)
  • 过滤峰(这部分可以做的更好,甚至离开了)
  • 峰组合成组的谐波(我们称之为组合音)
  • 音的时域滤波(更新一组音调检测ED较早而不是简单地使用新检测到的)
  • 挑选最佳演唱音(频率范围,加权,可以使用谐波阵列还,但我不认为我们这样做)的

但可能有人帮助我明白这是如何工作的?什么是从FFT发送到重新分配方法?

+0

许多重复,例如[使用FFT的实时音高检测](http://stackoverflow.com/questions/1466968/real-time-pitch-detection-using-fft) – 2010-11-01 10:23:43

+0

还要注意,'pitch'与'frequency'不同 - 确保你了解差异,因为如果你想测量其中一种,你的解决方案将会非常不同。 – 2010-11-01 10:29:13

回答

2

这里有一个选择要素:最直接的t实现方法是在(2^n个样本中)进行复数计算,并将2^n个复数计算出来,所以也许你应该从那开始。

在DCT(离散余弦变换)的特殊情况下,通常进入的是2^n个样本(通常是浮点数),并且输出2^n个值,通常也是浮点数。 DCT是一种FFT,但只采用实际值,并根据余弦分析函数。

它是聪明的(但通常跳过)定义一个结构来处理复杂的值。传统上FFT是在原地完成的,但如果你不这样做,它可以正常工作。

实例化一个包含FFT工作缓冲区的类(如果您不想在原地进行FFT)并将其重复用于多个FFT会很有用。

+0

但是这些来自DFT/FFT的值是什么? – 2010-11-01 10:52:57

3

FFT只是过程中的一个构建模块,它可能不是音高检测的最佳方法。阅读音高检测并决定首先使用哪种算法(这将取决于您正在尝试测量音调 - 单一乐器,其他类型的声音等等)的音调。在进入低音之前进行正确的设置水平的细节,例如FFT(一些,但不是所有的基音检测算法使用内部的FFT)

上有SO已经很多类似的问题,如Real-time pitch detection using FFTPitch detection using FFT for trumpet,并有良好的overview material on Wikipedia等 - 阅读,然后决定是否仍然想要推出自己的基于FFT的解决方案,或者使用适合您特定应用的现有库。

1

进去PCM的N个样本(纯真实复数)。 Out包含N个频域的bin(每个bin对应1/N采样率片)。每个垃圾箱都是一个复数。这些值通常应以极坐标格式(绝对值和参数)处理,而不是实部和虚部。当参数告诉相位(正弦波在哪个位置传播)时,绝对值将告诉音箱中心频率附近的声音量。

大多数编码器只使用幅度(绝对值)并丢弃相位角(参数)。