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

2023-12-21

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

然而,当我播放重建的音频数据时,它基本上是无声的,并伴有奇怪的爆裂声。

有人能指出我正确的方向吗?

非常感谢, 磷

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

#define FIXED_POINT 16
#include "kiss_fftr.h"

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

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

LOCAL_CPPFLAGS += -DFIXED_POINT

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

此外,定点版本会向下缩小both方向(正向、反向)。因此,如果您希望重建信号,您需要将总乘以 nfft。 我建议分两个阶段乘以饱和度。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KissFFT(kiss_fftr 到 Kiss_fftri) - 如何重建原始信号? 的相关文章

  • 如何在for循环内进行同步延迟?

    我正在编写一个 NodeJS 脚本 它通过 GET 调用一堆 API 使用request来自 npm 并将响应保存在 JSON 文件中 我正在使用一个for循环遍历ID以传递给API 但是我在调 用突发之间设置延迟时遇到了麻烦 这样我就不会

随机推荐