真正的逆FFT给我一个充满 NaN 的数组,而不是浮点数。
FooOnHorseback
complex_array 是正常的,我猜的值没有错。
kiss_fftri(conf,complex_array,output);
据我所知, conf 也应该没问题。
尺寸有什么问题?我知道前向 FFT的输出大小必须 N / 2 + 1 ,上面的大小应该是 N 。
我已经用音频卷积制作了一个简单的工作示例 频域和一切,但我不知道发生了什么 的此处
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 。
答案 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..
}