【问题标题】:FFTW - computing the IFFT without first computing an FFTFFTW - 在不首先计算 FFT 的情况下计算 IFFT
【发布时间】:2014-10-06 14:51:41
【问题描述】:

这似乎是一个简单的问题,但我一直试图在 FFTW 页面上找到答案,但我无法。

我为前向和后向变换创建了 FFTW 计划,并将一些数据直接输入到 fftw_complex *fft 结构中(而不是先从输入数据计算 FFT)。然后我对此计算了一个IFFT,结果不正确。我这样做对吗?

编辑:所以我所做的如下:

int ht=2, wd=2;
fftw_complex *inp  = fftw_alloc_complex(ht * wd);
fftw_complex *fft  = fftw_alloc_complex(ht * wd);
fftw_complex *ifft = fftw_alloc_complex(ht * wd);

fftw_plan plan_f = fftw_plan_dft_1d(wd *ht, inp, fft,  FFTW_FORWARD,  FFTW_ESTIMATE);
fftw_plan plan_b = fftw_plan_dft_1d(wd * ht, fft, ifft, FFTW_BACKWARD, FFTW_ESTIMATE );

for(int i =0 ; i < 2; i++)
{
    for(int j = 0; j<2; j++)
    {
        inp[wd*i + j][0] = 1.0;
        inp[wd*i + j][1] = 0.0;
    }
}

//    fftw_execute(plan_f);

for(int i =0 ; i < 2; i++)
{
    for(int j = 0; j<2; j++)
    {
        fft[wd*i + j][1] = 0.0;
        if(i == j == 0)
            fft[wd*i+j][0] = 4.0;
        else
            fft[wd*i+j][0] = 0.0;

        std::cout << fft[wd*i+j][0] << " and " << fft[wd*i+j][1] << std::endl;
    }
}

fftw_execute(plan_b);
for(int i =0 ; i < 2; i++)
{
    for(int j = 0; j<2; j++)
        std::cout << ifft[wd*i+j][0]/(double)(wd*ht) << " and " << ifft[wd*i+j][1]/(double)(wd*ht) << std::endl;
}

这是完整的代码。 ifft 应该为实部返回 [1 1 1 1]。没有。

【问题讨论】:

  • 是的,只计算 IFFT 是完全有效的。如果没有看到最小的测试用例,很难说你可能做错了什么。
  • “结果不正确”——你期待什么结果,你得到了什么?你的数据来自哪里?是不是已经在频域了?
  • 我做了一些修改——希望有用。提前致谢!
  • 是的,很抱歉 - 现在正在做大量的编辑。希望一切都已修复 - 我从我的代码库中复制。
  • 所以你把fft的复杂部分保持不变?

标签: fft fftw ifft


【解决方案1】:

我做了最愚蠢的事——在我发布的 if 条件下:

i == j == 0

而不是 i ==0 && j == 0

当我修复它时,它可以工作。非常感谢大家帮助我。

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2014-01-16
    相关资源
    最近更新 更多