3

我在理解如何正确使用 KissFFT (1.2.9) 时遇到了一些麻烦。我现在想要实现的只是执行 FFT,然后立即执行 iFFT 以再次重建原始信号。下面的代码片段演示了我在做什么:

void test(short* timeDomainData, int length)
{
    // Create the configurations for FFT and iFFT...
    kiss_fftr_cfg fftConfiguration = kiss_fftr_alloc( length, 0, NULL, NULL );
    kiss_fftr_cfg ifftConfiguration = kiss_fftr_alloc( length, 1, NULL, NULL );

    // Allocate space for the FFT results (frequency bins)...
    kiss_fft_cpx* fftBins = new kiss_fft_cpx[ length / 2 + 1 ];

    // FFT...
    kiss_fftr( fftConfiguration, timeDomainData, fftBins );

    // iFFT...
    kiss_fftri( ifftConfiguration, fftBins, timeDomainData );
}

我发现这实际上在运行时崩溃。我发现在创建 KissFFT 配置时将大小除以 2 可以停止崩溃:

kiss_fftr_cfg fftConfiguration = kiss_fftr_alloc( length / 2, 0, NULL, NULL );
kiss_fftr_cfg ifftConfiguration = kiss_fftr_alloc( length / 2, 1, NULL, NULL );

但是,当我播放重建的音频数据时,它几乎是无声的,带有奇怪的噼啪声。

谁能指出我正确的方向?

非常感谢,P

编辑 1:这就是我包含 KissFFT 头文件并定义 FIXED_POINT 变量的方式:

#define FIXED_POINT 16
#include "kiss_fftr.h"

这确保了 typedef'd 'kiss_fft_scalar' 类型被强制为 int16_t(短)。

编辑 2:目标平台是 Android,所以我还在我的 Android.mk 文件中添加了以下内容:

LOCAL_CPPFLAGS += -DFIXED_POINT
4

3 回答 3

0

我正在努力在 Android 中做同样的事情,还没有得到它(见这里!),但我可以在你的代码中看到一个问题:“fftBins”需要是“长度”大小。原因是它是原始变换,而不是频率幅度/相位......我想?还是我弄错了?

于 2012-06-09T01:11:15.670 回答
0

我注意到你寄的是短裤。您确定您已编译所有内容以使用 int16_t 作为 DATATYPE 吗?有时预处理器环境的不匹配会导致问题。

此外,定点版本在两个方向(fwd,inv)都向下缩放。因此,如果您希望重建您的信号,您将需要将事物乘以 nfft 的总数。我建议分两个阶段乘以饱和度。

例如,如果您正在执行大小为 1024 的 FFT+IFFT,则在 FFT 之后乘以 32,然后在 IFFT 之后再乘以 32。

于 2012-06-08T12:36:11.167 回答
0

我不确定静音,但如果你有很多噼啪声,那可能是因为你正在独立处理相邻的块而不是使用Overlap-Add,你可以在每个块之间有效地交叉淡入淡出以获得更平滑的特性.

于 2012-06-08T12:48:30.597 回答