我正在设计一个实时音频分析器,将其嵌入到FPGA芯片中。完成的系统将读取实时音频流,并输出X个最普遍的频率的频率和振幅对。
到目前为止,我已经设法实现了FFT,但是它的当前输出只是每个窗口的实部和虚部,我想知道的是,如何将其转换为频率和幅度对?
我一直在阅读FFT,我看到了如何将它们转换成幅度和相位关系,但是我需要一种不了解复杂数学知识的人可以阅读的格式!
谢谢
感谢您的快速回复!
我现在从FFT获得的输出是实和虚对的连续流。我不确定是否将它们分解成与输入数据包大小相同的数据包(64个值),然后将它们视为数组,还是单独处理。
采样率,我没有问题。当我自己配置FFT时,我知道它正在以50MHz的全局时钟运行。至于数组索引(如果输出当然是数组...),我不知道。
如果我们说输出是64个复数值的一维数组的序列:
1)如何找到数组索引[i]?
2)每个阵列会返回单个频率部分还是多个频率部分?
非常感谢您的帮助!没有它,我会迷路的。
FFT结果将为您提供一组复数值。每个阵列元素的幅度的两倍(复数分量之和的平方根的平方根)是一个振幅。如果需要dB刻度,也可以做对数幅度。数组索引将为您提供具有该振幅的频率槽的中心。您需要知道采样率和长度才能获得每个数组元素或bin的频率。
f[i] = i * sampleRate / fftLength
对于数组的前半部分(另一半只是用于真实音频输入的复共轭形式的重复信息)。
每个FFT结果仓的频率可能由于开窗或所谓的频谱泄漏而与音频信号中存在的任何实际频谱频率不同。查找频率估计方法以获取详细信息。
好,坏消息是,无法理解复数。好消息是,仅仅因为它们被称为复数,并不意味着它们就是complicated。。因此,首先,请查看Wikipedia页面,对于音频应用程序,我会说:阅读有关第3.2节的内容,可能会跳过平方根的内容:http://en.wikipedia.org/wiki/Complex_number
这是告诉您,如果您有一个复数a + bi,则可以将其想象为生活在位置(a,b)的x,y平面中。要获得幅度和相位,您要做的就是找到两个量:
大小很简单:sqrt(a ^ 2 + b ^ 2)。
该阶段同样简单:atan2(b,a)。