0

如何从 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));
4

1 回答 1

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,以允许编译器进行一些优化。在进行数字运算时,优化非常有价值。在这种情况下,效果可能可以忽略不计,但这是一个很好的起点。

于 2017-05-06T15:15:08.480 回答