1分で試すフーリエ変換(FFT)

 

はじめに、2つの正弦波(100Hz と 150Hz)を合成します(上グラフ)。 次に、この合成された波形をフーリエ変換して、周波数成分を可視化します(下グラフ)。

このように、100Hz と 150Hz にピークがあることが分かりました。 それでは早速、実習に取り掛かりましょう。 使用する環境は次の3つから選んでください。

R による実習

R による実習では、上に掲載した図のような結果が得られます。

$ R
R version 2.8.0 (2008-10-20)
 
> n = 0:255                                           # 256個のデータ
> t = n * 0.001                                       # 横軸=t(s,秒)
> f = n * 1 / (256 * 0.001)                           # 横軸=f(Hz,周波数)
> 
> wave = sin(2*pi*100*t) + sin(2*pi*150*t)            # 2つの正弦波を合成
> spec = abs(fft(wave))                               # フーリエ変換(FFT)
> 
> par(bg="grey95", mar=c(4,4,1,1), mfrow=c(2,1))      # 上下2分割表示、他
> plot(t, wave, type="l", col="darkgreen")            # 合成波を描画
> plot(f, spec, type="l", col="navy", xlim=c(0,250))  # スペクトルを描画
>
> q()
$ 

Octave による実習

Octave による実習では、下図のような結果が得られます。

$ octave
GNU Octave, version 3.0.1

octave:1> n = 0:255;                                # 256個のデータ
octave:2> t = n * 0.001;                            # 横軸=t(s,秒)
octave:3> f = n * 1 / (256 * 0.001);                # 横軸=f(Hz,周波数)
octave:4> 
octave:4> wave = sin(2*pi*100*t) + sin(2*pi*150*t); # 2つの正弦波を合成
octave:5> spec = abs(fft(wave));                    # フーリエ変換(FFT)
octave:6> 
octave:6> subplot(2,1,1);                           # 上側に
octave:7> plot(t, wave, "3");                       #   合成波を描画
octave:8> subplot(2,1,2);                           # 下側に
octave:9> plot(f, spec, "1");                       #   スペクトルを描画
octave:10> axis([0 250]);                           #   但し、最大250Hz
octave:11> 
octave:11> quit
$ 

Ruby による実習

Ruby による実習では、下図のような結果が得られます。

        ↓ irb の別名として、irbr を用意しておく
$ alias irbr='irb --simple-prompt -rgsl -rpgplot -rnumru/fftw3'

$ irbr
>> include NMath
>> include Pgplot
>> include NumRu
>> 
?> n = NArray[0..255].to_f                   # 256個のデータ
>> t = n * 0.001                             # 横軸=t(s,秒)
>> f = n * 1 / (256 * 0.001)                 # 横軸=f(Hz,周波数)
>> 
?> wave = sin(2*PI*100*t) + sin(2*PI*150*t)  # 2つの正弦波を合成
>> spec = FFTW3.fft(wave, -1).abs            # フーリエ変換(FFT)
>> 
?> pgbeg "/xwin", 1, 2                       # 上下2分割表示
>> pgpap 4.3, 1.0                            # 表示面の大きさを設定
>> pgsci 1; pgenv  0, 0.25, -2, 2            # ↓ X=0〜0.25, Y=-2〜2
>> pgsci 3; pgline t, wave                   # 合成波を描画
>> pgsci 1; pgenv  0, 250, 0, 100            # ↓ X=0〜250, Y=0〜100
>> pgsci 4; pgline f, spec                   # スペクトルを描画
>> pgend
>> 
?> exit
$ 

覚え書き

  • フーリエ変換(FFT)の結果は複素数になります。 上の実習では、これを abs 関数を使用して絶対値に変換しています。 しかし、 FFT(Octave) によると、厳密にはパワースペクトラム密度(PSD)を計算する必要があります。 実際のところ、 フーリエ変換(Octave) にあるように計算してみると、鋭く立ち上がるスペクトルが表示されました。

更新履歴

日付 内容
2009-01-10 追加 Ruby による実習
2008-11-30 追加 Octave による実習
2008-11-16 初版 R による実習


フーリエ」で検索 (Amazon)