我有一个 FFT 结果。它们存储在两个 double数组中: 一个实部数组和一个虚部数组。如何确定这些数组中每个元素的频率?
double
换句话说,我希望创建一个数组来存储 FFT 的每个实部分和虚部分的频率。
你的 k这个 FFT 结果的频率是2 * pi * k/N。
看看我的答案。
回应评论:
FFT 实际上计算的 互相关的输入信号与正弦和余弦函数(基函数)在一个等间隔的频率范围。对于一个给定的 FFT 输出,有一个相应的频率(F) ,由我发布的答案给出。输出样本的真实部分是输入信号与 cos(2*pi*F*t)的互相关,而虚拟部分是输入信号与 sin(2*pi*F*t)的互相关。输入信号与 sin和 cos函数相关的原因是考虑了输入信号与基函数之间的相位差。
cos(2*pi*F*t)
sin(2*pi*F*t)
sin
cos
通过测量复数 FFT 输出的大小,你可以得到输入信号在一组频率下与正弦波相关性的测量值,而与输入信号相位无关。如果你只是分析一个信号的频率内容,你几乎总是取 FFT 复杂输出的量级或量级的平方。
FFT 中的第一个单元是 DC (0Hz) ,第二个单元是 Fs / N,其中 Fs是采样率,N是 FFT 的大小。下一个垃圾箱是 2 * Fs / N。为了用一般术语来表示这一点,第九箱是 n * Fs / N。
Fs / N
Fs
N
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 + 1到 N - 1的箱子)不包含任何有用的附加信息(它们与第一个 N / 2 - 1箱子具有共轭复数对称性)。最后一个有用的仓位(对于实际应用)是 N / 2 - 1,在上面的示例中对应于22006.9 Hz。在 N / 2的奈奎斯特频率代表能量,即 Fs / 2(在这个例子中 = 22050赫兹) ,但是这通常没有任何实际用途,因为抗混叠滤波器通常会衰减在 Fs / 2及以上的任何信号。
N / 2 + 1
N - 1
N / 2 - 1
N / 2
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
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
nFFT