• 締切済み

複素FFTに関して教えてください。

FFTは    N-1 Ak = Σ A(n)・W^kn, W^kn = e^-2πn/N    n=0 にて示されると思いますが、 例えば取得した8point実数データをFFT演算する場合、手計算でもRadix2で計算すれば、下記のような演算 (展開してしまってますが・・・) を行うことで、 A0=a0*W0+a1*W0+a2*W0+a3*W0+a4*W0+a5*W0+a6*W0+a7*W0 A2=a0*W0+a1*W4+a2*W0+a3*W4+a4*W0+a5*W4+a6*W0+a7*W4 A4=a0*W0+a1*W2+a2*W4+a3*W6+a4*W0+a5*W2+a6*W4+a7*W6 A6=a0*W0+a1*W6+a2*W4+a3*W2+a4*W0+a5*W6+a6*W4+a7*W2 A1=a0*W0+a1*W1+a2*W2+a3*W3+a4*W4+a5*W5+a6*W6+a7*W7 A5=a0*W0+a1*W5+a2*W2+a3*W7+a4*W4+a5*W1+a6*W6+a7*W3 A3=a0*W0+a1*W3+a2*W6+a3*W1+a4*W4+a5*W7+a6*W2+a7*W5 A7=a0*W0+a1*W7+a2*W6+a3*W5+a4*W4+a5*W3+a6*W2+a7*W1 各ポイント値が得られるものと理解しています。 このような実数FFTに関しては、Radix-4等も含めて、 数多くいろいろなサイトで紹介されているのですが、 入力が実数+虚数の場合(複素FFT)の演算方法に 関してあまり見つけることが出来ませんでした。 ご存知の方おられましたら教えて頂けないでしょうか。 結論としては、Re0,Im0,Re1,Im1という実数+虚数 入力に対して Re(0)_o = Re(0) + Wre x Re(1) - Wim x Im(1) Im(0)_o = Im(0) + Wim x Re(1) + Wre x Im(1) Re(1)_o = Re(0) - Wre x Re(1) + Wim x Im(1) Im(1)_o = Im(0) - Wim x Re(1) - Wre x Im(1) となるようですが、バタフライの図も含めて、 どのようにして上式が導かれるのかを教えて頂け ないでしょうか。 また、Re0,Im0,Re1,Im1,Re2,Im2,Re3,Im3を入力と する場合の、Radix-4ではどう考えるかも教えて 頂ければと思います。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

Fourier 変換では 1 の原始 N乗根の選択に任意性があるので, そのどれを使っているかが違うだけだと思います. まあ Wim が正負どちらの符号を持っているかわからないのでなんとも言いにくい (Wim = -sin θ とおくと同じ式になっちゃうし) んですが.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

入力が実数でも複素数でも同じだったと思うんだけど....

Masa_Yan_66
質問者

補足

すみません。もう少し具体的に書きます。 FFTは    N-1 Ak = Σ A(n)・W^kn, W^kn = e^-2πn/N にて示されますが、    n=0 サイトでよく出ているFFT算出Cプログラムを見ると、 Re0,Im0,Re1,Im1という実数+虚数入力に対して下記のように演算されています。  +----------------------------------------------+  | Wre = cos, Wre = sinとしてTableを持ち    |  |                       |  | XRe(0) = Re(0) + Wre x Re(1) - Wim x Im(1) |  | XIm(0) = Im(0) + Wim x Re(1) + Wre x Im(1) |  | XRe(1) = Re(0) - Wre x Re(1) + Wim x Im(1) |  | XIm(1) = Im(0) - Wim x Re(1) - Wre x Im(1) |  +----------------------------------------------+ 単純にDITのバタフライ図を書いてみると(見づらくてすみません) Re(0) + jIm(0) -+-+- XRe(0) + jXIm(0)          X Re(1) + jIm(1) -+-+- XRe(1) + jXIm(1)          W - 上記のバタフライを単純計算すると、 XRe(0) + jXIm(0) = Re(0) + jIm(0) + W(Re(1) + jIm(1)) = Re(0) + jIm(0) + (cos - jsin)(Re(1) + jIm(1)) = Re(0) + jIm(0) + cos・Re(1) - jsin・Re(1) + jcos・Im(1) - j^2sin・Im(1) = Re(0) + cos・Re(1) + sin・Im(1) + j(Im(0) - sin・Re(1) + cos・Im) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      実数項:XRe(0)          虚数項:Xim(0) XRe(1) + jXIm(1) = Re(0) + jIm(0) - W(Re(1) + jIm(1)) = Re(0) + jIm(0) - (cos - jsin)(Re(1) + jIm(1)) = Re(0) + jIm(0) - cos・Re(1) + jsin・Re(1) - jcos・Im(1) + j^2sin・Im(1) = Re(0) - cos・Re(1) - sin・Im(1) + j(Im(0) + sin・Re(1) - cos・Im) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      実数項:XRe(1)          虚数項:Xim(1) ここで、単純計算で求めた、各項とCプログラムの式の各項を比較してみると 微妙に符号が合いません。どこで勘違いしているかご指摘頂ければ助かります。

関連するQ&A