БПФ и IFFT с БПФ

Я пытаюсь сделать 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);

1 ответ

Вы только отображаете реальные части выходных лотков и игнорируете мнимые компоненты. Так уж получилось, что реальные части совпадают, но мнимые компоненты разные (на самом деле они являются комплексными сопряженными):

#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

Интересно отметить, что БПФ и IFFT математически почти идентичны. Они оба часто реализуются как одна подпрограмма с флагом, указывающим направление (вперед или назад). Обычно этот флаг просто влияет на знак мнимой части факторов твида.

Другие вопросы по тегам