如何获得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 + 1
到N - 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信号与sin
和cos
函数相关的原因是为了解决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。