我有一个FFT结果。它们存储在两个double
数组中:实部数组和虚部数组。如何确定与这些阵列中的每个元素相对应的频率?
换句话说,我想创建一个数组来存储FFT的每个实部和虚部分量的频率。
我有一个FFT结果。它们存储在两个double
数组中:实部数组和虚部数组。如何确定与这些阵列中的每个元素相对应的频率?
换句话说,我想创建一个数组来存储FFT的每个实部和虚部分量的频率。
Answers:
FFT中的第一个bin是DC(0 Hz),第二个bin是Fs / N
,其中Fs
是采样率,N
是FFT的大小。下一个垃圾箱是2 * Fs / N
。为了概括地说,第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
请注意,对于真实输入信号(虚部全部为零),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
。
在这里看看我的答案。
回答评论:
FFT实际上计算输入信号与在等间隔频率范围内的正弦和余弦函数(基本函数)的互相关。对于给定的FFT输出,有一个对应的频率(F),由我发布的答案给出。输出样本的实部是输入信号与的互相关,cos(2*pi*F*t)
而虚部是输入信号与的互相关sin(2*pi*F*t)
。输入信号sin
与cos
功能相关的原因是要考虑输入信号与基本功能之间的相位差。
通过获取复数FFT输出的幅度,您可以测量输入信号在一组频率下与正弦波之间的相关程度,而与输入信号的相位无关。如果仅分析信号的频率内容,则几乎总是采用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));
}
输入是:
i
:Bin访问samples
:以赫兹为单位的采样率(即8000 Hz,44100Hz等)nFFT
:FFT向量的大小samples
或代表什么nFFT
。因此,请使其更具解释性。
i * samples / nFFT
。为什么2
那里有多余的东西?我想念什么吗?
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