C++ kissfft-逆实FFT

C++ kissfft-逆实FFT,c++,fft,kissfft,C++,Fft,Kissfft,实逆FFT为我提供了一个充满NaNs的数组,而不是浮点值 kiss_fftri(conf,complex_array,output); 复数数组是正常的,我猜值没有问题 kiss_fftr_cfg conf = kiss_fftr_alloc(size,1,NULL,NULL); 据我所知,conf应该也不错 尺寸有问题吗?我知道正向FFT的输出大小必须是N/2+1,上面的大小应该是N kiss_fftri(conf,complex_array,output); 我已经制作了一个简单的音频

实逆FFT为我提供了一个充满NaNs的数组,而不是浮点值

kiss_fftri(conf,complex_array,output);
复数数组是正常的,我猜值没有问题

kiss_fftr_cfg conf = kiss_fftr_alloc(size,1,NULL,NULL);
据我所知,conf应该也不错

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

kiss_fftri(conf,complex_array,output);
我已经制作了一个简单的音频卷积示例 频域和一切,但我不知道发生了什么 这里

kiss_fftri(conf,complex_array,output);

NaNs和上面复杂_阵列的一些样本

在我的示例中,size参数总是18750。这是样品的数量。因此,N/2+1为7876

kiss_fftri(conf,complex_array,output);
首先,我有一个450k样本的单通道。然后我把它分成24个部分。现在每个零件都有18750个样品。对于每一个样本,我用脉冲响应进行卷积。所以我上面打印的数字基本上是24轮for循环中的前20个样本。我想这里没什么问题

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


这是我的盘旋:

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;
}
kiss\u fft\u cpx卷积(kiss\u fft\u cpx*a,kiss\u fft\u cpx*b,整数大小)
{
kiss_fft_cpx r[尺寸];
memset(r,0,size*sizeof(kiss_fft_cpx));
int skalar=size*2;//用于归一化
对于(int i=0;i

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

这里的问题不是由亲吻引起的。它是如何(错误地)处理结果数组的

kiss_fftri(conf,complex_array,output);
要真正地“保持简单和愚蠢”(吻),我建议使用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 
);

这里的问题不是因为亲吻。它是如何(错误地)处理结果数组的

要真正地“保持简单和愚蠢”(吻),我建议使用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 
);

这里的问题不是因为亲吻。它是如何(错误地)处理结果数组的

要真正地“保持简单和愚蠢”(吻),我建议使用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 
);

这里的问题不是因为亲吻。它是如何(错误地)处理结果数组的

要真正地“保持简单和愚蠢”(吻),我建议使用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 
);

我猜您需要显示更多的代码,以便使用。您是否初始化了传递给fftri函数的输出数组?@BitTickler是的<代码>kiss_fft_标量输出[大小]
memset(输出,0,大小*sizeof(kiss\u fft\u标量))
复杂数组这里是一些声音数据和脉冲响应的卷积输出。正如我已经提到的,它看起来很好。Ping@MarkBorgerding-
returnr返回堆栈上的数组,该数组将在函数的作用域离开后被清除。我想您需要显示更多的代码以供使用。您是否初始化了传递给fftri函数的输出数组?@BitTickler是的<代码>kiss_fft_标量输出[大小]
memset(输出,0,大小*sizeof(kiss\u fft\u标量))
复杂数组这里是一些声音数据和脉冲响应的卷积输出。正如我已经提到的,它看起来很好。Ping@MarkBorgerding-
returnr返回堆栈上的数组,该数组将在函数的作用域离开后被清除。我想您需要显示更多的代码以供使用。您是否初始化了传递给fftri函数的输出数组?@BitTickler是的<代码>kiss_fft_标量输出[大小]
memset(输出,0,大小*sizeof(kiss\u fft\u标量))
复杂数组这里是一些声音数据和脉冲响应的卷积输出。正如我已经提到的,它看起来很好。Ping@MarkBorgerding-
returnr返回堆栈上的数组,该数组将在函数的作用域离开后被清除。我想您需要显示更多的代码以供使用。您是否初始化了传递给fftri函数的输出数组?@BitTickler是的<代码>kiss_fft_标量输出[大小]
memset(输出,0,大小*sizeof(kiss\u fft\u标量))
复杂数组这里是一些声音数据和脉冲响应的卷积输出。正如我已经提到的,它看起来很好。Ping@MarkBorgerding-
returnr在上返回数组