【Excel】高速フーリエ変換(FFT)のマクロ(VBA)

Excelには標準でフーリエ解析の機能を備えていますが、解析用のデータを変更してもフーリエ変換の結果は自動更新してくれないので、少し使い勝手の悪い物になっています。

 

そこで、エクセルのセルの部分にSUMAVERAGE のような関数と同じように動くマクロ(ユーザー定義関数)で作成したフーリエ変換の関数(Fourier)を作成しました。

ユーザー定義関数で作成しているため、解析用のデータを変更すると、フーリエ変換の結果も自動で変更されます。

 

 

ファイルのダウンロードはこちら↓より

fourier_transform_rev3.zip

(Excel2016推奨、それ以前だとファイルを開いた直後はフーリエ変換の値が0になるようです。)

 

使用方法

このファイルはマクロを使用しているため、ファイルを起動するとセキュリティ警告が表示さている場合は、コンテンツの有効化をクリックしてください。

 

まず、フーリエ変換の結果の出力先のセルを縦方向にデータ個数と同じ分だけ選択し、

= Fourier( データのセル)

と入力し、Enterではなく、Ctrl + Shift + Enterキー を入力します。

これで、フーリエ変換の結果が複素数で表示されます。

 

複素数はいらないから、絶対値だけ欲しいという場合にはFourierAbs関数を使って下さい。(使い方は同じです。)

 

フーリエ変換の結果は標準のフーリエ解析の結果と同じになるようにしていますが、10の-15乗ぐらいの誤差が出ています。

 

フーリエ変換の結果の複素数の大きさを計算するには、Excelの標準関数の IMABS関数 で求まります。

 

同様に位相は IMARGUMENT関数 で求まります。

 

このマクロのポイント!

  • 窓関数に対応
    = Fourier( データのセル, “Hamming”)
    のように入力することで、入力データに対して窓関数を通します。
    対応している窓関数の名前は
    ハミング Hamming
    ハニング Hanning
    ブラックマン Blackman

    の3つ。

  • FFT/DFTの自動切換え
    マクロ処理内部で、フーリエ変換するデータ個数が2のN乗個の場合はFFT、それ以外の場合はDFTとなり、データの個数が2のN乗個の制限はありません。

 

逆フーリエ変換を追加

2018.6.19追記

逆フーリエ変換に対応したIFourier関数を追加しました。

逆フーリエ変換の計算は別シートの逆フーリエ変換のシートを参照ください。

 

使用方法については、普通のフーリエ変換の時と同じように

= IFourier( データのセル)

と入力し、Enterではなく、Ctrl + Shift + Enterキー を入力します。

ただし、逆フーリエ変換なので、データのセルの部分は、基本的に複素数となります。

 

逆フーリエ変換の結果はこちら↓です。

 

上の絵を見ても分かるように、虚数成分の10の-15乗程度の誤差が入ってしまっているので、複素数の実部だけを取得するIMREAL関数で実部を取得すると、ほぼフーリエ変換の時に用いたデータに戻っていることが確認できるかと思います。

 

 

フーリエ変換へ戻る

【Excel】分析ツールの表示

Excelでフーリエ変換やヒストグラムを表示するには分析ツールというのを用いるのですが、エクセルのデフォルト設定では、この分析ツールが表示されていないので、その表示方法です。

 

ファイルを選択

 

オプションを選択

 

アドインを選択

 

設定を選択

 

分析ツールにチェックを入れます。

 

すると、データタブにデータ分析が表示されます。

 

データ分析をクリックすると、各種データ分析ツールが表示されます。

 

これまで、フーリエ変換やヒストグラムぐらいしか使ったことがなかったのですが、分散分析や共分散なども興味を惹かれます。

 

Word/Excelへ戻る

【Excel】棒グラフの横軸の目盛を0始まりにする

エクセルの棒グラフで横軸の目盛を1始りでなく、0始まりにするお話

 

縦軸の目盛は軸のオプションで最小値、最大値を調整できますが、

 

 

横軸に関しては、この最大値、最小値の設定が無い!!

 

 

ということで、この軸の目盛を0始まりにする方法ですが、目盛の部分をマウスの右ボタンでクリックし、データ選択とクリックします。

 

 

次に横(項目)軸ラベルの部分の編集ボタンをクリックします。

 

 

そして、軸のラベルにするセルの範囲を選択します。

(0始まりにする場合は、0から始まるラベルを書いておく必要があります。)

 

 

すると、軸ラベルが0、1、2・・・と修正されます。

 

 

この状態で、OKボタンを押すと、目的の0始まりの軸となってくれます。

 

 

結局、横の目盛は目盛ではなく、ラベルなんですね。

この0始まりの棒グラフを使って、画像輝度値のヒストグラムを書きたかった訳で。。。

 

Excelの記事一覧へ戻る

【Excel】フーリエ変換

エクセルでフーリエ変換をするには、Webで検索するとほとんどの場合、分析ツールのフーリエ解析で行う方法が紹介されているかと思います。

この方法は以下のページを参照ください。

【Excel】フーリエ解析(FFT)

 

しかしながら、分析ツールで行うフーリエ解析では、解析対象のデータを変更しても、自動で結果を再計算しれくれない上に、Excelのフーリエ解析はFFTであるため、データ個数が2のn乗個(2,4,8,16,32,64,128・・・)という制限があります。

 

そのため、エクセルのセルの関数のみを使い、フーリエ変換(離散フーリエ変換[DFT])を行う方法を紹介します。

ただし、結論からすると処理が重いため、データ個数が多い場合はExcelのフーリエ解析(FFT)を使った方が良さそうです。

ここでは、フーリエ変換のお勉強用に使って頂ければ幸いです。

 

エクセルでフーリエ変換を行ったファイルはこちら↓

discrete_fourier_transform_rev1.zip

 

エクセルのイメージはこちら↓

 

データf(x)と書かれた下の黄色いセルの部分にデータを入力すると、フーリエ変換され、振幅スペクトルと位相が計算されます。

 

エクセルの分析ツールで行うフーリエ解析では以下の式を用いていますが、

 

ここでは、フーリエ変換の結果の値に意味合いを持つ下記の式を用いています。

 

 

離散フーリエ変換についてはこちらのページでも紹介していますが、エクセルでフーリエ変換を行うために必要な情報をまとめておきます。

 

まず、フーリエ変換を行うと、各周波数ごとに複素数の成分として変換されます。

 

複素数zは実数成分をa、虚数成分をb、実数Aとすると

      z = a + bi = Ae

 

のように表示され、図示すると下図のようになります。

 

  a = A x Cos θ

  b = A x Sin θ

 

複素数の絶対値は

 

位相(複素数では偏角といいますが)は

 

となります。

このへんの感覚は、ベクトルの成分が(a, b)、ベクトルの長さがA、傾きがθの場合と同じなので、覚えやすいかと思います。

 

 

 エクセルで用いる複素数の関数

エクセルで複素数の計算に用いる関数は関数名の先頭にIMが付く関数を用いますが、今回用いた関数を紹介します。

 

■複素数 COMPLEX関数

実部をa、虚部をbとする複素数は  COMPLEX(a, b)

 

■複素数の絶対値 IMABS関数

複素数(a + bi)の絶対値 IMABS(“a + bi”)

結果は√(a2 + b2) となります。

 

■複素数の実部の取得 IMREAL関数

複素数(a + bi)の実部は  IMREAL(“a + bi”) = a

 

■複素数の虚部の取得 IMAGINARY関数

複素数(a + bi)の虚部は  IMAGINARY(“a + bi”) = b

 

■複素数の偏角の取得 IMARGUMENT関数

複素数(a + bi)の偏角は  IMARGUMENT(“a + bi”)  で-π~πの範囲でラジアン単位で取得

 

■複素数のべき乗 IMEXP関数

zが複素数のべき乗は IMEXP(z)

(例)ei π/3 を計算するには

IMEXP(COMPLEX(0, PI() / 3))

= 0.866 + 0.5i

となります。

 

■複素数の足し算(合計を含む) IMSUM関数

複素数xと複素数yの足し算(片方が実数の場合も含む)は IMSUM(x, y)

(例)

セルA1の複素数とセルA2の足し算は IMSUM(A1, A2)

実数の合計の関数(SUM関数)と同様にセルA1~A10を合計するには IMSUM(A1:A10)となります。

 

■複素数の掛け算 IMPRODUCT関数

複素数xと複素数yの掛け算(片方が実数の場合も含む)は IMPRODUCT(x, y)

 

■複素数の割り算 IMDIV関数

複素数xと複素数yの掛け算(片方が実数の場合も含む)は IMDIV(x, y)

 

 

フーリエ変換の意味合いを読み解く

今回、フーリエ変換の式に

の式を用いたのには、フーリエ変換後の値に意味合いを持つため、あえてこの式を用いました。

 

今回、用いたデータはこちらのページ(http://www.data.jma.go.jp/gmd/risk/obsdl/)より2015年と2016年の東京の2年分(731日分)のデータを用いました。

 

2年分の気温データのため、731個のデータの周波数は2になることを期待しています。

 

そこで、あらためてエクセルのシートを眺めてみると、振幅ペクトルは周波数tが0の時の次に最大になるのはt=2の時で周波数2の成分が大きい事がわかります。

 

このことは、731 / 2 = 365.5日 が1周期分のデータ個数となります。

 

t=0 の時の振幅ペクトルの値(16.4625171)は全体の値の平均値を示しています。

 

t=2 の時の振幅スペクトルの値(5.12963)の2倍の値(10.25926)が周波数が2の時の振幅を示しています。

※実際にはt=2と複素共役と呼ばれる虚数成分がt=2のときの負になるt=729の時の2つの波形を足し合わせることで、虚数成分が打ち消しあい、実数部分の振幅が2倍となります。

 

つまり、今回の2年間の気温データは 平均16.4625171 ± 10.25926 ℃ の傾向で気温変化した事がわかります。

 

t=2 の時の位相(155.3578°)の負の値(-155.3578°)の位置にピークの位置が来ることを意味しています。

 

ここまでわかると、2年間の気温データの変化の主な成分はCOS波形で表現する事ができ

 

16.4625171 + 10.25926 × Cos(x / 365.5 × 360° +155.3578°)

 

となります。

この式を気温データに重ね合わせると↓

 

 

見事、気温変化の傾向がつかめました!!

 

(追記)

フーリエ変換のマクロ処理版のページも作成しました。

合わせてご参照頂けたら幸いです。

【Excel】高速フーリエ変換(FFT)のマクロ(VBA)

 

フーリエ変換へ戻る

【Word/Excel】図形内に文字を挿入する

WordやExcelで下図のように図形の内側に文字を挿入する方法の紹介です。

 

まず、メニューの挿入→図形と選択し、四角形や丸などの図形を選択し、本文中に配置します。

 

 

古いWordやExcelでは、図形を選択し、マウスの右ボタンでテキストの追加を選択する必要がありました。

 

しかし、最近のWord/Excel(少なくともOffice2010以降)では、マウスの右ボタンでメニューを選択すつ必要はなく、まず、図形を選択されている状態にします。

この状態のままで、文字をキー入力すると、図形の中央に文字が挿入されます。

 

このように図形に文字列を挿入できるのは、閉じた図形であれば、だいたい大丈夫なようです。

逆に線などには文字を追加する事ができません。

 

Word/Excelへ戻る

【Excel】絶対参照、相対参照の切替

エクセルでセルをコピーしても参照先が移動しないようにする絶対参照という参照方法については、以前【Excel】固定セルの参照(絶対参照)のページで紹介したように、参照したい行(数字)または列(アルファ別途)の名前の頭にを付けると、セルをコピーしても参照位置が変わらない絶対参照の状態になりますが、この絶対参照にすには、セルを編集状態にして、セルの名前の頭をカーソルで選択して、 Shit+4 をキー入力して $ を付けますが、カーソルで選択する時など、狙いを定めた微妙な操作となります。

 

これをキー入力で簡単に操作するには、セルの名前を選択し、F4キーを入力する事で、そのセルの名前が絶対参照へと切り替わります。

 

具体的には、編集するセルをダブルクリックもしくはF2キーを入力してセルを編集状態にします。

 

この時、絶対参照/相対参照を切替えたいセルの名前の部分にカーソルが隣接するように、カーソルを移動させます。

 

カーソルの位置は、以下の3通り(後、中央、頭)

 

上記の状態でいづれもC1の名前を選択している状態となります。

 

絶対参照/相対参照を切替えたいセルの名前を選択した状態で、F4キーを入力します。

 

すると、下図のようにF4キーを入力するごとに$の位置が切り替わります。

      

 

また、2つのセルを選択した状態で、

 

F4キーを入力すると、以下のように2つとも、切替ります。

 

ただし、2つのセルとも同じ状態となります。

例えば

$B1 + C$1

のように切替える事はできません。

 

Excelへ戻る

【Excel】正規化相関

エクセルで内積ノルムの計算ができれば、正規化相関も計算できる!

と思ったら、エクセルの関数で用意されていました。

 

書式は

 

= CORREL(“配列1”, “配列2”)

 

となります。

 

 

この正規化相関の計算式はテンプレートマッチングでもおなじみの

 

 

という式になります。

 

こんな式まで用意されているのは、ちょっとしたアルゴリズムの検証などに便利です。

 

← Excelへ戻る

【Excel】ベクトルのノルムの計算

ベクトルのノルム(大きさ)の計算のおさらいですが、ベクトルを

 

とすると、ノルムは

 

となります。

これをエクセルで計算するには?と探してみるものの、直接的なエクセルの関数は無さそうでした。

そこで、前回内積の計算を紹介しましたが、同じベクトルの内積を計算してルート(SQRT()関数)を使うと、とりあえずできますが、さらに探すと SUMSQ なる関数が用意されていました。

 

このSUMSQ関数は、各要素を2乗して合計を計算する関数ですが、これで、ノルムのルートの中身が計算できます。

 

ということで、ベクトルのノルムの計算は

 

= SQRT(SUMSQ(“セルの範囲”))

 

として

 

のように、SQRTSUMSQ の2つの関数の組み合わせで、計算する事ができます。

 

← Excelへ戻る

【Excel】内積の計算

エクセルで内積の計算をするには SUMPRODUCT 関数を用います。

 

 

 

SUMPRODUCT関数を検索すると、品物の単価と個数を掛け合わせて合計金額を計算する例が多いのですが、各配列の要素を掛け合わせた合計の計算は内積そのもので、個人的には、この内積の計算の出番が多そうです。

 

← Excelへ戻る

【Word/Excel】曲線をきれいに描く方法

カテゴリー:Word/Excel


WordやExcelで例えばこんな↓曲線を書こうを思って、書いてみたら、

こんな感じ↓にしか書けない!

という事は無いでしょうか?

私は最近まで、そうでした。

 

これを綺麗に書くためのポイントは頂点の編集を用います。

 

書き方は、まずは挿入図形曲線を選択し、ざっくりと書きます。

 

次に描いた線上でマウスの右ボタンをクリックし、メニューを表示させたら頂点の編集をクリックします。

 

すると、曲線を構成している部分が黒い四角で表示されます。

 

 

この黒い四角の部分をさらにクリックすると、曲線の接線が表示されます。

 

 

この接線の白い四角の部分をクリックして移動する事で、Rの向き、大きさを調整できます。

白い四角が黒い四角よりも遠いと大きなRとなり、近いと小さなRとなります。

 

   

 

さらに黒い四角部分をマウスの右ボタンでクリックすると、下図のようなメニューが表示されます。

 

 

すると、デフォルトで頂点を中心にスムージングするにチェックが入っていますが、頂点で線分を伸ばすにチェックを入れると

 

 

黒い四角に対して、白い四角の部分までの距離が、それぞれ調整できるようになり、それぞれRを調整できるようになります。

さらに頂点を基準にするにチェックを入れると、頂点(黒い四角の部分)で折れ線のようになります。

 

 

これらを駆使すると、最初にお見せしたように、思い通りの曲線を描く事ができるようになります。

 

コメントへの補足

作図→曲線を使ってRの頂点付近をクリックして、後から頂点の編集で理想の曲線に近づけます。

下図の黒い点の位置がクリックした位置になります。

 

Word/Excelの記事一覧へ戻る

最小二乗法をExcelで解く

エクセルではグラフの機能で近似曲線の追加というのはありますが、任意の式で近似したい場合や、近似式の係数を取得したい場合にはエクセルの近似曲線の機能だけでは物足りない場合があります。
そんなときにエクセルでまじめに最小二乗法で解く方法を紹介します。

 

まずは、最小二乗法を解くとき、逆行列を用いるところまではご理解願います。
詳しくはこちらで紹介しています。

 

最小二乗法
一般式による最小二乗法

 

また、Excelで行列を計算する方法はこちらを参照下さい。

 

行列の積、逆行列、転置行列の計算

 

以下では円の最小二乗法を例にとって説明をしたいと思います。

 

円の最小二乗法を解くときの円の一般式を

 

X2 + Y2 + AX + BY + C = 0

 

としたときの行列の式は

 

 

です。
まず、行列の式に使われているの値を求めます。
はエクセル関数の「SUM」関数を用いればよいので、簡単に求まります。

 

 

まず、行列の式の各値を各セルに書いておきます。
次に逆行列を求めるのですが、エクセル関数に「MINVERSE」というのがあります。

 

逆行列を表示したい複数のセル(下記の例では3×3のセル)を選択します。
次に

 

=MINVERSE(逆行列を求める複数のセル)

 

と入力します。ここでは文字を入力するだけでEnterキーは押さないこと

 

 

 

で、次が最大のポイント!
通常ではEnterキーを押したいところですが、行列の計算では

 

Ctrlキー  + Shiftキー + Enterキー

 

を同時に押します。
これで、逆行列の値が求まります。

 

 

あとは行列の積が計算できれば、求めたいA,B,Cの値を求めることができるのですが、
行列の積の計算にはエクセル関数の「MMULT」という関数を用います。

 

逆行列を計算したときと同様に行列の積の結果を表示したいセル複数のセルを選択し、

 

=MMULT(行列1,行列2)

 

を入力します。ここでも最後はEnterキーだけではなく

 

Ctrlキー  + Shiftキー + Enterキー

 

を押すので注意して下さい。

 

 

これで求めたかった未知数A,B,Cが求まります。

 

 

今回は円の近似なので、A,B,Cの値を用いで円の中心座標(a,b)、円の半径rを求めるには

 

a = -A / 2
b = -B / 2
r = SQRT(a2 + b2 – C)

 

なので、

 

 

となり、円の近似式を求めることができます。

 

このエクセルによる円の最小二乗法のファイルはこちら↓

LSM_Circle.xls

 

また、一般的なn次式による最小二乗法を解いたのファイルはこちら↓

n_LeastSquare.xls

 

使える数学へ戻る

 

【Excel】行列の積、逆行列、転置行列の計算

エクセルで行列の計算をするときの最大のポイントは、計算式を入力後

 

を同時に押すことです。

 

エクセルのヘルプを見ても、この事はどこに書いてあるのか?分からないので、ちょっとハマりやすいかもしれません。(私ははまりました。)

 

行列の積[MMULT(行列1,行列2)]

まず、行列の積の計算を行う行列を入力しておきます。
次に行列の積の計算結果を表示するセルを選択します。

 

 

セルを選択した状態で、行列の積の計算式

 

= MMULT(行列1, 行列2)

 

を入力します。

 

 

ここで、EnterではなくCtrlキーとShiftキーとEnterキーを同時に押します。

 

 

逆行列[MINVERSE(行列)]

逆行列に関しても同様に

 

=MINVERSE(行列)

 

と入力します。

 

 

ここで、EnterではなくCtrlキーとShiftキーとEnterキーを同時に押します。

 

 

転置行列[TRANSPOSE(行列)]

転置行列の計算式は

 

=TRANSPOSE(行列)

 

となります。

 

 

クドいですが、EnterではなくCtrlキーとShiftキーとEnterキーを同時に押します。

 

 

この行列の積、逆行列、転置行列がエクセルで解けると何が良いか?というと、

 

●連立方程式
●座標の回転
●最小二乗法
●擬似逆行列(一般逆行列)

 

などが解けるようになります。
これらを知らないと、いちいちプログラムを組んで計算の検証をしたりもしますが、
エクセルで出来るようになると、とっても簡単、お手軽です。

【Excel】任意関数のグラフの描画

これまで紹介してきたテクニックを使って、正規分布の確率密度関数を例にとって、任意関数のグラフの描画方法を紹介します。

 

確率密度関数は以下の式です。

 

この式のグラフを書くには、まず、Xの値を記入します。
この方法は連番の入力でも紹介しましたが、A7のセルに初期値の-6A8のセルに次の値の-5.5を入力し、マウス操作によりA列のセルに-6~6までの連番を記入しています。

次にf(x)の計算式にはB7のセルに

=1/(SQRT(2*PI())*B$5)*EXP(-($A7^2/2/B$5^2))

と入力します。
このB7のセルをコピーして他のf(x)に相当する部分に貼り付けても、X座標およびσの値の参照先が移動しないようにアルファベット部分および数字部分の頭にを付けてから、コピーおよび貼り付けをします。
なぜを付けるのか?については固定セルの参照(絶対参照)のページを参考にして下さい。

 

これで、f(x)の値は全て計算できるので、あとはキー操作を駆使してグラフの描画範囲を選択しグラフの散布図を用いてグラフ表示します。

 

ファイルの実体はこちら  gauss.xls

【Excel】固定セルの参照(絶対参照)

エクセルのセルに、他のセルを参照した式を他のセルにコピーすると、数式は行方向、列方向の位置関係を保ったまま、数式がコピーされます。この事は相対参照というのですが、エクセルの初期状態ではこの相対参照となっています。

 

しかし、何かしらのレートなどを参照したい場合は、セルの式をコピーしても常に同じセルを参照したい場合があります。

 

この常に同じセルを参照する方法を絶対参照といい、この絶対参照の方法を工数の見積表の作成を例にとって紹介します。

 

結論からすると、固定したいセルの名前の頭に

$A$1、$A1、A$1

などと$を付ければいいのですが、

列方向を固定したい場合はアルファベットの頭にを、
行方向を固定したい場合は数字の頭に

を付けます。

 

以下、具体例です。

 

上図のように工数の見積表を作成する場合は、小計のセルには全て工数×工数単価の値を
入力しますが、最初にC4のセルに工数×工数単価の計算式「=B4*C1」を入力しC4のセルを
コピーして下の小計欄に全て貼り付けると下図のようになってしまいます。

 

 

これはエクセルではデフォルトで相対的な位置のセルを参照してしまう(今回の例では常に3つ上のセルを参照)ためで、この参照方法を相対参照といいます。
実際の計算式は下図のようになっています。

 

 

しかし、実際にはC1~C8のセルは全てC1をしたいので、C4のセルをコピーして他の小計のセルに貼り付けて、常にC1のセルを参照するようにセルの名前(B4C1など)のアルファベット部分か
数字部分の変えたくない方の頭に$をつけておきます。
今回の例では数字部分を変えたくないので、C$1とします。
ちなみに、アルファベット部分、数字部分両方を固定するのが絶対参照、どちらか一方だけを
固定するのが、複合参照というそうです。

 

 

この状態で、C4のセルをコピーして、他の小計のセルに貼り付けると、目的どおりに工数単価は
固定セル(C1)を参照することが出来ます。

 

 

実際の計算式は下図のようになってくれています。

 

 

この方法を知る前は、すべてのセルに手入力で計算式を入れてました...

 

Excelへ戻る

【Excel】連番の入力

エクセルで1、2、3・・・と連番を入力する場合に簡単に入力する方法を紹介します。

 

 

まず、始めに初期値次の値の順でセルに値を入力します。

 

次にこの2つのセルを選択し、右下に表示される黒四角(■)の部分にマウスを合わせます。
するとマウスのアイコンが十字 (+) に変わるので、この状態でマウスをクリックしたまま
下の方にマウスを移動します。

 

 

すると下図のように連番を入力することが出来ます。

 

 

他にも下図のような初期値次の値を入力すると

 

 

このように↓なります。

 

 

この規則性はエクセルのツール⇒オプションユーザー設定リストのタブで指定できます。