ただPythonでcsvから離散フーリエ変換をするだけのコード

  • このエントリーをはてなブックマークに追加
Advertisements

今すぐ、何も考えず、とにかくcsvに記録したデータを周波数分析したい人向。ここではPythonとIDEのインストール、プログラム実行方法のおさらいの後に、デモcsvファイルとコピペ動作するフーリエ変換コードを紹介して目的を最速達成します。

こんにちは。wat(@watlablog)です。ここでは"Python何もワカラン"な人が爆速でフーリエ変換できるようになる方法を紹介します

この記事の対象者

とにかくフーリエ変換したい人

この記事は、「細かい事は良い!とにかく爆速でフーリエ変換がしたいんだ!」という方を対象としています。

明日までに客先にこの実験データの周波数分析を報告しないといけないんだ!

教授から「フーリエ変換しといて!」って言われた!授業寝ていたから出来ませんなんて言えないよ…!

Advertisements

…という人々の救いの手になればと思い記事化しました(あわよくばPython使いを増やしたい…という裏の目的もありますが)。

Advertisements

フーリエ変換って何なのか、理論を知りたい人や、軸の意味、オーバーラップを使った平均化フーリエ変換、窓関数の使い方、スペクトログラム等の応用の計算を知りたい人は対象にしていません。

もうちょっとフーリエ変換の内容や色々な派生処理を細かく知りたい人はUターンする必要はありません。
是非「PythonでFFT実装!SciPyのフーリエ変換まとめ」をご覧下さい。このページよりは詳しく書いてあります。

Python全く知らない人

この記事ではPythonというプログラミング言語を使ってフーリエ変換を行います。とにかくフーリエ変換したい人にとって言語はどうでもよいと思いますが、ここでは誰が何と言おうとPythonで行います。

でも安心して下さい。このページでは当ブログでこれまで扱ったPythonのインストール方法の記事リンクから説明しますので、WindowsかMacのPCさえ持っていれば、Pythonに関して全く知識がない人も最後まで読み進める事が出来ます。

さらに、会社等でプロキシ設定に阻まれてライブラリインストール出来ない人も対象にしています。インターネットに接続できて、PyPIにアクセスできれば問題ありません。
もちろん全て無料です。

この記事の目標

csvファイルの複数信号を一度に周波数波形にする

この記事では以下のフォーマットで時間波形が記録されたデータをフーリエ変換します。おそらく色々なデータロガーでcsv出力するとこのような形式で出てくる事でしょう。

csvファイルの中身の説明

1行目はヘッダです。A列に時間[s]、B列以降は各信号の名称でも書いておきます(わかりやすくするためであって、名前は何でも良いです)。

A列はフーリエ変換する分だけの時間軸を用意しておいて下さい。時間刻みは一定(等ピッチ)である必要があります。フーリエ変換後の周波数分解能はこの時間が長いほど細かくなります(時間長の逆数[Hz])。分解能を揃えたり調整したい場合は最終時間を揃えましょう。

B列以降はA列の各時刻に対応した振幅成分(例えば電圧、加速度…といった物理的な波形)を用意します。ファイルが許す限り列方向に信号を並べておいて構いません

検証済の動作環境

PC

僕は以下のWindows環境、Mac環境で本記事のコードを動作検証しています。Linuxやその他OSは対象としていません。

Windows OS Windows10 64bit
CPU 2.4[GHz]
メモリ 4[GB]
Mac OS macOS Catalina 10.15.7
CPU 1.4[GHz]
メモリ 8[GB]

Python環境

この後説明するPython環境に関するバージョン情報は以下表に示す通りです。おそらく最新バージョンでも動くと思いますが、検証したのは下の環境のみ。とにかくはやくフーリエ変換したい場合は揃えておくのが無難かと思います。

PythonはPython本体、PyCharmはプログラムを記述して実行したりデバッグしたりする統合開発環境IDE)、NumpyScipyPandasmatplotlibはPythonにインポートして使う便利な外部ライブラリです。

Python Python 3.7.7
PyCharm (IDE) PyCharm CE 2020.1
Numpy 1.19.0
Scipy 1.4.1
Pandas 1.0.5
matplotlib 3.2.2

以上の前置きを確認したら、早速環境構築をしていきましょう!環境が既に構築されている人はコード部分までスクロールして下さい。

環境構築

Pythonのインストール

はじめにプログラミング言語であるPythonをインストールしましょう。

PythonのインストールにはAnacondaを推奨する書籍やサイトが沢山ありますが、2021年現在Anacondaは商用利用に制限がかかっているようです。それ以外にも色々面倒な管理となりそうであるため、筆者はAnacondaを使っていません(いちいちライブラリをインストールするのは面倒ですが)。

インストールの方法はWindowsとMacで以下の記事をご確認下さい。

Windows版:「Pythonのインストール方法とAnacondaを使わない3つの理由

Mac版:「macOSにPython3をインストールする方法をまとめてみた

そのうちもっと良い環境構築方法も試してみたいと思います(Dockerとか?)

統合開発環境(IDE)のインストール

コードを打ち込んでプログラムを実行するだけならテキストエディタを使ってコマンドプロンプトやターミナルで実行する方法でも十分ですが、デバッグやコード記述補助機能を利用するためには統合開発環境IDE)を使うのが良いです。

こちらも以下のWindowsとMacで記事を用意していますので、参照しながらインストールしてみて下さい。

Windows版:「Pythonの統合開発環境(IDE)はPyCharmで良い?

Mac版:「macOSにPython統合開発環境PyCharmをインストール

外部ライブラリのpipインストール

pip概要と外部ライブラリのインストール方法

先ほど紹介したNumpyやScipyといった外部ライブラリはpipインストールするのが一般的です。

pipについての概要は「Pythonのパッケージ管理ツール pip の使い方とコマンド集」、Windows版とMac版のコマンドの違いは「独断!Pythonでpipインストールしたい外部ライブラリまとめ」をご確認下さい。

プロキシエラーになる場合

ちゃんとした会社であればもしかするとpipインストール時にプロキシエラーが発生するかも知れません。

PyPIにアクセスできるインターネット環境をお持ちであれば、「pip installでプロキシエラーになる問題を解決する方法」に記載の方法で解決可能です。

こんな事で諦めるのはもったいないです。

csvを離散フーリエ変換するPythonコード

準備するcsvファイル【ダウンロード可】

ここからはいよいよコードを使ってフーリエ変換をしてみます。
まずはサンプルのcsvファイルとして以下の「signals.csv」をダウンロードしてみて下さい。

あとはこのファイルの中身を自分のデータに書き換えて下のコードを実行するだけで目的は達成できるはずです。

ただ、書き換える時はエンコードを「SHIFT-JIS」にする事を忘れずに。もし「UTF-8」で作ってもコードの方を変更すれば大丈夫ですが。

全コード【コピペ・2次利用可】

以下にcsvをフーリエ変換するだけの全コードを示します。このコードを実行するとfft.csvというファイルが生成されます。

Python上でグラフ表示をしたい時は以下のコードを先ほどのコードの最後にコピペすると、matplotlibによるグラフが表示されます。

実行結果例

生成されたcsvファイルの例を以下に示します。今回はB列に周波数、以降は振幅と位相のデータが最初に指定したデータ数分順番に並びます。

生成されたフーリエ変換後のcsvファイルの例

グラフの例は下図です。パッと確認したい時はPython上で見るのが一番ですね。

フーリエ変換前後の波形(時間波形と周波数波形)

まとめ

今回は既に過去学んだ事を組み合わせて、「csvファイルをフーリエ変換する」というだけのコードを紹介してみました。

信号処理をExcelのみで実施している人からは、よく「フーリエ変換のやり方教えて!」と質問が来ていました。

この記事を用意しておく事で、ライセンスの必要な高度なソフトを立ち上げて、おまけ機能で付いているフーリエ変換を教えるという事をしなくて済みそうです。

Pythonであればプログラミングのハードルも低いので、これをきっかけに皆さんも「ちょっと何かやる」という用途に是非使ってみて下さい!

Pythonでフーリエ変換+csvファイル処理を組み合わせてみました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

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

SNSでもご購読できます。

コメント

  1. hiroko より:

    26行目のdfは何か事前に定義が必要でしょうか。エラーになってしまいます。Pycharmでなくjupyter notebookの環境を使っているのが原因でしょうか。
    # 列方向に順次フーリエ変換(DFT)をするコード
    for i in range(len(df.T)-1):

    1. wat より:

      ご訪問ありがとうございます。
      dfでエラーとの事で、事前にdf = と書いている部分のあとにprint(df)として想定通りのデータが入っていますでしょうか?
      エラーメッセージの内容がわかればより推測できそうです。
      以上、よろしくお願い致します。

      1. hiroko より:

        ありがとうございます。print(df)で実行すると、以下のメッセージが出ます。
        dfが定義出来ていない、ということだと思うのですが書き方が分からずアドバイスを頂けると嬉しいです。基本的なことですみません。

        —————————————————————————
        NameError Traceback (most recent call last)
        in
        —-> 1 print(df)

        NameError: name ‘df’ is not defined

        1. wat より:

          NameErrorという事はdf = …という文が実行されていないのかなと思います。
          df = pd.read_csv(in_file, encoding=’SHIFT-JIS’)
          は実行していますか?
          この文の直後にprint(df)を実行すると、csvファイルの中身が見れるはずです。
          実行しているとすると、もうちょっと詳しくデバッグしたいですね。
          printをこまめに挟みながら原因を探るのがはやいと思いますが、ご検討いただけますでしょうか。

          1. hiroko より:

            ありがとうございます。41行目にdfの定義がありました。
            df, df_fft = csv_fft(in_file=’signals.csv’, out_file=’fft.csv’)
            数行ずつ「Restart&All Run」していたのですが、一気にコピーするか、41行目を先に記載する必要がありました。とても分かりやすい記事で次回も楽しみにしています。

          2. wat より:

            ご連絡ありがとうございます。
            解決したようでよかったです!

  2. shotaro より:

    コメント失礼いたします。
    フーリエ変換ができずに困っていたため大変役に立ちました,ありがとうございます!
    逆フーリエ変換をしたい場合,どこをどう変えればよいでしょうか。
    返信お待ちしております。

    1. wat より:

      ご訪問ありがとうございます。
      逆フーリエ変換の記事は以下に記載しております。
      「https://watlab-blog.com/2019/10/12/fft-ifft/」
      本記事のフーリエ変換をする部分で、逆フーリエ変換の関数を作成・使用する事で可能となります。
      逆フーリエ変換には複素データが必要な事が注意点です。
      どうやら需要がありそうですので、「ただだけシリーズ」としてこちらでも記事化してみようと思います。
      以上、よろしくお願い致します。

コメントを残す

*