FFT_smoothing.py 技術ドキュメント

プログラムの動作

このプログラム FFT_smoothing.py は、入力データに対してフーリエ変換 (FFT)、逆フーリエ変換 (IFFT)、およびFFTベースの平滑化(スムージング)を適用するためのPythonスクリプトです。主に、ノイズの多い実験データ(例:X線回折データ、時系列信号など)を解析し、その特性を明らかにする、またはノイズを除去して信号をクリーンアップすることを目的としています。

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

  • データ入力: Excelファイル (.xls, .xlsx) またはCSVファイルからデータを読み込みます。

  • データ選択とフィルタリング:

    • コマンドライン引数で指定された列インデックスまたは列ラベルに基づいて、X軸データとY軸データを抽出します。

    • X軸データの範囲 (xmin, xmax) を指定して、計算対象のデータを絞り込むことができます。

  • 処理モード: 以下の3つの異なる処理モードをサポートします。

    • FFT: 入力データに対して高速フーリエ変換 (FFT) を実行し、その結果を周波数スペクトルとして出力・表示します。

    • IFFT: 入力データに対して逆高速フーリエ変換 (IFFT) を実行し、その結果を出力・表示します。

    • FFT smoothing: 入力データをFFTし、指定された波数範囲 (kcut0 から kcut1) の成分のみを保持して高周波ノイズ(または低周波ドリフト)を除去します。その後、逆FFTを実行して平滑化されたデータを得ます。この平滑化されたデータを出力・表示します。

  • 結果出力: 処理されたデータはExcelファイルとして保存されます。

  • グラフ表示: matplotlib を使用して、入力データ、FFT/IFFTスペクトル、平滑化されたデータなどの視覚的な結果をグラフで表示します。

  • ログ出力: プログラムの実行中に標準出力されるメッセージは、指定されたログファイルにも保存されます。

このプログラムは、ノイズの除去、信号の主要なトレンドの抽出、および周波数領域でのデータ解析といった課題を解決するために利用されます。

原理

このプログラムは、信号処理におけるフーリエ変換の原理を利用してデータを解析および平滑化します。

フーリエ変換 (FFT)

任意の時間領域の信号 \(f(t)\) は、異なる周波数成分の正弦波の重ね合わせとして表現できます。この変換を行うのがフーリエ変換です。連続信号の場合、フーリエ変換 \(F(\omega)\) は以下のように定義されます。

\[F(\omega) = \int_{-\infty}^{\infty} f(t) e^{-i\omega t} dt\]

本プログラムでは、離散的なデータ列 \(y_j\)\(j=0, \dots, N-1\))を扱うため、離散フーリエ変換 (DFT) を使用します。特に、計算効率の高い高速フーリエ変換 (FFT) アルゴリズム(numpy.fft.fft)が利用されます。DFTは以下のように表されます。

\[F_k = \sum_{j=0}^{N-1} y_j e^{-i 2\pi k j / N}\]

ここで \(F_k\)\(k\) 番目の周波数成分(スペクトル)です。プログラムでは、波数軸 xf を計算し、フーリエ変換結果を物理的な波数スケールで解釈できるようにします。データの間隔を \(\Delta x\) とすると、最大サンプリング周波数(ナイキスト周波数)は \(1/(2\Delta x)\) となり、波数軸 xf\(0\) から \(1/\Delta x\) の範囲にわたります。各波数ステップ dxf\(1/\Delta x / (N-1)\) となります。

逆フーリエ変換 (IFFT)

逆フーリエ変換は、フーリエ変換された周波数スペクトル \(F_k\) から元の時間領域(または空間領域)の信号 \(y_j\) を再構築する操作です。numpy.fft.ifft が使用され、その定義は以下の通りです。

\[y_j = \frac{1}{N} \sum_{k=0}^{N-1} F_k e^{i 2\pi k j / N}\]

プログラムの IFFT モードでは、入力データ y を直接この逆フーリエ変換にかけます。これは、一般的な「FFTされたスペクトルをIFFTして元の信号に戻す」という使い方とは異なり、入力データ自体をIFFTした結果を計算・表示するモードとして機能します。

FFT スムージング

FFT smoothing モードでは、以下の手順でデータ平滑化を行います。

  1. フーリエ変換: 元のデータ \(y(x)\) に対してFFTを実行し、周波数スペクトル \(F(k)\) を得ます。

  2. 周波数フィルタリング: 得られたスペクトル \(F(k)\) のうち、指定された波数範囲 \(k_{\text{cut0}}\) から \(k_{\text{cut1}}\) の成分のみを残し、それ以外のすべての周波数成分をゼロに設定します。これにより、不要な高周波ノイズ(高波数成分)や低周波のドリフト(低波数成分)を除去し、信号の主要な特徴に関連する周波数成分を抽出します。

  3. 逆フーリエ変換: フィルタリングされたスペクトル \(F_s(k)\) に対して逆FFTを実行し、平滑化されたデータ \(y_s(x)\) を得ます。

この手法は、周波数領域でノイズを効果的に除去することで、元のデータのノイズを低減し、主要な信号成分を強調するのに役立ちます。

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

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

  • numpy: 数値計算、特に高速フーリエ変換 (FFT) の機能を提供します。

  • pandas: データフレームを扱い、データ処理やExcelファイルへの出力に利用されます。

  • matplotlib: データの可視化、グラフの生成に使用されます。

  • tklib: このプログラムの作者によって提供されていると思われるカスタムライブラリです。tkutils, tksci, tkvariousdata, tkapplication, tkparams などのモジュールを含んでいます。

numpy, pandas, matplotlibpip コマンドでインストールできます。

pip install numpy pandas matplotlib

tklib については、標準の pip リポジトリでは利用できない可能性が高いです。別途入手または設定が必要です。もし tklib が特定のパスに配置されている場合は、そのパスがPythonのモジュール検索パスに含まれている必要があります。

必要な入力ファイル

プログラムが期待する入力ファイルは以下の形式とデータ構造です。

  • ファイル形式:

    • Excelファイル (.xls, .xlsx)

    • CSVファイル (.csv)

  • ファイル名: コマンドライン引数 infile で指定します。デフォルト値は xrd.xls です。

  • データ構造:

    • データは列形式で格納されている必要があります。

    • プログラムは、コマンドライン引数で指定されたX軸 (xlabel) とY軸 (ylabel) のデータ列を読み込みます。これらは0から始まる列インデックス(数値)またはヘッダー行の列ラベル(文字列)で指定できます。

    • X軸のデータは等間隔にサンプリングされていることが仮定されます。

入力ファイルの例 (sample_data.xlsx):

Time

Signal

0.0

10.2

0.1

10.5

0.2

10.1

0.3

9.8

...

...

9.9

11.0

10.0

10.8

上記の例では、Time がX軸データ(列インデックス0)、Signal がY軸データ(列インデックス1)として扱われます。

生成される出力ファイル

プログラムは、実行モードに応じて以下のファイルを生成します。

  • データ出力ファイル:

    • FFTモード: {入力ファイル名}-fft.xlsx

    • IFFTモード: {入力ファイル名}-ifft.xlsx

    • FFT smoothingモード: {入力ファイル名}-fft-smoothing.xlsx

    • ファイル形式: すべてExcelファイル (.xlsx) です。

    • 内容:

      • FFT および IFFT モード:

        • x: 計算に使用されたX軸データ。

        • y: 計算に使用されたY軸データ。

        • x(fft) または x(ifft): フーリエ変換(または逆フーリエ変換)の波数軸データ。

        • y(fft).r または y(ifft).r: 変換結果の実部。

        • y(fft).i または y(ifft).i: 変換結果の虚部。

        • |y(fftr)| または |y(ifftr)|: カラム名としては絶対値の意図が示されていますが、プログラムの現在の実装では変換結果の実部データが再度格納されます。

      • FFT smoothing モード:

        • x: 計算に使用されたX軸データ。

        • y: 計算に使用されたY軸データ。

        • x(fft): フーリエ変換の波数軸データ。

        • y(fft).r: 元のフーリエ変換の実部。

        • y(fft).i: 元のフーリエ変換の虚部。

        • ys(fft,cut).r: フィルタリング(波数カット)後のフーリエ変換の実部。

        • ys(fft,cut).i: フィルタリング(波数カット)後のフーリエ変換の虚部。

        • ys(ifft).r: 平滑化されたデータ(逆フーリエ変換の実部)。

        • ys(ifft).i: 平滑化されたデータ(逆フーリエ変換の虚部)。

        • |ys(ifft)|: 平滑化されたデータ(逆フーリエ変換結果)の絶対値。

  • ログファイル:

    • プログラムの実行時に、標準出力の内容は {入力ファイル名}.log という名前のファイルにリダイレクトされて保存されます。

  • グラフ:

    • 処理結果は matplotlib を使用して、画面上にグラフウィンドウとして表示されます。プログラムは plt.pause(0.001) で一時停止するため、グラフウィンドウはプログラム終了まで開いたままになり、手動で閉じる必要があります。

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

基本的な実行コマンドと引数の説明は以下の通りです。

python FFT_smoothing.py <mode> <infile> [xlabel] [ylabel] [xmin] [xmax] [kcut0] [kcut1]
  • <mode> (必須): 実行する処理モード。以下のいずれかを指定します。

    • "FFT smoothing": FFTベースの平滑化を実行します。

    • "FFT": 入力データに対するフーリエ変換を実行します。

    • "IFFT": 入力データに対する逆フーリエ変換を実行します。

  • <infile> (必須): 入力データファイルのパスと名前(例: data.xlsx)。

  • [xlabel] (オプション): X軸データが含まれる列のインデックス(0から始まる整数)または列ラベル(文字列)。デフォルトは 0 です。

  • [ylabel] (オプション): Y軸データが含まれる列のインデックス(0から始まる整数)または列ラベル(文字列)。デフォルトは 1 です。

  • [xmin] (オプション): X軸データの計算範囲の最小値。デフォルトは入力データのX軸最小値です。

  • [xmax] (オプション): X軸データの計算範囲の最大値。デフォルトは入力データのX軸最大値です。

  • [kcut0] (オプション): FFT smoothing モードでのみ有効。平滑化時に含める波数範囲の最小値。デフォルトは波数軸の最小値です。

  • [kcut1] (オプション): FFT smoothing モードでのみ有効。平滑化時に含める波数範囲の最大値。デフォルトは波数軸の最大値です。

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

ここでは、架空のデータファイル sample_data.xlsx を使用した具体的な実行例とその結果について説明します。 sample_data.xlsx の内容(例):

Time

Signal

0.0

10.0

0.1

10.2

0.2

10.1

0.3

9.8

0.4

10.3

...

...

9.9

11.0

10.0

10.8

例1: FFT smoothing を実行

入力ファイル sample_data.xlsxTime 列(0番目)をX軸、Signal 列(1番目)をY軸とし、波数 0.1 から 1.0 までの成分で平滑化を行います。X軸データは 0.0 から 10.0 の範囲を対象とします。

python FFT_smoothing.py "FFT smoothing" sample_data.xlsx 0 1 0.0 10.0 0.1 1.0
  • 実行結果の説明:

    • sample_data.xlsx からデータが読み込まれます。

    • X軸 (Time) の範囲が 0.0 から 10.0 に制限されます。

    • Y軸 (Signal) データに対してフーリエ変換が実行されます。

    • 変換されたスペクトルのうち、波数 k0.1 から 1.0 の範囲の成分のみが保持され、それ以外の成分はゼロに設定されます。

    • フィルタリングされたスペクトルに対して逆フーリエ変換が実行され、平滑化された信号が得られます。

    • 処理結果は sample_data-fft-smoothing.xlsx という名前のExcelファイルに保存されます。

    • 入力データと平滑化されたデータ、元のFFTスペクトル、フィルタリング後のFFTスペクトルなどを示す4つのグラフがウィンドウに表示されます。

    • コンソール出力は sample_data.log にも記録されます。

例2: 単純なFFTを実行

入力ファイル sample_data.xlsxTime 列(0番目)をX軸、Signal 列(1番目)をY軸としてフーリエ変換を実行します。X軸データの範囲指定はせず、デフォルト(全範囲)を使用します。

python FFT_smoothing.py FFT sample_data.xlsx 0 1
  • 実行結果の説明:

    • sample_data.xlsx からデータが読み込まれます。

    • Y軸 (Signal) データに対してフーリエ変換が実行され、周波数スペクトルが計算されます。

    • 処理結果は sample_data-fft.xlsx という名前のExcelファイルに保存されます。

    • 入力データとFFTスペクトルの実部および虚部を示す2つのグラフがウィンドウに表示されます。

    • コンソール出力は sample_data.log にも記録されます。

例3: IFFT を実行

入力ファイル sample_data.xlsxTime 列(0番目)をX軸、Signal 列(1番目)をY軸として逆フーリエ変換を実行します。 注意: このプログラムの IFFT モードは、入力データそのものに対して逆フーリエ変換を実行します。これは、FFTされたスペクトルをIFFTして元の信号に戻す一般的な使い方とは異なります。

python FFT_smoothing.py IFFT sample_data.xlsx 0 1
  • 実行結果の説明:

    • sample_data.xlsx からデータが読み込まれます。

    • Y軸 (Signal) データに対して逆フーリエ変換が実行されます。

    • 処理結果は sample_data-ifft.xlsx という名前のExcelファイルに保存されます。

    • 入力データとIFFTスペクトルの実部および虚部を示す2つのグラフがウィンドウに表示されます。

    • コンソール出力は sample_data.log にも記録されます。