c++ - FFT 和 IFFT 与 FFTW

标签 c++ math signal-processing fft fftw

我正在尝试对 float 组进行 ifft 和 fft 操作。然而,两者的结果是相同的。你有什么主意吗? 为什么结果相同,即使我对一个使用 FFTW_FORWARD,对另一个使用 FFTW_BACKWARD?

  int N=16;
  fftwf_complex in[N], out[N];
  fftwf_plan p1, q;

  /* prepare a cosine wave */
  for (i = 0; i < N; i++) {
    in[i][0] = cos(3 * 2*M_PI*i/N);
    in[i][1] = 0;
  }

  /* forward Fourier transform, save the result in 'out' */
  p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
  fftwf_execute(p1);
  for (i = 0; i < N; i++)
  cout << out[i][0] << endl;
  fftwf_destroy_plan(p1);

  printf("\nInverse transform:\n");
  q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);
  fftwf_execute(q);
  for (i = 0; i < N; i++)
  cout << out[i][0] << endl;
  fftwf_destroy_plan(q);

最佳答案

您仅显示出纸槽的实部,而忽略虚部。恰好实部匹配,但虚部不同(它们实际上是复共轭):

#include <iostream>
#include <cmath>
#include "fftw3.h"

using namespace std;

int main()
{
    int N=16;
    fftwf_complex in[N], out[N];
    fftwf_plan p1, q;

    for (int i = 0; i < N; i++) {
        in[i][0] = cos(3 * 2*M_PI*i/N);
        in[i][1] = 0;
    }

    p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    fftwf_execute(p1);
    for (int i = 0; i < N; i++)
        cout << out[i][0] << " + j" << out[i][1] << endl; // <<<
    fftwf_destroy_plan(p1);

    printf("\nInverse transform:\n");
    q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);
    fftwf_execute(q);
    for (int i = 0; i < N; i++)
        cout << out[i][0] << " + j" << out[i][1] << endl; // <<<
    fftwf_destroy_plan(q);

    return 0;
}

编译并运行:

$ g++ -Wall fftwf.cpp -lfftw3f && ./a.out

3.67394e-16 + j0
1.19209e-07 + j7.34788e-16
-3.67394e-16 + j0
8 + j-7.34788e-16
3.67394e-16 + j0
2.38419e-07 + j7.34788e-16
-3.67394e-16 + j0
1.19209e-07 + j-7.34788e-16
3.67394e-16 + j0
1.19209e-07 + j7.34788e-16
-3.67394e-16 + j0
2.38419e-07 + j-7.34788e-16
3.67394e-16 + j0
8 + j7.34788e-16
-3.67394e-16 + j0
1.19209e-07 + j-7.34788e-16

Inverse transform:
3.67394e-16 + j0
1.19209e-07 + j-7.34788e-16
-3.67394e-16 + j0
8 + j7.34788e-16
3.67394e-16 + j0
2.38419e-07 + j-7.34788e-16
-3.67394e-16 + j0
1.19209e-07 + j7.34788e-16
3.67394e-16 + j0
1.19209e-07 + j-7.34788e-16
-3.67394e-16 + j0
2.38419e-07 + j7.34788e-16
3.67394e-16 + j0
8 + j-7.34788e-16
-3.67394e-16 + j0
1.19209e-07 + j7.34788e-16

有趣的是,FFT 和 IFFT 在数学上几乎相同。它们通常都作为单个例程实现,并带有指示方向(向前或反向)的标志。通常,此标志仅影响旋转因子的虚部的符号。

关于c++ - FFT 和 IFFT 与 FFTW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36913337/

相关文章:

php - 为什么 postgresql 不存储我的整个(PHP)浮点值?

algorithm - 当 d 是 k 位指数时,使用平方乘算法计算 m^d mod n 所需的最大乘法次数是多少?

python - 使用 numpy 在重复信号的一部分内绘制抛物线

java - 在 Android 应用程序中实现低通滤波器 - 如何确定 alpha 值?

c++ - 在没有额外堆分配的情况下将大 vector 分块为小 vector

c++ - 为什么有一个本地仿函数不好?

javascript - 将分数计算为相对于其他分数的值

algorithm - 信号增强算法

c++ - 如何删除带有指向其他对象的指针的动态对象数组 (C++)

c++ - OpenGL 优化网格绘制(VAO?没有索引?)