我有一个FFT结果。这些结果储存在两个双精度数组中:实数部分数组和虚数部分数组。如何确定对应于这些数组中每个元素的频率?
换句话说,我想创建一个数组,用于存储FFT每个实数和虚数分量的频率。
我有一个FFT结果。这些结果储存在两个双精度数组中:实数部分数组和虚数部分数组。如何确定对应于这些数组中每个元素的频率?
换句话说,我想创建一个数组,用于存储FFT每个实数和虚数分量的频率。
FFT中的第一个bin是直流分量(0 Hz),第二个bin是Fs / N
,其中Fs
是采样率,N
是FFT的大小。下一个bin是2 * Fs / N
。通常表达式为,第n个bin为n * Fs / N
。
因此,如果您的采样率Fs
为44.1 kHz,FFT大小N
为1024,则FFT输出bin的位置为:
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
个频率点具有共轭对称性)。最后一个有用的频率点(对于实际应用)在于 N / 2 - 1
,它对应于上面示例中的 22006.9 Hz。位于频率点 N / 2
的频率代表奈奎斯特频率处的能量,即 Fs / 2
(在这个示例中为 22050 Hz),但是这通常没有任何实际用途,因为抗混叠滤波器通常会衰减任何在 Fs / 2
及以上频率处的信号。sqrt(re*re+im*im)
将是给定 bin 频率处信号的 幅度。如上所述,bin 的频率由其索引确定。如果您找到具有最大 幅度 的 bin,则可以从上面的索引确定此峰值的 频率。 - Paul R我已经使用了以下代码:
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
: 要访问的二进制数据samples
: 采样率,单位为赫兹(例如8000赫兹,44100赫兹等)nFFT
: FFT向量的大小i * samples / nFFT
。为什么要多加一个 2
呢?我有什么遗漏吗? - yati sagade对于大小为N的复数输入,FFT输出系数从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
因此,FFT[k]中的频率为:
if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N
你的第k个FFT结果的频率为2*pi*k/N。