東北工業大学 工学部情報通信工学科 中川研究室


離散フーリエ変換(DFT)

前のページから続く
フーリエ級数展開
周期 T で繰り返す周期関数 f(x) のフーリエ級数展開は
f(x)〜a0 + a1 cos(2px/T) + a2 cos(4px/T) + a3 cos(6px/T) + ... + am cos(2pmx/T) + ...
      + b1 sin(2px/T) + b2 sin(4px/T) + b3 sin(6px/T) + ... + bm sin(2pmx/T) + ...
です。 a0 , a1 , a2 , ... をうまく選ぶと、元の波形を再現できるのでは、と思われます。
元の波形f(x)が
式で
与えられている時

ここに出てくる係数は
a0 = (1/T) 0T f(x) dx
am = (2/T) 0T f(x) cos(2mpx/T)dx
bm = (2/T) 0T f(x) sin(2mpx/T)dx  で求められます。

これは、f(x)

sin(2mpx/T) をかけたもの
こんなの→ を1周期積分する (そのあと2/Tをかける) ということです。
f(x)が式でなく
データで
与えられている時


f(x)が式でなくd秒間隔のデータで与えられている時は、
f(x)は

こんな感じなので、sin(2mpx/T) をかけた結果も、
こんな感じにd秒おきの「飛び飛び」になっています。

これじゃ積分できないので、定積分=面積 を思い出し、長方形の積分の和で代用しましょう。

データが d秒間隔なので、長方形の横幅は d,
高さは f(x)sin(2mpx/T) です。

時刻 x は、x=0, x=d, x=2d, x=3d, ... のように増えていきます。
k番目のデータfk の時刻は x = k d になります。

1周期T秒までのデータの個数がN個なら
(データ0番から N-1番まででN個)
        T = N d

よって k番目の長方形の面積は
        fk sin(2mp kd / Nd ) d
これを0番からN-1番まで全部足して(2/T)をかければ
元の式 bm = (2/T ) 0T f(x) sin(2mpx / T ) dx が
  bm = (2/Nd) Σk=0N-1 fk sin(2mp kd / Nd ) d になります。
約分して
  bm = (2/N ) Σk=0N-1 fk sin(2mp k / N )
  am = (2/N ) Σk=0N-1 fk cos(2mp k / N )
  a0 = (1/N ) Σk=0N-1 fk
結局、
a0 を求めるには fk (kは0, 1, 2, ...) の値をk=0 から k=N-1まで全部足して(1/N) をかければよく、
am を求めるには fk の値にcos(2mpk/N) をかけたものを全部足して(2/N) をかければよく、
bm を求めるには fk の値にsin(2mpk/N) をかけたものを全部足して(2/N) をかければよい、
ということになります。これならプログラムできそう。


Σがピンとこない  手動でやってみる(4個)  手動でやってみる(8個)  プログラムへ

中川研HOME