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
© Copyright 2024 Paperzz