2017-05-06 33 views
0

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

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)); 

回答

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

+0

因此,如果我运行此代码,我可以告诉realPartFFT阵列有43 Hz - 22.05 KHz的频率,或者我必须将它设置在某个位置? –

+0

是的,43 Hz - 22.05 KHz是正确的解释。我不知道你想在哪里设置,除了绘制数据时在x轴的标签处。 – craesh

+0

那么,所以我只用频率来绘制数据..在这种情况下,我还有另一个问题。我想使用libmfcc库来计算这些系数。 (int i = 0; i <26; i ++) getCoefficient(realPartFFT,44100,48,1024,i); 和我的光谱数组有问题,因为这个函数想要双精度数组,我给她的浮点数组。我尝试覆盖参数来漂浮,但它仍然不起作用 –