【问题标题】:How to set the frequency band of my array after fft如何在fft之后设置我的阵列的频带
【发布时间】:2017-05-06 14:32:28
【问题描述】:

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

【问题讨论】:

    标签: c++ audio signal-processing kissfft


    【解决方案1】:

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

    回到现实世界的映射需要由您完成,因此您必须解释数据。在您编写 sn-p 代码时,您传递了 1024 个浮点数(我假设 floatArray 包含输入数据)。然后,您会返回一个包含 513 (=1024/2+1) 对浮点数的数组。

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

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

    【讨论】:

    • 因此,如果我运行此代码,我可以知道 realPartFFT 数组的频率为 43 Hz - 22.05 KHz,或者我必须将其设置在某个地方?
    • 是的,43 Hz - 22.05 KHz 是正确的解释。我不知道你想在哪里设置它,除了在你绘制数据时在 x 轴的标签上。
    • 好吧,所以我只使用频率来绘制数据。在这种情况下,我还有一个问题。我想使用 libmfcc 库来计算这些系数。 for (int i = 0; i
    • 你最好为这个新主题写一个新问题。
    • 如果我上面的回答有帮助,请点击旁边的复选标记 ✅ 接受它。
    猜你喜欢
    • 2014-10-28
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多