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

最佳答案

我注意到您正在发送短裤。您确定已经编译了所有内容以将int16_t用作DATATYPE吗?有时预处理器环境的不匹配会导致问题。

同样,定点版本在两个方向(fwd,inv)都向下缩放。因此,如果您希望重构信号,则需要将所有信号乘以nfft。
我建议分两个阶段乘以饱和度。

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

关于fft - KissFFT(kiss_fftr to kiss_fftri)-如何重建原始信号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10934378/

10-13 07:09