如何获得FFT中每个值的频率?


148

我有一个FFT结果。它们存储在两个double数组中:实部数组和虚部数组。如何确定与这些阵列中的每个元素相对应的频率?

换句话说,我想创建一个数组来存储FFT的每个实部和虚部分量的频率。


我在C#.net中进行。你能帮助我吗?
Rango

9
如果您不了解FFT实部和虚部的相关性,那么您将不会获得任何有意义的结果,因此,您应该寻找一些FFT和信号处理教程来了解如何解释结果。我认为很可能无论您将其用于什么,都想要FFT的幅度或功率谱密度。
the_mandrill 2010年

谢谢!我想获取每个帧的峰值频率(帧长度取决于窗口长度和移位长度)
Rango 2010年

Answers:


350

FFT中的第一个bin是DC(0 Hz),第二个bin是Fs / N,其中Fs是采样率,N是FFT的大小。下一个垃圾箱是2 * Fs / N。为了概括地说,第n个 bin是n * Fs / N

因此,如果您的采样率为Fs44.1 kHz,FFT大小N为1024,则FFT输出仓位于:

  0:   0 * 44100 / 1024 =     0.0 Hz
  1:   1 * 44100 / 1024 =    43.1 Hz
  2:   2 * 44100 / 1024 =    86.1 Hz
  3:   3 * 44100 / 1024 =   129.2 Hz
  4: ...
  5: ...
     ...
511: 511 * 44100 / 1024 = 22006.9 Hz

请注意,对于真实输入信号(虚部全部为零),FFT的后半部分(从N / 2 + 1至的二进制数N - 1)不包含有用的附加信息(它们与第一个N / 2 - 1二进制数具有复杂的共轭对称性)。最后一个有用的bin(用于实际应用)位于N / 2 - 1,对应于上述示例中的22006.9 Hz。处的bin N / 2代表奈奎斯特频率(即,Fs / 2在此示例中= 22050 Hz)处的能量,但这通常没有任何实际用途,因为抗混叠滤波器通常会衰减或高于的信号Fs / 2


8
注意-答案略有错误-第512个存储桶包含22050(奈奎斯特极限)的电平。0至N / 2(含0)的bin包含有用的值。
大卫·

4
感谢您的编辑和澄清...我想这是我发现缺乏实用性的地方。我:但是,主人,FFT可以解决尼奎斯特问题!您:Padawan,您真的应该过滤掉它。
大卫·

5
我希望我能给答案加星号。这个答案比原来的问题还要好!
Skylion

14
@PaulR-感谢您多年来为我提供的出色解答。在拥有StackOverflow帐户之前,我会先访问此答案,但实际上我忘了在注册后感谢您。我最近正在看FFT的东西,我想起了您的答案,现在就访问了它。到达这里后,我记得要谢谢你...所以谢谢你!每当我与某人就如何解释FFT的水平轴上的每个点进行辩论时,我都将他们指向此链接。
rayryeng

6
@rayryeng:非常感谢-我认为这是我在过去5年中在此处回答问题所获得的最好的感谢!
Paul R

55

这里看看我的答案。

回答评论:

FFT实际上计算输入信号与在等间隔频率范围内的正弦和余弦函数(基本函数)的互相关。对于给定的FFT输出,有一个对应的频率(F),由我发布的答案给出。输出样本的实部是输入信号与的互相关,cos(2*pi*F*t)而虚部是输入信号与的互相关sin(2*pi*F*t)。输入信号sincos功能相关的原因是要考虑输入信号与基本功能之间的相位差。

通过获取复数FFT输出的幅度,您可以测量输入信号在一组频率下与正弦波之间的相关程度,而与输入信号的相位无关。如果仅分析信号的频率内容,则几乎总是采用FFT复数输出的幅度或幅度平方。


实部和虚部是用于什么的FFT结果?请给我解释一下。谢谢
Rango 2010年

5
这个答案值得更多的爱。
璀璨之星

1
可能是每个复杂输出的大小都必须加倍吗?(如果我将解释限于下半部分)
沃尔夫

18

我使用了以下内容:

public static double Index2Freq(int i, double samples, int nFFT) {
  return (double) i * (samples / nFFT / 2.);
}

public static int Freq2Index(double freq, double samples, int nFFT) {
  return (int) (freq / (samples / nFFT / 2.0));
}

输入是:

  • i:Bin访问
  • samples:以赫兹为单位的采样率(即8000 Hz,44100Hz等)
  • nFFT:FFT向量的大小

7
人们无法确切知道您用samples或代表什么nFFT。因此,请使其更具解释性。
2012年

14
公认的答案说应该是i * samples / nFFT。为什么2那里有多余的东西?我想念什么吗?
yati传奇(2014年

13

FFT输出系数(对于大小为N的复数输入)从0到N-1,分为[LOW,MID,HI,HI,MID,LOW]频率。

我认为k处的元素与Nk处的元素具有相同的频率,因为对于实际数据,FFT [Nk] = FFT [k]的复共轭。

从低频到高频的扫描顺序为

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]

从索引i = 0到[N / 2]共有[N / 2] +1个频率组,每个频率组具有 frequency = i * SamplingFrequency / N

因此,bin FFT [k]处的频率为:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.