我很难理解如何正确使用KissFFT (1.2.9)。我现在要做的就是做一个快速傅立叶变换,然后立即执行一个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,因此我还在文件中添加了以下内容:
LOCAL_CPPFLAGS += -DFIXED_POINT发布于 2012-06-08 12:36:11
我注意到你在送短裤。您确定您已经编译了所有的东西来使用int16_t作为数据类型吗?有时,预处理器环境的不匹配可能会导致问题。
此外,不动点版本向下两个方向(fwd,inv)。所以,如果你想要重建你的信号,你会想要乘以所有的东西。我建议分两个阶段与饱和相乘。
例如,如果你做的是1024大小的FFT+IFFT,那么在FFT之后乘以32,在IFFT之后再乘以32。
发布于 2012-06-08 12:48:30
我不确定沉默,但如果你得到了很多裂纹,那么它可能是因为你是独立处理相邻的块,而不是使用重叠-添加,在每个块之间你有效地交叉淡出,以获得一个更平滑的特性。
发布于 2012-06-09 01:11:15
我很难在Android中做同样的事情,还没有得到它(参见这里!),但是我可以在您的代码中看到一个问题:"fftBins“需要”长度“大小。原因是它是原始变换,而不是频率大小/相位.我认为?还是我弄错了?
https://stackoverflow.com/questions/10934378
复制相似问题