6

FFTでフィルタリングを行おうとしています。私はr2r_1dプランを使用していますが、逆変換を行う方法がわかりません...

    void PerformFiltering(double* data, int n)
    {
                    /* FFT */
        double* spectrum = new double[n];

        fftw_plan plan;

        plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT00, FFTW_ESTIMATE);

        fftw_execute(plan); // signal to spectrum
        fftw_destroy_plan(plan); 


                    /* some filtering here */


                    /* Inverse FFT */
        plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT00, FFTW_ESTIMATE);
        fftw_execute(plan); // spectrum to signal (inverse FFT)
        fftw_destroy_plan(plan);

}

私はすべてのことを正しくやっていますか?FFTWコンプレックスDFTでは、次のようなフラグで変換方向を設定できるため、混乱しています
。p = fftw_plan_dft_1d(N、in、out、FFTW_FORWARD、FFTW_ESTIMATE);
または
p=fftw_plan_dft_1d(N、in、out、FFTW_BACKWARD、FFTW_ESTIMATE);

4

2 に答える 2

4

http://www.fftw.org/fftw3_doc/Real_002dto_002dReal-Transform-Kinds.html

http://www.fftw.org/fftw3_doc/1d-Real_002deven-DFTs-_0028DCTs_0029.html

「種類」は方向を指定します。

(おそらく、nで除算して信号を再正規化する必要があることにも注意してください。FFTWの正規化規則は、変換とその逆の後でnを乗算します。)

于 2010-12-12T22:46:10.793 に答える
1

あなたはそれを正しくしました。FFTW_REDFT00は、それ自体の逆である余弦変換を意味します。したがって、「前方」と「後方」を区別する必要はありません。ただし、アレイのサイズには注意してください。10の頻度を検出する必要があり、データに100の意味のあるポイントが含まれている場合、配列は101のデータポイントdataを保持し、100ではなく設定する必要があります。正規化は。以下の例を参照して、でコンパイルしてください。n = 1012*(n-1)gcc a.c -lfftw3

#include <stdio.h>
#include <math.h>
#include <fftw3.h>
#define n 101 /* note the 1 */
int main(void) {
  double in[n], in2[n], out[n];
  fftw_plan p, q;
  int i;
  p = fftw_plan_r2r_1d(n, in, out, FFTW_REDFT00, FFTW_ESTIMATE);
  for (i = 0; i < n; i++) in[i] = cos(2*M_PI*10*i/(n - 1)); /* n - 1 instead of n */
  fftw_execute(p);
  q = fftw_plan_r2r_1d(n, out, in2, FFTW_REDFT00, FFTW_ESTIMATE);
  fftw_execute(q);
  for (i = 0; i < n; i++)
    printf("%3d %9.5f %9.5f\n", i, in[i], in2[i]/(2*(n - 1))); /* n - 1 instead of n */
  fftw_destroy_plan(p); fftw_destroy_plan(q); fftw_cleanup();
  return 0;
}
于 2014-02-25T20:36:44.737 に答える