DFTとFFT
これからフーリエ変換について学ぶ。
サンプリングされた信号のフーリエ変換はDFT(離散フーリエ変換)と呼ばれ、以下の式で計算することができる。
変換
[式1]
逆変換
[式2]
変換->逆変換で元に戻る(重要)
フーリエ変換をして得た数列を、再度逆フーリエ変換すると、元の信号に戻る。
もしこの計算の結果、x(n)=y(n)になれば、デジタルフーリエ変換し、逆変換すると元の信号に戻ることになる。
以下では scilabを使って、このようにフーリエ変換した結果を再度逆フーリエ変換すると、元の信号に戻ることを確認しよう。
scilabによるフーリエ変換、フーリエ逆変換
以下、フーリエ変換の計算を実際に行って、どのような信号がどのように変換されるかを確認してみる。
ここでは scilab という言語を使う。scilabは INRIAが開発した数値計算のソフトウエアで下記webサイトからダウンロードして無料で利用できる。(利用登録は必要)。文法等はRやMATLABとよく似ている。
X(k)のかわりに xxと書くことにする。
フーリエ変換 フーリエ逆変換 xx=fft(x,-1); y=fft(x,1)
注意: x,xx, yの添え字は1から始まるので、数式とは添え字が1ずれる。(重要)
数式 scilab x(1) x(2) ⁝ ⁝ x(N)
数式 scilab xx(1) xx(2) ⁝ ⁝ xx(N)
数式 scilab y(1) y(2) ⁝ ⁝ 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)
逆フーリエ変換の誤差は、純粋に計算誤差だけだ。計算精度を上げれば、逆フーリエ変換の結果を限りなく元の値に近づけることができる。