• 締切済み

離散フーリエ変換のスペクトルについて

関数f(x)=2sin(πx)をx=0~2まで等間隔1000点でサンプリングし、 離散フーリエ変換 Σ(k=0~N-1) f(k)exp(-2πkni/N) の式から、言語プログラムで計算する式をつくり、1000個の実数Reと虚数Imを得ました。 ピークはもちろん周波数πのときで、スペクトルの値が1000でした。 √(Re^2+Im^2)をスペクトル値、√なしをパワースペクトル値をいうそうですが、元の関数の振幅2とこのスペクトル値とはどのような関係があるのでしょうか? 異なる正弦波を混ぜれば、スペクトル値を見ることによって振幅の比は分かりますが、スペクトル値と振幅には式的になんらかの関係は存在するのでしょうか?  波のエネルギーは振幅の2乗になると思い、2^2=4がスペクトル値としてでる事を期待していましたが途方もなく異なる値が出てしまいました。 どうぞよろしくお願いします。

みんなの回答

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

#2 です. はい, 1000 はスペクトルの大きさで, N は点数です. DFT の基本をきちんとおさえておけばいいんだけど, 自分でも思い出しながら書いてみる: ω = exp (2πi/N) とおきます. ω は 1 の原始 N 乗根です. 今考えている関数だと f(k) = 2 sin(2πk/N) = 2(ω^k - ω^(-k)) / (2i) = -i (ω^k - ω^(-k)) です... あ, 離散フーリエ変換の式中の f(k) は 2 sin (2πk/N) ですよね? f(x) = 2 sin πx をそのまま使っていないですよね? すると, exp (-2πink/N) = ω^(-nk) ですから Σ (k=0~N-1) f(k) exp (-2πink/N) = Σ (k=0~N-1) -i (ω^k - ω^(-k)) ω^(-nk) = Σ (k=0~N-1) -i ω^(1-n)k + Σ (k=0~N-1) i ω^(-(1+n)k)) となりますが, 第1項は 1 - n ≡ 0 mod N のときにのみ 0 でない値となり, 一方第2項は -(1+n) ≡ 0 mod N のときにのみ 0 でない値となります. 順に考えると 1.1 - n ≡ 0 mod N のとき. このとき (0 ≦ n < N より) n = 1 です. そして和の値は 1 + ω^N + ω^(2N) + ... + ω^((N-1)N) = N となります. 1+n = 2 ですから第2項は 0. つまり n = 1 に対して -iN という値になります. 2.-(1+n) ≡ 0 mod N のとき. このとき n = N-1 で, 和の値は1と同じく N になります. 第1項は 0 になりますから, フーリエ変換の値として iN が得られます. 3.その他のとき. 第1項, 第2項ともに 0 なので 0. ということで, プログラムで得られた結果と一致します. 振幅の 2 は sin を複素表示したときに分母にある 2 と相殺されていることに注意してください.

taro_kao
質問者

お礼

ありがとうございました。 お忙しい中、丁寧な解説ありがとうございます。 完璧とまではいきませんが、良く理解することができました。

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

え~, ちょっといろいろ書いてみたんですが, 逆変換を考えてみてください というアドバイスが最も簡単かつ適切かなぁ. ちなみに原信号の振幅を A とすると 1000 / N = A / 2 が成り立っています.

taro_kao
質問者

お礼

回答ありがとうございます。 逆変換するとやはり元の実空間の数値に戻るようです。 考えてみましたら、実空間において関数の振幅の値は、場所によって異なりますから、スペクトル値は振幅の2乗となるからA(最大振幅のみ)^2がスペクトルとなるというのはおかしいかもしれませんね。すべての点における振幅の2乗がスペクトルとなるのかもしれません。 教えていただいた式の1000の部分はスペクトルの大きさ、Nがサンプリング数という理解でよろしいでしょうか??

  • Meowth
  • ベストアンサー率35% (130/362)
回答No.1

離散フーリエ変換に関数f(x)=2sin(πx)をかければ、きれいに1つだけ ピークがでると思います。それにCOSの成分はほとんど0になっているはずです。 指数表示からSIN、COS表示に直して、それぞれの成分をみてください。 スペクトルの値が合わないということですので、ソフトが違っている可能性が 高いです。(データ入力ミスか、ソフト自体のバグか) 直接結果をみることができないので あくまで想像ですが。

taro_kao
質問者

お礼

ありがとうございます。おっしゃるようにピークがでているのは虚数部分の値で、実数部分(Re)はほとんどゼロです。プログラム自体は下記のサイトから転用したので、間違っている可能性は少ないかもしれません。 http://www.geocities.jp/supermisosan/spectrum.html サイトでも大きな値がスペクトル値として出ています。 振幅とスペクトルの関係をもう少し考えてみます。

関連するQ&A