如何在 fft 之后设置我的阵列的频带

How to set the frequency band of my array after fft

如何从 KissFFT 为我的阵列设置频带?采样频率为 44100,我需要将其设置为我的数组 realPartFFT。我不知道它是如何工作的。我需要绘制我的频谱图以查看它是否正确。当我现在绘制它时,它在 x 轴上仍然只有 513 个数字,没有指定的频率。

    int windowCount = 1024;
    float floatArray[windowCount], realPartFFT[(windowCount / 2) + 1];

    kiss_fftr_cfg cfg = kiss_fftr_alloc(windowCount, 0, NULL, NULL);

    kiss_fft_cpx cpx[(windowCount / 2) + 1];

    kiss_fftr(cfg, floatArray, cpx);

    for (int i = 0; i < (windowCount / 2) + 1; ++) 
        realPartFFT[i] = sqrtf(powf(cpx[i].r, 2.0) + powf(cpx[i].i, 2.0));

首先:KissFFT 对数据的来源一无所知。您将给定大小 N 的实数数组传递给它,然后在 return 中得到一个大小为 N/2+1 的复数数组。输入数组可以是过去N天的太阳黑子数量是否预报未来N小时。 KissFFT 不在乎。

映射回现实世界需要你来完成,所以你要解读数据。在您的代码片段中,您传递了 1024 个浮点数(我假设 floatArray 包含输入数据)。然后你会得到一个包含 513 (=1024/2+1) 对浮点数的数组。

如果您使用 44.1 KHz 采样并传递 1024(您的 window 大小)样本的 KissFFT 块,您将获得最高频率 22.05 KHz 和最低频率约 43 Hz (44,100 / 1024)。通过将更大的块传递给 KissFFT,您可以获得更低的速度,但请记住,处理时间会增加(N 的四次方,IIRC)!

顺便说一句:您可以考虑将 windowSize 变量设置为 const,以允许编译器进行一些优化。在进行数字运算时,优化非常有价值。在这种情况下,影响可以忽略不计,但它是一个很好的起点。