【问题标题】:Converting Real and Imaginary FFT output to Frequency and Amplitude将实部和虚部 FFT 输出转换为频率和幅度
【发布时间】:2012-03-16 06:12:29
【问题描述】:

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

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

我一直在阅读有关 FFT 的内容,我了解如何将它们转换为幅度和相位关系,但我需要一种格式,让不了解复杂数学的人也能阅读!

谢谢


感谢您的快速回复!

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

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

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

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

2) 每个数组会返回单个频率部分,还是返回多个?

非常感谢您的帮助!没有它我会迷路的。

【问题讨论】:

    标签: math fft frequency-analysis


    【解决方案1】:

    好吧,坏消息是,没有办法绕过需要理解复数。好消息是,仅仅因为它们被称为复数并不意味着它们,你知道的,复杂的。所以首先,查看维基百科页面,对于音频应用程序,我d 说,请仔细阅读第 3.2 节,可能会跳过关于平方根的部分:http://en.wikipedia.org/wiki/Complex_number

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

    • 到平面原点的距离,即幅度,和
    • 与 x 轴的角度,即相位

    幅度很简单:sqrt(a^2 + b^2)。

    阶段同样简单:atan2(b,a)。

    【讨论】:

    • 这个答案有点晚了,但是:整个值列表可以替换为每个编程语言都支持的单个函数,甚至有一个专用的 cpu 指令:atan2,所以在这个如果复数x + iy 的相位只是atan2(y,x)。无需检查象限并通过加/减值进行补偿。
    • @Mike'Pomax'Kamermans 没错。当我回来阅读这个答案时(因为您的评论生成了收件箱标志),我在想,“我为什么不推荐 ATAN2?”可能是因为八年前我还不知道。
    • 这就是 SO 的好处:即使您 8 年前不知道它,但今天是更新答案以使其变得更好的最佳时机 =)
    • 当您使用它时,许多语言都有一个函数hypot(a,b) 来计算sqrt(a^2 + b^2),但如果ab 非常大,则可以避免溢出。
    【解决方案2】:

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

    f[i] = i * sampleRate / fftLength
    

    对于数组的前半部分(另一半只是用于真实音频输入的复共轭形式的重复信息)。

    由于加窗或所谓的频谱泄漏,每个 FFT 结果箱的频率可能与音频信号中存在的任何实际频谱频率不同。详情请查阅频率估计方法。

    【讨论】:

    • 谢谢你,我已经编辑添加了几个问题。您能提供的任何帮助将不胜感激。
    • 如果您的 FFT 实现是某种流水线同步过程,您将需要知道该过程实现的 FFT 的长度,以及固定延迟或某种结果向量的开始信号。
    • 您愿意更新此答案,以便为a[i]db[i] 提供相同的代码式公式吗?我在搜索“将 FFT 实数和虚数转换为频率和幅度”时找到了这个答案,对于程序员观众来说,这个答案感觉不够完整。我可以在a[i] = (real[i] **2 + im[i] ** 2) ** 0.5 中进行编辑,但我不知道如何将您的文本转换为提供db[i] 的代码
    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多