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

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

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

164174 次浏览

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

看看我的答案。

回应评论:

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

通过测量复数 FFT 输出的大小,你可以得到输入信号在一组频率下与正弦波相关性的测量值,而与输入信号相位无关。如果你只是分析一个信号的频率内容,你几乎总是取 FFT 复杂输出的量级或量级的平方。

FFT 中的第一个单元是 DC (0Hz) ,第二个单元是 Fs / N,其中 Fs是采样率,N是 FFT 的大小。下一个垃圾箱是 2 * Fs / N。为了用一般术语来表示这一点,第九箱是 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箱子具有共轭复数对称性)。最后一个有用的仓位(对于实际应用)是 N / 2 - 1,在上面的示例中对应于22006.9 Hz。在 N / 2的奈奎斯特频率代表能量,即 Fs / 2(在这个例子中 = 22050赫兹) ,但是这通常没有任何实际用途,因为抗混叠滤波器通常会衰减在 Fs / 2及以上的任何信号。

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

我使用了以下方法:

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

投入包括:

  • 进入仓库
  • samples: 以赫兹为单位的采样频率(即8000赫兹、44100赫兹等)
  • nFFT: FFT 矢量的大小