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

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

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

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

エクセル FFT マクロ

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

fourier_transform_rev2.zip

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

使用方法

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

Excel FFT マクロ

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

= Fourier( データのセル)

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

Excel FFT マクロ

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

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

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

Excel FFT マクロ

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

Excel FFT マクロ

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

Excel FFT マクロ

このマクロのポイント!

  • 窓関数に対応
    = Fourier( データのセル, “Hamming”)
    のように入力することで、入力データに対して窓関数を通します。
    対応している窓関数の名前は

    ハミング Hamming
    ハニング Hanning
    ブラックマン Blackman

    の3つ。

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

逆フーリエ変換を追加

2018.6.19追記

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

fourier_transform_rev2.zip

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

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

= IFourier( データのセル)

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

Excel 逆フーリエ変換 マクロ

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

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

Excel 逆フーリエ変換 マクロ

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

Excel 逆フーリエ変換 マクロ

フーリエ変換へ戻る

シェアお願いします

  • このエントリーをはてなブックマークに追加
関連記事

関連記事

関連記事
スポンサーリンク

コメント

  1. akira より:

    長らく放置してしまいましたが、データ数が2のn乗個でないとき(内部ではDFTを行っている時)の処理で、入力データが複素数の場合に不具合があるのを修正しました。

  2. Mejiro より:

    1点だけ修正して,2Dバンドパスフィルタに使わせていただいています。

    修正した点ですが,特にIDFTの場合,一般に引数となる数列は複素数列なので,前半だけを計算して後半に転写する仕様はマズいと思います。DFTであっても,一般には引数が実数列とは限りませんので,両者とも最大データ数まで同様に計算するべきかと。

    いずれにしても,大変便利なコードありがとうございました。

    • akira より:

      Mejiroさん、ご指摘ありがとうございます。
      確かにDFTで複素数が入力の時は都合が悪いですよね。

      折を見て、本ページも修正したいと思います。

  3. さいすけ より:

    akiraさん

    こんにちは。
    早速ご対応いただきましてありがとうございます!
    無事DLして、逆変換をおこなうことができました!!
    勝手な要望に親切に対応していただき感謝です。
    これからいろいろ使わせていただきたいと思います。

  4. さいすけ より:

    akiraさん

    身勝手なお願いにも関わらず、ご親切に対応いただきありがとうございます。
    どうぞよろしくお願いします。

    • akira より:

      さいすけさん、遅くなりましたが、ようやく逆フーリエ変換の関数 IFourierを追加しましたので、お試しください。
      逆変換の場合、入力データが複素数となり、複素共役とかについても知らないと、バンドパスフィルタみたいな事をやるのが難しい部分があるのですが、こちらのページも合わせて参照頂けたらと思います。
      http://imagingsolution.net/math/fourier-transform/

  5. さいすけ より:

    akiraさん

    ご回答ありがとうございます。
    ユーザー定義関数,調べてみたいと思います。
    ソースに関しては,表示→マクロ→マクロの表示で見られるかと思ったのですができませんでした。見ているところが違うのでしょうか。

    エクセルに関しては初心者で,恥ずかしながら中で何をやっているかまったく想像がついていません。私にはハードルが高いというのが正直なところなのですが。。。(>_<)作ってくださいというのも甘えすぎとも思いますので,とりあえずユーザー定義関数の使いかたを調べるところから始めたいと思います(笑)。あとはフーリエ変換のことも再勉強してみます。

    また何かわからない点が出てきたら質問させていただくこともあるかも知れません。
    その時はどうぞよろしくお願いします。

    • さいすけ より:

      akiraさん

      こんにちは。先日はこちらで色々ご教示いただきありがとうございました。
      その後いろいろ調べて,勉強してみたのですが,断念してしまいました。
      マクロ初心者であることと,フーリエ変換の理論的な部分の理解が
      不十分であることが原因だと思います。

      よろしければ,akiraさんにお時間のあるときで結構ですので,
      もし気が向くことがありましたら,作っていただけると嬉しいです。
      勝手なお願いで恐縮ですが,よろしくお願いいたします。

    • akira より:

      了解しました。

      自分でも少しマクロの部分を眺めてみましたが、ただのフーリエ変換の場合(逆ではなくて)は、入力データを実数に限定していたのですが、逆変換も考慮するとなると、虚数の入力も考慮しないといけなくなるので、少し大変な気もしてきました。
      いつになるか?分かりませんが、ちょっと見てみますので、気長にお待ち下さい。

  6. さいすけ より:

    連投ですみません。
    このフーリエ関数の作成の仕方というか、
    どういう式をセルに打ち込んで(どういう作業をして)作られたのか、
    ご教示いただけますでしょうか。

    どうぞよろしくお願いします。

    • akira より:

      さいすけさん、評価頂きありがとうございます。

      逆変換については個人的に使う事が殆ど無かったので、作っていませんでしたが、関数の作り方に興味があるようでしたら、トライしてみては如何でしょうか?

      今回のようなオリジナルの関数の事を「ユーザー定義関数」というのですが、Excelのシートとは別の画面(Excelのプログラムに含まれている)でプログラムを組むことで、フーリエ変換の関数を作成しています。

      プログラムのソースコードは、本ページで公開しているExcelのファイルでプロテクトを掛けずに見れる状態になっていますので、参考になるかと思います。

      「ユーザー定義関数」で検索して頂くとやり方は見つかると思いますが、何かしらの言語のプログラム経験がないと難しいと思いますので、もし、難しいようでしたら、再度、コメントください。逆変換を考えてみたいと思います。(保障はできませんが。。)

  7. さいすけ より:

    こんにちは。
    とても便利な機能で、さっそく使わせていただきました。
    マクロを使わず、入力によって自動で結果が変わるので、
    直感的に理解しやすく非常に便利だと思います。

    ところで、もし可能であればで結構なのですが、
    似たような使い方で逆変換機能は実装できないものでしょうか。

    同じエクセルファイルの中で、逆変換するともとの波形に戻っている、
    ようなことを確認できるととても楽しいなと思います。