如何从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)。在这种情况下,效果可能微不足道,但这是一个很好的起点。