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

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

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

FFT中的第一个bin是DC(0 Hz),第二个bin是Fs / N ,其中Fs是采样率, N是FFT的大小。 下一个bin是2 * Fs / N 为了expression这一般性的话,第n个 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 

注意,对于实部input信号(虚部全零),FFT的后半部分(从N / 2 + 1N - 1箱)不包含有用的附加信息(它们与第一个N / 2 - 1箱)。 最后一个有用的bin(实际应用)在N / 2 - 1 ,对应于上面例子中的22006.9 Hz。 在N / 2处的bin代表奈奎斯特频率的能量,即Fs / 2 (在这个例子中= 22050Hz),但这一般没有任何实际用途,因为抗混叠滤波器通常会衰减处于和高于Fs / 2

看看我的答案在这里 。

回答评论:

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

通过获取复杂FFT输出的大小,您可以测量input信号与一组频率的正弦曲线的相关程度,而不pipeinput信号的相位如何。 如果您只是分析信号的频率内容,则几乎总是取FFT的复数输出的幅度或幅度平方。

我已经使用了以下内容:

 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)); } 

input是:

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

FFT输出系数(对于N的复数input)从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 (Nk) * SamplingFrequency / N 

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