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

シェアする

  • このエントリーをはてなブックマークに追加
最近の記事
  • 8/22 【Neural Network Console】CPU/GPU処理の設定切替
  • 8/21 【Neural Network Console】Learning Rate(学習率)の設定
  • 8/20 ソニーの無償AIソフト Neural Network Consoleの入手ダウンロード、インストール
  • 8/20 Deep Learning
  • 8/20
  • 8/19 古いバージョンのVisual Studio Community/Expressの入手ダウンロード
  • 8/19 CUDAの入手、ダウンロード、インストール方法
  • 8/17 【C#.NET】マイクロソフト仕様のアフィン変換
  • 8/5 【C#】ファイルを開くダイアログボックスの表示
  • 8/2 キャノンプリンターのCDトレイはどこ?!
  • 7/6 【参考書籍】画像処理・機械学習プログラミング OpenCV 3対応
  • 6/20 【Python,matplotlib】動くグラフをAnimationGifに保存する方法
  • 6/17 シグモイド関数の微分
  • 6/15 シグモイド関数
  • 6/13 合成関数の微分
  • 6/12 WordPressで数式エディタ風に数式を入力したい
  • 6/11 PythonをVisual Studioでインストールする方法
  • 6/9 【Python】OpenCVをAnacondaでインストール(Windows編)
  • 6/6 【Python】Anacondaで複数バージョンの環境切り替え
  • 6/6 画像センシング展2017に出展します。
  • 6/1 【Office365】Web版Outlookのフォントサイズ変更
  • 6/1 【Anaconda】モジュールのアップデートでエラー発生
  • 6/1 【Anaconda】コマンドリストの表示
  • 5/29 Windows10パソコン購入
  • 5/24 Anacondaのアンインストール
  • 5/24 【Jupyter Notebook】新規プログラムの作成
  • 5/23 【Python】開発環境の構築
  • 5/23 Pythonはじめました
  • 4/6 【Office365】Web版Outlookのスレッド表示を解除する方法
  • 4/5 【Excel】フーリエ解析(FFT)
  • 3/20 Canny edge detection
  • 3/20 【Excel2016】分析ツールの表示
  • 3/5 【Visual Studio】黒い背景色を白に変更する方法
  • 2/8 【Windows10】拡張モニタに表示されたウィンドウを元に戻す
  • 2/7 複素数の計算
  • 1/18 【Excel】棒グラフの横軸の目盛を0始まりにする
  • 1/16 【Excel】フーリエ変換
  • 1/6 【OpenCV】疑似カラー(カラーマップ)
  • 11/8 【Visual Studio】検索結果のウィンドウ表示
  • 11/3 ニコン 一眼レフカメラ D5500レビュー
  • 10/26 カラーカメラはモノクロカメラを兼ねない
  • 9/6 (Free Soft)Animation GIF Builder
  • 8/30 【C#】タブの無いTabControlっぽいものを作る
  • 8/29 【OpenCvSharp】サンプルプログラムの公開
  • 8/28 【PowerPoint】部分的にカラーにする(セレクトカラー処理)
  • 8/27 【C#】引数の値渡し、参照渡し(ref, out)
  • 8/26 【Word/Excel】図形内に文字を挿入する
  • 8/25 【C#】NumericUpDownコントロール
  • 8/24 ニコン D3400 VS D5500 仕様比較
  • 8/22 【C#】MDIフォームにリサイズ可能なPanelを設置する

  • 以前、エクセルの分析ツールを使わずにエクセルの関数だけで、フーリエ変換を行いましたが、処理速度を遅く、フーリエ変換をするにはあまり実用的ではありませんでした。

    【Excel】フーリエ変換

    そのため、今回は分析ツールを使ったフーリエ変換(FFT)を紹介します。

    そもそも、フーリエ変換って何??

    という場合は、下記ページを参照して頂けると幸いです。

    フーリエ変換

    ざっくり言うと、フーリエ変換は信号の中から各周波数ごとの大きさ位相を求める変換です。

    この”信号”と言っている部分が音や画像のような測定データの場合、この”信号(データ)”に対してフーリエ変換を行うのが離散フーリエ変換となります。

    しかし、離散フーリエ変換は処理速度が遅いので、離散フーリエ変換を行うんだけど、データ個数を2のn乗(2, 4, 8, 16, 32・・・)個に制限することで、高速に処理することができる処理アルゴリズムが高速フーリエ変換[Fast Fourier Transform(FFT)]となります。

    ここで、フーリエ変換には処理速度や逆変換を考慮したときに、何を優先させるか?でいくつかの公式があるのですが、エクセルでは下記の真ん中の式が用いられています。

    Excel フーリエ変換 FFT

    このエクセルで用いられている式はフーリエ変換後の値に意味合いを持たないので、エクセルでフーリエ変換を行い、その結果を1/Nする(データの個数で割る)ところまで紹介します。

    まずは、データの準備を行います。

    エクセルではFFTなので、データの個数は2のn乗個で最大4096個まで処理が可能です。

    今回はデータの個数は32個用意しました。

    Excel フーリエ変換 FFT

    結果が分かりやすくなるように、全く振動していないデータと、2周期分のデータと4周期分のデータの3つの波形を合計したデータに対してフーリエ変換を行います。

    Excel フーリエ変換 FFT

    まず、Excelでフーリエ解析を行うには分析ツールというのを表示する必要があります。

    この分析ツールの表示方法は下記のページを参照下さい。

    分析ツールの表示

    メニューのデータ分析ツールを選択します。

    Excel フーリエ変換 FFT

    表示されたウィンドウから解析を選択しOKを押します。

    Excel フーリエ変換 FFT

    表示されたウィンドウの入力範囲の部分にある上矢印の部分をクリックします。

    Excel フーリエ変換 FFT

    この状態で、フーリエ解析を行うデータを選択(2のn乗個の最大4096個まで)し、それでよければ下矢印をクリックします。

    Excel フーリエ変換 FFT

    フーリエ解析の結果の出力先はいくつか選べるのですが、今回は新規ワークシートにするとして、OKボタンをクリックします。

    Excel フーリエ変換 FFT

    そしてこれ↓がフーリエ変換された結果です。

    Excel フーリエ変換 FFT

    3行目のセルとかは 22.6274169979696-22.6274169979695i と表示されていますが、これは複素数となります。

    この変換の部分は

    離散フーリエ変換

    を参照ください。

    このフーリエ変換の出力のままでは、見づらいので、セルの左側に0から始まる連番を追加しておきます。

    Excel フーリエ変換 FFT

    この連番と言った部分が、周波数(全部のデータに山が何個含まれるか?)になります。

    このままの複素数を用いてパワースペクトルなどを計算してもよいのですが、値そのものに意味合いが無いので、この複素数をデータの個数で割ります。

    複素数を割るにはIMDIV関数を用いるのですが、この関数は複素数を複素数で割る関数なので、データの個数(実数)で割るためには虚数成分が0の複素数として計算する必要があり、

    =IMDIV(セル, COMPLEX(32,0))

    と入力すると、複素数を割ることができます。

    Excel フーリエ変換 FFT

    COMPLEX関数は実数成分と虚数成分から複素数を作る関数で

    COMPLEX(実数、虚数)

    となります。

    複素数をデータの個数で割った状態↓

    Excel フーリエ変換 FFT

    この複素数の絶対値(パワースペクトル)を計算するにはIMABS関数を用います。

    Excel フーリエ変換 FFT

    絶対値の偏角(位相)を求めるにはIMARGUMENT関数を用いますが計算結果がラジアンなので度に変換するためにDEGREES関数でラジアンから度に変換しています。

    Excel フーリエ変換 FFT

    その結果が以下のようになります。

    Excel フーリエ変換 FFT

    複素数の絶対値の部分がフーリエ変換のパワースペクトルで複素数の偏角が波形の位相となります。

    今回はエクセルのFFTの結果をデータの個数で割りましたが、各周波数がどの程度の割合で含まれているのか?を見るだけであれば、データの個数で割る必要はありません。

    ここまでで、エクセルでフーリエ変換をする説明は終了なのですが、このフーリエ変換の結果を見ると

    周波数 結果 パワースペクトル 位相(°)
    2 0.70710678118655-0.70710678118647i -45
    4 0.433012701892219+0.25i 0.5 30
    28 0.433012701892219-0.25i 0.5 -30
    30 0.70710678118655-0.70710678118647i 1 45

    のようになっています。

    このパワースペクトルの部分をグラフにするとよく見るグラフとなります。

    Excel フーリエ変換 FFT

    ただ、もともとのフーリエ変換する前のデータは

    周波数 振幅 位相
    3 0
    2 45
    1 -30

    で作っているのに周波数2と4のパワースペクトルは振幅の半分になってるし、余計な28と30の周波数の成分が追加されています。

    フーリエ変換の結果を見ると、周波数の2と30、4と28は虚数の成分だけが正負が逆になっていますが、この関係を複素共役と言います。

    この2つの成分を足し合わせると虚数成分が打ち消しあって実数成分が2倍になり、元の成分に戻るのですが、イメージで表現するとこんな感じ↓になります。

    Excel フーリエ変換 FFT

    つまり、複素共役になっている周波数(この例では2と30、4と28)は2つで1つの周波数を表し、振幅も2つを足し合わせることで、振幅が求まります。

    そのため、パワースペクトルの値は共役になっているのか?いないのか?で実際の波形の振幅と倍、異なるので、注意が必要です。

    試しにデータの個数32個、周波数(山の数)を0から16まで変化させ、すべて振幅が1の波形を足し合わせた波形

    Excel フーリエ変換 FFT
                 ↓足し合わせる
    Excel フーリエ変換 FFT

    この波形にフーリエ変換を行いパワースペクトルを求めると、このようになります↓

    Excel フーリエ変換 FFT

    これだけを見ると、

    周波数0と16だけ周波数成分が強くて、他はその半分

    という見方をしてしまいそうですが、実際の波形は周波数が1と31、2と30、・・・、14と18が複素共役になっていることから、この2つを足し合わせた波形が実際の波形となり、振幅も倍になります。

    以上のことから、パワースペクトルのグラフを見るときは、データがN個の場合、N/2周期までを見て、

    周波数N-1の成分を1へ

    周波数N-2の成分を2へ

    周波数N-3の成分を3へ

    周波数N/2+1の成分をN/2ー1へ持っていきます。

    Excel フーリエ変換 FFT

    そのようにした、この状態↓が、各周波数の振幅と一致した状態となります。

    Excel フーリエ変換 FFT

    ちなみに、周波数0は波形の山の個数が0個、つまりデータ全体の平均値となります。

    前半の部分で、

    フーリエ変換の結果をデータの個数で割らないと値そのものに意味合いが無い

    と書きましたが、上記グラフのように、データの個数で割るとパワースペクトルの値が各周波数の値と一致するので、個人的にはデータ個数で割った方が好みです。

    ただ、フーリエ変換を行う場合は、パワースペクトルの値そのものは関係なくて、各周波数成分のどの成分が大きいのか?というような相対的な見方しかしない場合も多いので、わざわざ個数でわる必要が無い場合もあるので、実際に個数で割るか割らないかは、好みというか、使い方次第です。

    フーリエ変換へ戻る