我在理解如何正确使用 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