エクセルで FFT 乗算を体験してみよう

http://mak-oto.cocolog-nifty.com/blog/
エクセルで FFT 乗算を体験してみよう
※事前にエクセルに分析ツールを読み込んでください。
※以下の説明はエクセル 2007 で行なっています。
例として、√2≒1.4142136 を2乗してみましょう。
1.A 列、B 列にそれぞれ右のように入力します
下から上に向けて√2≒1.4142136 の並びです。
小数点は指定しませんが、16 行が整数部、15 行より上
が小数部です。
このあと、A 列と B 列をフーリエ変換して、乗算を計算し
ます。
2.分析ツールからフーリエ解析を選びます。
(エクセルの「フーリエ解析」を本説明では「フーリエ変換」と表現します)
1
http://mak-oto.cocolog-nifty.com/blog/
3.A 列のフーリエ変換値を C 列に作成します。
入力元、出力オプションを下図のように指定します。
C 列に下図のように、フーリエ変換値が表示されます。
フーリエ変換値は複素数表記です。
2
http://mak-oto.cocolog-nifty.com/blog/
4.同様に B 列のフーリエ変換値を D 列に求めます。
下図では C 列の表示に D 列がかぶっています。
フーリエ変換値の値は、ここでは特に重要視しません。ちなみに、A 列=B 列なので、フーリエ変換値も
C 列=D 列になっています。
3
http://mak-oto.cocolog-nifty.com/blog/
5.C 列と D 列の複素数乗算した結果を E 列に求めます。
複素数乗算はエクセルの IMPRODUCT 関数を使います。
下図のように、セル E1 に「=IMPRODUCT(C1:D1)」と入力して、その式をセル E2~E16 へコピーしま
す。
セル E1 に関数を入力
関数を確定
セル E2~E16 にコピー
4
http://mak-oto.cocolog-nifty.com/blog/
6.E 列を逆フーリエ変換して、その結果を F 列に求めます。
下図のように逆変換のチェックを入れてください。
一般的に逆変換の結果も複素数なのですが、この場合はたまたま実部だけになりました。
もし、結果が複素数になったら実部だけを抜き出します(9 ページ参照)。
5
http://mak-oto.cocolog-nifty.com/blog/
7.F 列の結果を小数点以下四捨五入します。結果を G 列に求めます。
G 列に丸め関数「=ROUND(F1,1)」と入力して、その式を G2~G16 にコピーします。
6
http://mak-oto.cocolog-nifty.com/blog/
8.G 列の結果を正規化します。
モトの値(A 列、B 列)が1セル1桁なので、結果も1セル1桁にしないといけません。このように桁数を合わ
せる操作を正規化といいます。
十の位は次のセル(下のセル:位の上位)への繰上りになります。下図の I 列に記述した操作を行なうと、H
列のようになります。(H 列は手入力しました)
H 列が A 列×B 列の結果です。
モトの値同様に下からの並びです。すなわち「02.00000010642496」です。
モトの値が(整数部を含め)8桁なので、掛けた結果は 16 桁になります。
モトの値の整数部は1桁なので、掛けた結果の整数部は2桁になります。
モトの値の整数部が n 桁だったら、掛けた結果の整数部は 2n 桁になります。ただし、FFT 乗算の操作
自体には小数点の位置は関係ないので、使用者が小数点位置を把握して操作する必要があります。
モトの値が小数点以下7位までなので、掛けた結果も小数点以下7位以下に誤差が出ています。
Windows 付属の電卓で同じ計算をすると、同じ結果が得られます。
「* =」と操作
→
7
http://mak-oto.cocolog-nifty.com/blog/
結果を式で求める
先ほどは H 列を手入力しましたが、式で求めたい場合は下図の関数を入れます。
セル J1、K1、L1 を入れる。セル J2、K2、L2 を入れて、それぞれの列を 3~16 行にコピーします。
結果は次のようになります
L 列に H 列と同じ結果が得られます。
8
http://mak-oto.cocolog-nifty.com/blog/
1セルの桁数を増やす
今までの説明では1セル=1桁で求めましたが、1セルの桁数を増やすこともできます。
√2≒1.41421 35623 73095 04880 16887 24209 69807 856…なので、
1セル=5桁で計算してみましょう。
整数部(セル A16、B16)は1桁、小数部を5桁区切りで設定します。
セル A9・B9 の値はその下位の値を四捨五入しています。
今までと同様に、
A 列のフーリエ変換を C 列に
B 列のフーリエ変換を D 列に
C 列・D 列の複素数乗算を E 列に
E 列の逆フーリエ変換を F 列に
F 列の結果は複素数になったので、ここから操作が変わります。
F 列の実部を G 列に求める(IMREAL 関数を使って、「=IMREAL(F1)」と入力))
G 列の小数以下を四捨五入した結果を H 列に
I 列・J 列で正規化して、結果を K 列に求める。
正規化するときの位取りに注意してください。先ほどは 10 で割ったり、10 を掛けたりしましたが、こんど
は 100000 で割ったり掛けたりします。
整数部が2行になるのは今までと同じです。
小数部は1セル5桁なので、「0」は正確には「00000」を意味します。従って、答えを正しく表記すると
2.00000 00000 00000 00000 00000 00000 00000 40455 78864 97118 90284 04873 12475 56864
という結果になります。モトの桁数と同じレベルまで正しく求められました。
※桁数を増やす時の注意
行数(配列数)が多くなるとフーリエ変換の過程で極端に大きな数と小さな数を扱うことになり、誤差(桁落
ち)が生じます。エクセルの場合、数十行なら 5~6 桁使えますが、数百~数千行使うと 4~3 桁程度になりそ
うです。
9
http://mak-oto.cocolog-nifty.com/blog/
FFT 乗算の注意点
配列数は2のべき乗で行なう。
モトの数は行(配列)の半分に値を設定する(今までの説明の A9~A16 のこと)
残りの行(配列)には 0 を入れる(今までの説明の A1~A8 のこと)。
乗算した結果は全行(配列)に求められるが、有効桁数はモトの数と同じ。
小数点位置は使用者側で管理する。
整数部、小数部ともモトの数の2倍の行(配列)になるので注意する。
配列の大きさと1配列の桁数に注意する。
モトの値によって、FFT 乗算した結果が合っていたり間違ってたりした場合、桁落ちが考えられます。
また、エクセルのフーリエ解析ではモトの数は実部だけでしたが、VB や C#、C++で FFT 乗算を行なう場合、
一般的にモトの数も複素数で表現します。この場合、虚数部は 0 とします。
10