【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】高速フーリエ変換(FFT)のマクロ(VBA)」への37件のフィードバック

  1. Akira様
    初めまして。youと申します。
    マクロ(VBA)を大変便利に使わせていただいています。ありがとうございます。

    質問がありまして、
    フーリエ変換やExcelについての知識が浅いため、ご教示いただけますと幸いです。

    一度保存しファイルを閉じ、ファイルを開き直した後に、
    解析用データの数値を変更するとフーリエ変換の結果の出力先のセルに
    「FALSE」と出てきてしまいます。

    「FALSE」となっているセルをクリックし、編集できる状態にして、
    「Ctrl + Shift + Enter」の3つのキーを同時に入力してみると結果がきちんと表示されるのですが、このようにならないようにしたいです。

    色々なものを調べて試してみても、
    ファイルを開き直して数値を変更しても、出力先に「FALSE」と出ずにきちんと結果を出せる方法が見つかりません。

    拙い文章になり大変申し訳ないのですが、ご教示いただけますでしょうか。
    どうぞよろしくお願いいたします。

    • youさん、ご使用頂きありがとうございます。

      ご連絡頂いた症状については、確認できたのですが、ここのエクセルファイルでは
      VBAで自作の「FOURIER」という関数を作っているのですが、セルの出力がFALSE
      となるときは、このFOURIERの関数が実行されていな事までは分かりました。
      そのため、自作した関数内のバグ等ではないと思われるのですが、なぜ、最初は
      FOURIERの関数の関数が呼ばれないのか?残念ながら、私にもわかりませんでした。

      もし、分かれば、また、ここのコメントに何か書きますが、少し期待薄の状態です。。

    • Akira様
      お返事いただきありがとうございます。
      そうなのですね。。
      お忙しい中ご確認いただきありがとうございます。

  2. 初めまして。
    フーリエ変換やエクセルについて無知な学生なのですが、ご教授いただけたら幸いです。

    fourier_transform_rev3をダウンロードさせていただいたのですが、「セキュリティリスク このファイルのソースが信頼できないため、microsoftによりマクロの実行がブロックされました」と出ております。

    そこでプロパティにある「ブロック解除」をしてみたのですが、開いたところ、「ドキュメントの一部に、ドキュメント検査で削除できない個人情報が含まれている可能性があります 保存 or 検査」と出て使用できない状態です。

    私事の事情で大変恐縮ですが、何か解決策があればご教授願いたいです。
    よろしくお願いいたします。

    • コメントありがとうございます。

      エクセルのマクロに関しては、セキュリティーがどんどん厳しくなってしまうので、私の方で出来る事は無さそうです。
      とりあえず、出たエラーメッセージをそのまま検索すると、参考になる情報が出てくるので、そちらを参考にしてみてください。
      例えばこことか
      https://www.e-survey.go.jp/faq/Security_risk

  3. 非常に有用なソースコードを公開いただき、ありがとうございます。
    念のためお伺いさせていただきたのですが、
    コードは著作権フリーと考えられておられますか?

    • Masuda様、お問い合わせ頂きありがとうございます。
      このマクロは自由に使って頂いて構いませんが、何か不具合等があった場合は、自己責任でお願いいたします。

    • ご回答いただきありがとうございます。
      承知いたしました。

  4. 【Excel】高速フーリエ変換(FFT)のマクロ(VBA)を大変便利に使わせていただいています。
    以前はうまくいっていたと思うのですが、File名をリネームしたりSheetコピーしたり別のカラムで引用演算したりしているのですが、最近CSE演算が動作出来なくなっています。
    実行すると全てのセルに #NAME? と出ます、VBEのマクロ関数にリンクされてないかもしれません。
    元ファイルをコピーして別フォルダーに置いただけでうまくいく時といかないときがあります。
    どこかの設定の問題かもしれませんが、ご教授いただけませんか?
    宜しくお願いいたします。

    • サミーさん、私のブログを参照頂きありがとうございます。
      私のPC環境においても、エクセルファイルを開いたときに「#NAME?」と表示されてしまいます。
      これは、マクロの機能がセキュリティーに引っかかっているためなのですが、
        「セキュリティーの警告 マクロが無効にされました。 コンテンツの有効化」
      と表示されているようでしたら、「コンテンツの有効化」の部分をクリックして、マクロを有効にしてください。

      次に「このファイルを信頼済みドキュメントにしますか?」と表示されているようでしたら、「はい」をクリックしてください。

      それでもセルには「#NAME?」と表示されているようでしたら、FOURIER()関数が書かれているセル(私のエクセルファイルではC列)をクリックし、編集できる状態にして、
       「Ctrl + Shift + Enter」
      の3つのキーを同時に入力してみてください。
      これで、「#NAME?」が表示されなくなると思うのですが、この状態で、ファイルを上書き保存すると、次からは「#NAME?」は表示されなくなるようです。
      ただし、ファイル名を変更したりすると、再度、マクロがセキュリティーに引っかかるため、上記の操作をしないと、また「#NAME?」と表示されてしまうようです。

    • Akiraさん
       アドバイスありがとうございます。
      それが、以前にはファイル名を変えたり、別Sheetで使っても「コンテンツの有効化」の選択が出たりしたのに、
      今はオリジナルのファイルを別フォルダーに移動させるだけで#NAME?になったりして、
      しかも「コンテンツの有効化」の選択が出ません。
       おかげでやはりセキュリティ関連だということは確認できました。 
      セキュリティの判断基準は全く分からないのですが、使いまわしの履歴で積算されてどこかでダメになるのかも。
      Zipから展開したての新鮮なファイルでリトライしてみようと思います。
       ちなみに、{ }を消して「Ctrl + Shift + Enter」は以前からやっています。
      またお伺いするかもしれませんが、よろしくお願いします。

    • 私もマクロのセキュリティーに関しては、あまり詳しくないのですが、少し調べてみたところ、エクセルファイルの保存されている場所(フォルダ)やエクセルファイルの発行元を指定して、セキュリティーを無効にできるようです。

      Office ドキュメントのマクロを有効または無効にする
      信頼できる場所を追加、削除、変更する
      信頼できる発行元を追加、削除、表示する

      ただ、危険ではあるので、自己責任でお願いします。

    • Akiraさん
       セキュリティに関していろいろ調査ありがとうございます、どうもそのあたりのようですね。
       私は、ファイル→情報→ブックの検査 に青文字で「これらの情報をファイルに保存できるようにする」とあるところをクリックしたらそのファイルのリンクが有効になりました。
       引き続き使わせていただきます。

  5. Hi,

    I’m trying to learn about Fourier Analysis from your website.
    Also playing around with the Excel sheet in this article.

    I can see there’s magnitude and phase. Why is there no frequency?
    How do create one?

    Thanks.

  6. データ個数が48889個でも対応できますか?
    やってみたのですがvalueと出てしまいます。

    • コメント頂きありがとうございます。
      これほどの個数のデータは想定してなかったのですが、確かにValueとなってしまう事を確認しました。
      原因の一つと思われる部分を変更(Integer型をLong型へ変更)してみましたので、ご確認下さい。
      本文中で「fourier_transform_rev3.zip」に変更しました。
      おそらく、46000個ぐらいまでで、48000個には対応できていないと思います。(30000個で動作することは確認しました。)

      ただし、これほどの個数のデータをExcelのマクロで処理するのは、何回も再計算が実行されてしまい、(応答なし)となってしまうので、あまり現実的ではないかと思います。
      できればExcelではなく、専用のプログラムを探された方が良いかと思います。

  7. akiraさん

    ご返信ありがとうございました。
    無事に入力データを全てFourier関数で処理することができました。
    ありがとうございました。

    • soraさん、ご連絡ありがとうございます。
      無事、出来たということで、安心しました。

  8. こんにちは。
    フーリエ変換の勉強に使わせて頂いております。

    1つ質問なのですが、データ個数を256個以上入力してその個数分選択しFourier関数を実行しても、256個までしかフーリエ変換後の値が出力されません。
    256個以上のデータに対応するためには、どうすれば良いのでしょうか?
    私もフーリエ変換に関して理解が不十分なところがあるため、ご教授いただければ幸いです。

    • soraさん、こんばんは。

      データの個数を増やす方法ですが、データの出力先のFourier関数を記載しているセルの数もデータ個数と同じセル分だけ選択し、再度、Fourier関数を入力しなおす必要があるのですが、お試し下さい。

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

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

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

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

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

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

  11. akiraさん

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

  12. akiraさん

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

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

  13. akiraさん

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

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

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

    • akiraさん

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

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

    • 了解しました。

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

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

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

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

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

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

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

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

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

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

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください