将实数和虚数FFT输出转换为频率和幅度

时间:2012-02-26 14:03:27

标签: math fft frequency-analysis

我正在设计一个嵌入FPGA芯片的实时音频分析仪。完成的系统将读取实时音频流并输出X最常用频率的频率和幅度对。

到目前为止,我已经设法实现了FFT,但它的当前输出只是每个窗口的实部和虚部,而我想知道的是,如何将其转换为频率和幅度对? / p>

我一直在读FFT,我看到它们如何变成幅度和相位关系但是我需要一种没有复杂数学知识的人可以阅读的格式!

由于


感谢您的快速回复!

我现在得到的FFT输出是实数和虚数对的连续流。我不确定是否要将它们分解为与输入数据包相同大小的数据包(64个值),并将它们视为数组,或者单独处理它们。

采样率,我没有问题。当我自己配置​​FFT时,我知道它正在运行50MHz的全局时钟。至于数组索引(如果输出是一个数组当然......),我不知道。

如果我们说输出是一系列64个复数值的一维数组:

1)如何找到数组索引[i]?

2)每个阵列会返回一个频率部分,还是其中的一些?

非常感谢你的帮助!没有它,我会迷失方向。

2 个答案:

答案 0 :(得分:4)

好吧,坏消息是,无法理解复杂的数字。好消息是,仅仅因为它们被称为复数并不意味着它们是,你知道,复杂。首先,查看维基百科页面,并查看音频应用程序。 d说,读到第3.2节,可能会跳过平方根部分:http://en.wikipedia.org/wiki/Complex_number

这告诉你的是,如果你有一个复数, a + bi ,你可以把它想象成生活在位置(a,b)的x,y平面上。要获得幅度和阶段,您所要做的就是找到两个数量:

  • 距离平面原点的距离,即幅度
  • 与x轴的角度,即阶段

幅度很简单:它只是sqrt(a ^ 2 + b ^ 2)。 这个阶段看起来很复杂,但事实并非如此。它是:

  • arctan(b / a)在象限I和IV
  • arctan(b / a)+ pi in quadrant II
  • arctan(b / a) - 象限III中的pi
  • 正y轴上的pi / 2
  • 负y轴
  • -pi / 2
  • 原点未定义

唯一困难的是簿记。所有这些特殊情况正在做的是使角度“扫掠”并根据惯例环绕,或者避免arctan函数的参数中的除零问题。令我感到惊讶的是,你无法找到一个库函数来执行此操作,但是如果你这样做,那就是它将要做的事情。

答案 1 :(得分:3)

FFT结果将为您提供一系列复杂值。每个阵列元素的幅度的两倍(复数分量的平方和的平方根)是幅度。或者,如果您想要dB比例,请执行对数幅度。数组索引将为您提供具有该幅度的频率仓的中心。您需要知道采样率和长度,以获得每个数组元素或bin的频率。

f[i] = i * sampleRate / fftLength

表示阵列的前半部分(另一半只是用于实际音频输入的复共轭形式的重复信息)。

由于窗口化或所谓的频谱泄漏,每个FFT结果仓的频率可能与音频信号中存在的任何实际频谱频率不同。查找频率估算方法以获取详细信息。