这个FFT函数的输出有什么意义呢?

What is the significance of the output of this FFT function?

我有以下周期为 ~2000 的周期性数据:

我正在尝试发现数据的周期和第一个峰值的偏移量。我有以下 FFT 函数来执行傅立叶变换:

typedef double _Complex cplx;

void _fft(cplx buf[], cplx out[], int n, int step){
    if (step < n) {
        _fft(out, buf, n, step*2);
        _fft(out+step, buf+step, n, step*2);

        for(int i=0; i<n; i+=step*2) {
            cplx t = cexp(-I * M_PI * i / n) * out[i + step];
            buf[i / 2]     = (out[i] + t);
            buf[(i + n)/2] = (out[i] - t);
        }
    }
}

void fft(cplx* buf, int n){
    cplx* out = (cplx*)malloc(sizeof(cplx) * n);
    memcpy(out, buf, sizeof(cplx)*n);
    _fft(buf, out, n, 1);

    for(int i=0; i<n; i++){ buf[i] /= n; }

    free(out);
}

改编自此处:Fast Fourier Transformation (C)(link 包含带有主函数和示例数据的完整 运行 示例)

我了解傅里叶变换将时间序列数据转换为频率数据。每个频率都有一个幅度和一个相位。但是,我很难理解此函数给出的输出。绘制输出图给了我这个:

我已经尝试绘制实部、虚部和两个分量的大小的图形。每次尝试都会给出一个非常相似的图形。

我假设应该在 ~2000 处出现峰值是错误的吗? 我是不是误解了这个函数的输出?

Am I wrong to assume there should be a spike at ~2000?

是的,因为 2000 年是您感兴趣的周期,而不是频率。看起来你是 运行 一个 32,768 点的 FFT,所以你应该期望在 bin #16 中找到一个峰值(每 32k 16 个周期 = 大约 2048 个样本的周期),而不是 bin #2000。

如果您想要直接根据样本数量而不是频率报告的内容,您可能需要自相关而不是 FFT。您的信号将在 2000、4000 等滞后处出现自相关峰值。