使用 kiss_fft 将复数频率转换为实信号
Complex frequencies to real signal transform with kiss_fft
我正在尝试对复杂信号进行 FFT,输出应该是真实的。所以我做了这个代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "lib\kiss_fftr.c"
int N = 16;
void TestFftReal(const char* title, const kiss_fft_cpx in[N/2+1], kiss_fft_scalar out[N/2+1])
{
kiss_fftr_cfg cfg = kiss_fftr_alloc(N, 1/*is_inverse_fft*/, NULL, NULL);
printf("%s\n", title);
if (cfg != NULL)
{
size_t i;
kiss_fftr(cfg, in, out);
free(cfg);
for (i = 0; i < N; i++)
{
printf("out[%2zu] = %+f ", i, out[i]);
if (i < N/2+1 )
{
printf(" in[%2zu] = %+f, %+f ", i, in[i].r, in[i].i);
}
printf("\n");
}
}
}
int main(void)
{
kiss_fft_cpx In[N/2+1];
kiss_fft_scalar Out[N];
size_t i;
for (i = 0; i < N; i++)
{
In[i].r = In[i].i = 0;
}
TestFftReal("Zeroes (real)", In, Out);
for (i = 0; i < N; i++)
{
In[i].r = 1, In[i].i = 0;
}
TestFftReal("Ones (real)", In, Out);
for (i = 0; i < N; i++)
{
In[i].r = sin(45 * i * (M_PI / 180)), In[i].i =0;
}
TestFftReal("SineWave (real)", In, Out);
return 0;
}
但是现在函数 kiss_fftr() 出现了问题。我应该使用 kiss_fft() 吗?
该错误表明 in 或 out 不是正确的类型,但在 Git-Hub 上它说它应该如此。
https://github.com/berndporr/kiss-fft
至少这个问题:
代码尝试在 3 个不同的循环中分配超出 In[]
范围
kiss_fft_cpx In[N/2+1];
...
for (i = 0; i < N; i++)
{
In[i].r = In[i].i = 0;
}
推荐的备选方案:
for (i = 0; i < (N/2+1); i++)
如果kiss_fftr(cfg, in, out);
是
void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata)
... 那么该函数将从 kiss_fft_scalar
变为 kiss_fft_cpx
。 OP 的代码正好相反。
TestFftReal( ... const kiss_fft_cpx in[N/2+1], kiss_fft_scalar out[N/2+1]) {
kiss_fftr(cfg, in, out);
也许 OP 想要 kiss_fftri()
而不是 kiss_fftr()
?
void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata)
我正在尝试对复杂信号进行 FFT,输出应该是真实的。所以我做了这个代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "lib\kiss_fftr.c"
int N = 16;
void TestFftReal(const char* title, const kiss_fft_cpx in[N/2+1], kiss_fft_scalar out[N/2+1])
{
kiss_fftr_cfg cfg = kiss_fftr_alloc(N, 1/*is_inverse_fft*/, NULL, NULL);
printf("%s\n", title);
if (cfg != NULL)
{
size_t i;
kiss_fftr(cfg, in, out);
free(cfg);
for (i = 0; i < N; i++)
{
printf("out[%2zu] = %+f ", i, out[i]);
if (i < N/2+1 )
{
printf(" in[%2zu] = %+f, %+f ", i, in[i].r, in[i].i);
}
printf("\n");
}
}
}
int main(void)
{
kiss_fft_cpx In[N/2+1];
kiss_fft_scalar Out[N];
size_t i;
for (i = 0; i < N; i++)
{
In[i].r = In[i].i = 0;
}
TestFftReal("Zeroes (real)", In, Out);
for (i = 0; i < N; i++)
{
In[i].r = 1, In[i].i = 0;
}
TestFftReal("Ones (real)", In, Out);
for (i = 0; i < N; i++)
{
In[i].r = sin(45 * i * (M_PI / 180)), In[i].i =0;
}
TestFftReal("SineWave (real)", In, Out);
return 0;
}
但是现在函数 kiss_fftr() 出现了问题。我应该使用 kiss_fft() 吗? 该错误表明 in 或 out 不是正确的类型,但在 Git-Hub 上它说它应该如此。 https://github.com/berndporr/kiss-fft
至少这个问题:
代码尝试在 3 个不同的循环中分配超出 In[]
范围
kiss_fft_cpx In[N/2+1];
...
for (i = 0; i < N; i++)
{
In[i].r = In[i].i = 0;
}
推荐的备选方案:
for (i = 0; i < (N/2+1); i++)
如果kiss_fftr(cfg, in, out);
是
void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata)
... 那么该函数将从 kiss_fft_scalar
变为 kiss_fft_cpx
。 OP 的代码正好相反。
TestFftReal( ... const kiss_fft_cpx in[N/2+1], kiss_fft_scalar out[N/2+1]) {
kiss_fftr(cfg, in, out);
也许 OP 想要 kiss_fftri()
而不是 kiss_fftr()
?
void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata)