math - 将实部和虚部 FFT 输出转换为频率和幅度

标签 math fft frequency-analysis

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

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

我一直在阅读有关 FFT 的一些资料,我看到了如何将它们转化为幅度和相位关系,但我需要一种格式,即使没有复杂数学知识的人也可以阅读!

谢谢


感谢您的快速回复!

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

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

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

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

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

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

最佳答案

好吧,坏消息是,没有办法绕过需要理解复数。好消息是,仅仅因为它们被称为复数并不意味着它们,你知道的,复杂。所以首先,查看维基百科页面,对于音频应用程序,我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)。

关于math - 将实部和虚部 FFT 输出转换为频率和幅度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9453714/

相关文章:

javascript - 支票号码彼此在范围内

algorithm - 使用 PCM 样本作为 DFT 的输入

c++ - FFT和IFFT的长度

python - 解释从mp3文件对象中读取的unicode数据

java - 如何在java中将超过9的字符放在上标中?

c - 简单的 C 程序无法正确计算

C#数学类问题

python - 无法弄清楚如何计算 .wav 文件的光谱属性

c# - C# 中快速傅里叶变换 (FFT) 的实现

matlab - 获取麦克风的频率响应