DFTとFFT

これからフーリエ変換について学ぶ。

サンプリングされた信号のフーリエ変換はDFT(離散フーリエ変換)と呼ばれ、以下の式で計算することができる。

変換

[式1]

逆変換

[式2]

変換->逆変換で元に戻る(重要)

フーリエ変換をして得た数列を、再度逆フーリエ変換すると、元の信号に戻る。

もしこの計算の結果、x(n)=y(n)になれば、デジタルフーリエ変換し、逆変換すると元の信号に戻ることになる。

以下では scilabを使って、このようにフーリエ変換した結果を再度逆フーリエ変換すると、元の信号に戻ることを確認しよう。

scilabによるフーリエ変換、フーリエ逆変換

以下、フーリエ変換の計算を実際に行って、どのような信号がどのように変換されるかを確認してみる。

ここでは scilab という言語を使う。scilabは INRIAが開発した数値計算のソフトウエアで下記webサイトからダウンロードして無料で利用できる。(利用登録は必要)。文法等はRやMATLABとよく似ている。

http://www.scilab.org/

 

X(k)のかわりに xxと書くことにする。

フーリエ変換 フーリエ逆変換
xx=fft(x,-1); y=fft(x,1)

 

注意: x,xx, yの添え字は1から始まるので、数式とは添え字が1ずれる。(重要)

数式 scilab
x 0 x(1)
x 1 x(2)
x N - 1 x(N)
 
数式 scilab
X 0 xx(1)
X 1 xx(2)
X N - 1 xx(N)
 
数式 scilab
y 0 y(1)
y 1 y(2)
y N - 1 y(N)

 

フーリエ変換と逆フーリエ変換で完全に元の数値に戻ることの実験

まず適当な数列を作り、それをフーリエ変換して、逆フーリエ変換し、元の数列に戻るかを確認してみよう。

x 元の数列
xx フーリエ変換の結果
y xxを逆フーリエ変換した結果

とする。3行目で、x(111)~x(115)に適当な数列を入れている。

// program 6-1-1
w=101:130;
x(44100)=0;
x(111:115)=[0.7,-0.3,0.5,0.8,-0.4]';
xx=fft(x,-1);
y=fft(xx,1);

xとyが同じかどうかを確認しよう。以下は1行づつ実行する。1行目ではx, 2行目ではyがプロットされる。3行目では比較のために, yを +1 上にプロットしているが、ほぼ同じ波形が再現されていることがわかる。

// program 6-1-2
scf;
plot2d(w,x(w));
plot2d(w,y(w)+1);

以下のようにグラフを重ね、数値を比較してもも、誤差は非常に小さいことがわかる。

// program 6-1-3
scf;
plot2d(w,[x(w)';y(w)']');

 

// program 6-1-4
x(110:120)
y(110:120)

逆フーリエ変換の誤差は、純粋に計算誤差だけだ。計算精度を上げれば、逆フーリエ変換の結果を限りなく元の値に近づけることができる。