如何从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的实数数组,然后返回N/2+1大小的复数值数组。输入阵列可以是是否对过去N天的黑子数的下N个小时进行预测。 KissFFT无关紧要。

映射回现实世界需要您来完成,因此您必须解释数据。在您的代码片段中,您正在传递1024个浮点数(我假设floatArray包含输入数据)。然后,您将获得一个513(= 1024/2 + 1)对浮点数的数组。

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

顺便说一句:您可以考虑将windowSize变量设为const,以允许编译器进行一些优化。在进行数字运算时,优化非常有值(value)。在这种情况下,效果可能微不足道,但这是一个很好的起点。

07-24 14:14