• ベストアンサー

離散フーリエ変換について

G(n/Nτ)= Σ[k=0->N-1] {τ*f(kτ)*e^(-i2πkn/N)} 上記の式は離散フーリエ変換の式らしいですが、 これを関数化しようとしてつまずいています。 どのように解釈すれば、関数化できるのでしょうか? 特に、複素数iがよくわかりません。 e^iが点を左に90度回転させるくらいはわかります。 e^(-i2πkn/N)を関数powで表現できなくて困っていますが、多分見当違いだとは思います。 フーリエ級数展開はわかります。 最終的にはFFTを行いたいのですが、 その理解の前に離散フーリエ変換ができないといけないと思っています。 よろしくお願いします。 void GraphClass::ScatteredFourierConvert() { /* N-1 G(n/Nτ)= Σ {τ*f(kτ)*e^(-i2πkn/N)} k=0 k=何番目の値か? τ=値を読んだ間隔 N=値を読んだ数 */ int Tau=10; int N=RangeSize.cx*2/Tau; double Sum=0; double e=2.7182818; for(int k=0;k<N-1;k++) { Sum+=Tau*Data[k*Tau]*pow(e,-i*2*PI*k*n/N); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

その式の「eのべき」の部分は、複素数を実部と虚部に分けて書くとsinとcosで表すことができます。 プログラミング向けの参考書であれば必ず書いてあります。また、「フーリエ変換 sin cos」で検索すると参考になるページがたくさん出てきます。 がんばってください。 #「離散フーリエ変換」はDiscrete Fourier Transformと表現するのが一般的です

noname#16581
質問者

お礼

ご丁寧にありがとうございました。 また、お手数おかけしました。 ちょっと難しいですね。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

複素数を引数にとるexp関数があれば解決するのでしょうか? そうであれば、C++なら次のようにできます。 #include <complex> ... std::complex<double> z; z = exp(std::complex<double>(0, -2*PI*k*n/N)); また、Cの場合でも、処理系がC99に対応していれば、 #include <complex.h> ... double complex z; z = cexp(-I*2*PI*k*n/N); とすることができます。

noname#16581
質問者

お礼

ご丁寧にありがとうございました。 また、お手数おかけしました。 ちょっと難しいですね。

関連するQ&A