kissfft - 反向实数FFT给出NaN

时间:2015-05-09 16:54:25

标签: c++ fft kissfft

真正的逆FFT给我一个充满 NaN 的数组,而不是浮点数

FooOnHorseback

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

kiss_fftri(conf,complex_array,output);

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

尺寸有什么问题?我知道前向 FFT的输出大小必须 N / 2 + 1 ,上面的大小应该是 N

  

我已经用音频卷积制作了一个简单的工作示例   频域和一切,但我不知道发生了什么   的此处

enter image description here enter image description here

NaNs和上面的complex_array的一些样本。

我示例中的尺寸参数始终为 18750 。那是样品的数量。因此,N / 2 + 1 7876

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

我甚至在kiss_fftr_next_fast_size_real(大小)上做了它并保持不变,因此大小应该是最佳的。

这是我的卷积:

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

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

1 个答案:

答案 0 :(得分:2)

这不是造成问题的吻。结果数组的处理方式是错误的。

要真正“保持简单和愚蠢”(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 
);

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

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