FFT_func.py 技術ドキュメント

プログラムの動作

FFT_func.py は、ユーザーが定義した単一変数関数をサンプリングし、そのデータに対して高速フーリエ変換 (FFT) または逆高速フーリエ変換 (IFFT) を実行するPythonスクリプトです。このプログラムは、指定された関数の形状とその周波数スペクトル(または元の信号)の関係を視覚的に理解し、数値データをファイルとして保存する機能を提供します。

主な機能は以下の通りです。

  • 関数定義: コマンドライン引数として与えられた文字列に基づいて、任意の数学関数 \(f(x)\) を評価します。

  • データ生成: 指定された定義域 (xmin から xmax) 内で、nx 個のデータポイントを均等にサンプリングして関数データを生成します。

  • フーリエ変換の実行: 生成されたデータに対して numpy ライブラリのFFTまたはIFFTを実行します。

  • 結果の保存: 元のデータと変換結果(実部、虚部)をExcelファイルとして保存します。

  • グラフ表示: matplotlib を使用して、元の関数と変換後の結果(実部、虚部、絶対値)を並べて表示し、視覚的な解析を可能にします。

  • ログ出力: プログラムの実行状況やパラメータ設定をログファイルに記録します。

本プログラムは、信号処理、物理学、工学などの分野におけるフーリエ変換の基本的な挙動を学習・確認するためのツールとして利用できます。

原理

このプログラムは、離散フーリエ変換 (DFT) およびその逆変換 (IDFT) の高速アルゴリズムである高速フーリエ変換 (FFT) と逆高速フーリエ変換 (IFFT) を使用しています。

離散フーリエ変換 (DFT): 時間領域(または空間領域)の離散信号 \(x_n\)\(n = 0, 1, \ldots, N-1\))を周波数領域の離散信号 \(X_k\)\(k = 0, 1, \ldots, N-1\))に変換します。その定義は以下の通りです。

\[X_k = \sum_{n=0}^{N-1} x_n e^{-i 2\pi k n / N}\]

ここで、\(N\) はデータポイントの総数、\(i\) は虚数単位です。

逆離散フーリエ変換 (IDFT): 周波数領域の離散信号 \(X_k\) を時間領域の離散信号 \(x_n\) に戻します。その定義は以下の通りです。

\[x_n = \frac{1}{N} \sum_{k=0}^{N-1} X_k e^{i 2\pi k n / N}\]

このプログラムでは、numpy.fft.fft がDFTを、numpy.fft.ifft がIDFTを実行するために使用されます。これらの関数は、内部でCooley-TukeyアルゴリズムなどのFFTアルゴリズムを利用しており、効率的な計算を実現しています。

プログラム中で定義される関数 func(x) は、Pythonの eval() 関数を使って、コマンドライン引数で与えられた文字列を数学式として評価します。これにより、ユーザーは任意の数学関数(例: sin(10.0 * pi * x), exp(-x**2) など)を動的に指定できます。利用可能な数学関数としては、numpy からインポートされる sin, cos, tan, pi, exp, log, arcsin, arccos, arctan, sinh, cosh, tanh, sqrt, abs など、および random からインポートされる rand() (乱数) があります。

変換後のx軸(周波数軸)の範囲は、元のデータのサンプリングステップ \(\Delta x = (xmax - xmin) / (nx - 1)\) から計算されます。周波数範囲 xfrange\(1/\Delta x\) として計算され、周波数分解能 dxfxfrange / (nx - 1) として計算されます。変換後のx軸 xf は、\(0, \Delta f, 2\Delta f, \dots, (N-1)\Delta f\) となります。

必要な非標準ライブラリとインストール方法

このプログラムの実行には、以下の非標準Pythonライブラリが必要です。

  • numpy: 高度な数値計算、特に配列操作とフーリエ変換アルゴリズムに使用されます。

  • pandas: データフレームの操作とExcelファイルへのデータ出力に使用されます。

  • matplotlib: データのプロットとグラフの描画に使用されます。

これらのライブラリは、通常 pip コマンドを使用してインストールできます。

pip install numpy pandas matplotlib

また、このプログラムは tklib というカスタムライブラリに依存しています。tklib は標準的な pip インストールでは利用できないため、別途入手・設定が必要です。プロジェクトの指示に従って、このライブラリをPython環境に配置してください。

必要な入力ファイル

FFT_func.py は、特別な入力ファイルを必要としません。すべての必要なパラメータ(変換モード、関数文字列、定義域、サンプル数)は、コマンドライン引数として直接指定されます。

プログラム内で指定された関数文字列は、Pythonの eval() 関数によって評価されるため、以下の関数や定数を使用できます。

  • numpy からインポートされる数学関数: sin, cos, tan, exp, log, arcsin, arccos, arctan, sinh, cosh, tanh, sqrt, abs, pi (円周率)

  • random からインポートされる乱数関数: rand() (0.0以上1.0未満の浮動小数点数)

  • tklib.tksci.tksci からインポートされる追加の数学関数および定数: asin, acos, atan, degcos, degsin, degtan, degacos, degasin, degatan, factorial, log10, gamma, combination, eVTonm, nmToeV, Bn, h (プランク定数), h_bar, hbar, e (電気素量), kB (ボルツマン定数), NA (アボガドロ定数), c (光速), pi2, torad, todeg, basee, me (電子質量), mp (陽子質量), mn (中性子質量), u0, e0, a0, R, F, g, G, HartreeToeV, RyToeV, KToeV, eVToK, JToeV, eVToJ, Debye

生成される出力ファイル

プログラムは以下のファイルを生成します。

  • ログファイル:

    • ファイル名: fft_func-out.txt

    • 内容: プログラムの実行時にコンソールに出力されるすべての情報(パラメータ設定、処理状況など)が記録されます。

  • Excelファイル:

    • FFTモードの場合: fft_func-fft.xlsx

    • IFFTモードの場合: fft_func-ifft.xlsx

    • 内容: 以下の6つの列を持つデータが含まれます。

      • x: 元の関数のサンプリング点 (x座標)

      • y: 元の関数の値 (y座標)

      • x(fft): 変換後のデータのx軸(周波数軸)

      • y(fft).r: 変換結果の実部

      • y(fft).i: 変換結果の虚部

      • |y(fftr)|: 変換結果の実部の値(プログラムの現在の実装では実部の値を再度格納しているため、絶対値ではなく実部そのものが格納されます)

また、プログラムの実行中に matplotlib によってグラフウィンドウがポップアップ表示され、元の関数と変換結果が視覚的に確認できます。このグラフはファイルとしては保存されません。

コマンドラインでの使用例 (Usage)

FFT_func.py は、コマンドライン引数で動作モードとパラメータを指定します。

基本的な使用法は以下の通りです。

python FFT_func.py [mode] [func_str] [xmin] [xmax] [nx]

引数の説明:

  • [mode]: 実行する変換の種類を指定します。

    • FFT: 高速フーリエ変換を実行します。

    • IFFT: 逆高速フーリエ変換を実行します。

  • [func_str]: 変換対象となる数学関数を文字列で指定します。Pythonの eval() 関数で解釈可能な形式で記述します(例: "sin(10.0 * pi * x) + 0.5 * rand()")。文字列には必ず引用符(" または ')を使用してください。

  • [xmin]: 関数の定義域の最小値(浮動小数点数)を指定します。

  • [xmax]: 関数の定義域の最大値(浮動小数点数)を指定します。

  • [nx]: 定義域内のサンプリング点数(整数)を指定します。この値はNumpyのFFT処理におけるデータ数 \(N\) となります。

これらの引数を省略した場合、プログラムは内部で定義されたデフォルト値(mode = 'FFT', func_str = 'sin(10.0 * pi * x) + 0.5 * rand()', xmin = -1.0, xmax = 1.0, nx = 1024)を使用します。

コマンドラインでの具体的な使用例

例1: 正弦波にノイズを加えた関数のFFT

10 Hzの正弦波に乱数ノイズを加えた関数 sin(10.0 * pi * x) + 0.5 * rand() を、-1.0 から 1.0 の範囲で 1024 点サンプリングし、FFTを実行する例です。

python FFT_func.py FFT "sin(10.0 * pi * x) + 0.5 * rand()" -1.0 1.0 1024

実行結果:

  • fft_func-out.txt というログファイルが生成され、実行パラメータと処理の詳細が記録されます。

  • fft_func-fft.xlsx というExcelファイルが生成され、元のデータ (x, y) およびFFT結果の周波数軸 (x(fft))、実部 (y(fft).r)、虚部 (y(fft).i) が保存されます。

  • 2つのサブプロットを持つグラフウィンドウが表示されます。左側のプロットには元の関数 y = sin(10.0 * pi * x) + 0.5 * rand() が表示され、右側のプロットにはFFT結果の実部、虚部が表示されます。正弦波の周波数成分とノイズ成分が周波数軸上でどのように分布しているかを確認できます。

例2: 単純な正弦波のIFFT

sin(5.0 * pi * x) という関数を、0.0 から 2.0 の範囲で 512 点サンプリングし、IFFTを実行する例です。

python FFT_func.py IFFT "sin(5.0 * pi * x)" 0.0 2.0 512

実行結果:

  • fft_func-out.txt にログが記録されます。

  • fft_func-ifft.xlsx というExcelファイルが生成され、IFFT結果が保存されます。

  • 2つのサブプロットを持つグラフウィンドウが表示されます。左側のプロットには元の関数 y = sin(5.0 * pi * x) が表示され、右側のプロットにはIFFT結果の実部、虚部が表示されます。IFFTはFFTとは逆の変換を行うため、この場合は元の関数の周波数表現から時間領域への変換を示しますが、入力関数がすでに時間領域であるため、IFFTの結果は元の関数のフーリエ逆変換の性質を示します。