gpt4 book ai didi

fft - KissFFT(kiss_fftr 到 kiss_fftri)- 如何重建原始信号?

转载 作者:行者123 更新时间:2023-12-03 22:00:34 26 4
gpt4 key购买 nike

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

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

谁能指出我正确的方向?

非常感谢,

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

#define FIXED_POINT 16
#include "kiss_fftr.h"

这确保了 typedef 的“kiss_fft_scalar”类型被强制为 int16_t(短)。

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

LOCAL_CPPFLAGS += -DFIXED_POINT

最佳答案

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

此外,固定点版本向下两个方向缩放(fwd,inv)。所以如果你希望重建你的信号,你会想要乘以总的 nfft。我建议分两个阶段乘以饱和度。

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com