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

时间:2010-12-06 09:18:37

标签: c# signal-processing fft

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

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

5 个答案:

答案 0 :(得分:320)

FFT中的第一个bin是DC(0 Hz),第二个bin是Fs / N,其中Fs是采样率,N是FFT的大小。下一个bin是2 * Fs / N。为了概括地表达这一点, nth bin是n * Fs / N

因此,如果您的采样率Fs为44.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 + 1N - 1的二进制)不包含有用的附加信息(它们具有复杂的共轭对称性第一个N / 2 - 1箱子。最后一个有用的bin(用于实际应用)位于N / 2 - 1,对应于上例中的22006.9 Hz。 N / 2处的bin表示奈奎斯特频率的能量,即Fs / 2(在此示例中为22050 Hz),但这通常不具有任何实际用途,因为抗混叠滤波器通常会衰减任何Fs / 2及以上的信号。

答案 1 :(得分:54)

看看我的回答here

回答评论:

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

通过获取复数FFT输出的幅度,您可以测量输入信号与一组频率上的正弦波相关的程度,而不管输入信号的相位如何。如果您只是分析信号的频率内容,您几乎总是会得到FFT复数输出的幅度或幅度平方。

答案 2 :(得分:16)

我使用了以下内容:

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矢量的大小

答案 3 :(得分:10)

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

我认为k处的元素与N-k处的元素具有相同的频率,因为对于实数据,FFT [N-k] = 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

答案 4 :(得分:5)

你的k th FFT结果的频率是2 * pi * k / N.