gpt4 book ai didi

c++ - kissfft - 逆实数 FFT 给出 NaN

转载 作者:行者123 更新时间:2023-11-28 02:27:12 31 4
gpt4 key购买 nike

真正的逆 FFT 给我一个充满 NaN 而不是 floats 的数组。

kiss_fftri(conf,complex_array,output);

complex_array 是正常的,我猜值没有问题。

kiss_fftr_cfg conf = kiss_fftr_alloc(size,1,NULL,NULL);

据我所知,conf 应该没问题。

尺寸有问题吗?我知道 forward FFT 的输出大小必须是 N/2 + 1 而上面的大小应该是 N

I've already made an simple working example with audio convolution in the frequency domain and everything, but I've no idea whats happening here.


enter image description here enter image description here

上面的 , complex_array 的 NaN 和一些样本。

在我的示例中,size 参数始终为 18750。那就是样本数。因此 N/2 + 1 为 7876

首先,我有一个包含 450k 个样本的单声道。然后我把它分成 24 个部分。现在每个部分都是 18750 个样本。对于这些样本中的每一个,我都在用脉冲响应进行卷积。所以基本上我在上面打印的数字可以说是 for 循环正在进行的 24 轮中每一轮的前 20 个样本。我想这里没什么问题。

我什至在 kiss_fftr_next_fast_size_real(size) 上做了,它保持不变,所以尺寸应该是最佳的。


这是我的卷积:

kiss_fft_cpx convolution(kiss_fft_cpx *a, kiss_fft_cpx *b, int size)
{
kiss_fft_cpx r[size];
memset(r,0,size*sizeof(kiss_fft_cpx));
int skalar = size * 2; // for the normalisation
for (int i = 0; i < size; ++i){
r[i].r = ((a[i].r/skalar) * (b[i].r)/skalar) - ((a[i].i/skalar) * (b[i].i)/skalar);
r[i].i = ((a[i].r/skalar) * (b[i].i)/skalar) + ((a[i].i/skalar) * (b[i].r)/skalar);
}
return r;
}

我在这里通过参数输入的大小N/2 + 1

最佳答案

导致这里问题的不是接吻。这就是(错误)处理结果数组的方式。

要真正“保持简单和愚蠢”(KISS),我建议为数据使用 STL 容器而不是原始 C++ 数组。这样,您就可以避免在代码中犯的错误。即返回您在堆栈上创建的数组。

kiss_fft_cpx convolution(kiss_fft_cpx *a, kiss_fft_cpx *b, int size)

... 存在各种问题。返回类型只是一个复数,而不是一个系列。

我会将函数的签名更改为:

#include <vector>
typedef std::vector<kiss_fft_cpx> complex_vector;
void
convolution
( const kiss_fft_cpxy *a
, const kiss_Fft_cpx *b
, int size
, complex_vector& result
);

然后,在代码中,您确实可以将结果 vector 的大小调整为必要的大小,就您的​​卷积计算而言,就像使用固定大小的数组一样使用它。

{
result.resize(size);
// ... use as you did in your code: result[i] etc..
}

关于c++ - kissfft - 逆实数 FFT 给出 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30142634/

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