FFT_interpolate.py 技術ドキュメント
プログラムの動作
FFT_interpolate.py は、高速フーリエ変換 (FFT) を用いて周期的なデータ系列を補間し、その結果を視覚化およびExcelファイルとして出力するPythonスクリプトです。このプログラムは、特に物理学や工学分野で周期的な関数(例えば、電子バンド構造 \(E(k)\) など)のデータをより密な点で評価したい場合に有用です。
主な機能は以下の通りです。
データ読み込み: Excelファイルから \(k\) 値と \(E(k)\) 値を読み込みます。
データミラーリング: 電子バンド構造 \(E(k)\) が反転対称性 \(E(k) = E(-k)\) を持つ場合、与えられたデータの半分から全体のデータを生成するオプションを提供します。
FFTによる補間: 読み込んだデータにFFTを適用し、周波数領域でゼロパディングを行うことで、時間領域(この場合 \(k\) 空間)での高密度な補間データを生成します。
結果の出力: 補間されたデータを新しいExcelファイルに保存します。
グラフ表示: 元のデータ、補間されたデータ、そして必要に応じてFFTの周波数スペクトルをMatplotlibを用いてグラフ表示します。
このプログラムは、限られた測定点や計算点から、より滑らかで密なデータを生成し、視覚的な解析やさらなる数値計算の基盤を提供することを目的としています。
原理
FFT_interpolate.py は、主にFFT(高速フーリエ変換)の性質を利用してデータを補間します。周期的な関数に対するFFT補間は、フーリエ級数展開の概念に基づいています。
フーリエ変換: 与えられた離散データ点 \(\{x_n, y_n\}\) をFFTによって周波数領域に変換します。これにより、元の信号を構成する様々な周波数成分(調和波)の振幅と位相が得られます。 $\(Y_k = \sum_{n=0}^{N-1} y_n e^{-i 2\pi k n / N}\)\( ここで \)N\( はデータ点の数、\)Y_k\( は \)k$ 番目の周波数成分です。
ゼロパディング: 補間を行うためには、周波数領域でデータを拡張します。これは、FFTされたデータ \(Y_k\) の高周波数成分にゼロを詰める(ゼロパディング)ことによって行われます。元の \(N\) 点のデータから \(N_{interp}\) 点の補間データを得るためには、新しい周波数スペクトル \(Y'_k\) を以下のように作成します。 $\( Y'_k = \begin{cases} Y_k & \text{for } 0 \le k < N/2 \\ 0 & \text{for } N/2 \le k < N_{interp} - N/2 \\ Y_{k - N_{interp} + N} & \text{for } N_{interp} - N/2 \le k < N_{interp} \end{cases} \)$ これにより、より多くの周波数成分を持つ(実際には、元のデータに含まれない高周波成分がゼロであると仮定された)スペクトルが生成されます。ゼロパディングは、元の信号に含まれる最高周波数を超える成分が無視できるほど小さい、あるいは存在しないという仮定に基づいています。
逆フーリエ変換: ゼロパディングされた周波数スペクトル \(Y'_k\) を逆FFT(IFFT)によって時間領域(ここでは \(k\) 空間)に変換し直します。これにより、元のデータ点よりもはるかに多くのデータ点を持つ、滑らかに補間されたデータが得られます。 $\(y'_m = \frac{1}{N_{interp}} \sum_{k=0}^{N_{interp}-1} Y'_k e^{i 2\pi m k / N_{interp}}\)\( この操作は、元の信号のフーリエ級数展開を、より多くの点で評価することに相当します。補間される点の総数 \)N_{interp}\( は、元のデータ点の数 \)N\( と補間因子 \)interp_factor\( の積 \)N_{interp} = N \times interp_factor$ によって決定されます。
データミラーリングの処理: 電子バンド構造 \(E(k)\) は、結晶の反転対称性によって \(E(k) = E(-k)\) という関係を満たすことがよくあります。プログラムの
do_mirrorオプションがTrueの場合、入力された \(k\) 値が第一ブリルアンゾーンの半分(例えば \(0 \le k \le k_{max}\))のデータであると仮定し、\(-k\) 側のデータを自動的に生成します。具体的には、与えられたデータ \((x_i, y_i)\) に対して、新しいデータセットに \(( -x_i, y_i )\) の点を追加します(重複を避けるために適切な処理が行われます)。これにより、全ブリルアンゾーンに対応するデータセットが生成され、そのデータに対してFFT補間が適用されます。
必要な非標準ライブラリとインストール方法
FFT_interpolate.py を実行するためには、以下の非標準ライブラリが必要です。
numpy: 数値計算、特にFFT(高速フーリエ変換)の機能を提供します。pandas: Excelファイル (.xlsx) の読み込みと書き出しに使用します。matplotlib: グラフの描画に使用します。
これらのライブラリは、Pythonのパッケージマネージャーである pip を使用してインストールできます。コマンドプロンプトやターミナルを開き、以下のコマンドを実行してください。
pip install numpy pandas matplotlib openpyxl
openpyxl は、pandas がExcelファイルを読み書きする際に内部的に使用するエンジンです。明示的にインストールしておくと、Excelファイルの処理がスムーズに行えます。
必要な入力ファイル
プログラムは、Excelファイル (.xlsx 形式) を入力として期待します。このファイルには、以下の列が含まれている必要があります。
k: 独立変数(例: 波数 \(k\))の値。E(k): 従属変数(例: エネルギー \(E(k)\))の値。
オプションとして、以下の列も読み込むことができますが、プログラムの主要なFFT補間処理には直接使用されません(グラフ描画で「exact」としてプロットされます)。
k,e: 正確な(またはより密な)独立変数の値。E(k),e: 正確な(またはより密な)従属変数の値。
k および E(k) 列には、補間したいデータのペアが格納されている必要があります。read_data 関数内でNaN値は自動的に除外されます。
ファイル例 (interpolate_fft_test.xlsx の構造):
k |
E(k) |
k,e |
E(k),e |
|---|---|---|---|
-0.5 |
1.25 |
-0.5 |
1.25 |
-0.4 |
0.96 |
-0.49 |
1.19 |
-0.3 |
0.65 |
-0.48 |
1.13 |
... |
... |
... |
... |
0.4 |
0.96 |
0.49 |
1.19 |
0.5 |
1.25 |
0.5 |
1.25 |
注意点:
プログラムはデフォルトで interpolate_fft_test.xlsx というファイルを読み込もうとします。異なるファイル名を使用する場合は、コマンドライン引数で指定する必要があります。
生成される出力ファイル
プログラムの実行が成功すると、入力ファイルと同じディレクトリに新しいExcelファイルが生成されます。
ファイル名:
[入力ファイル名]-fft-interpolated.xlsx例えば、入力ファイルがdata.xlsxならば、出力ファイルはdata-fft-interpolated.xlsxとなります。内容: このExcelファイルには、FFT補間によって生成されたデータが含まれます。以下の2つの列で構成されます。
Interpolated X: 補間された独立変数 \(x\) の値。Interpolated Y: 補間された従属変数 \(y\) の値(実数部のみ)。
このファイルは、他の解析ツールでの利用や、補間結果の確認に直接使用できます。
コマンドラインでの使用例 (Usage)
FFT_interpolate.py は、以下の形式でコマンドラインから実行できます。
python FFT_interpolate.py [infile] [do_mirror] [mode]
[infile](オプション):入力Excelファイル (
.xlsx) のパスとファイル名。デフォルトは
interpolate_fft_test.xlsxです。
[do_mirror](オプション):データのミラーリング処理を行うかどうかを指定するフラグ。
0: ミラーリングを行わない (False, デフォルト)。1: ミラーリングを行う (True)。このオプションは、入力データが第一ブリルアンゾーンの半分のみで、かつ反転対称性 \(E(k) = E(-k)\) を仮定できる場合に有用です。
[mode](オプション):グラフ表示のモードを指定します。
fft: 補間結果のみをプロットします (デフォルト)。plot: 補間結果とFFTの周波数スペクトルをプロットします。
コマンドラインでの具体的な使用例
ここでは、FFT_interpolate.py をコマンドラインから実行する具体的な例とその結果について説明します。
事前に、interpolate_fft_test.xlsx というExcelファイルがプログラムと同じディレクトリに存在し、必要なライブラリがインストールされていることを想定します。
例1: デフォルト設定での実行
入力ファイルを指定せず、ミラーリングも行わず、グラフモードも fft のまま実行します。
python FFT_interpolate.py
実行結果の説明:
プログラムはデフォルトの入力ファイル interpolate_fft_test.xlsx を読み込み、do_mirror は False、mode は fft となります。ターミナルには読み込んだデータの確認メッセージが表示され、FFT補間が実行されます。最終的に interpolate_fft_test-fft-interpolated.xlsx というファイルが生成され、補間されたデータが保存されます。また、補間前後のデータを示すグラフ(FFT結果の周波数スペクトルは表示されない)が表示され、Enterキーを押すと終了します。
例2: ミラーリングを有効にして実行
data_half.xlsx というファイルが存在し、そのデータが \(k \ge 0\) の範囲のみを含んでいる場合を想定します。ミラーリングを有効にし、グラフモードはデフォルトの fft で実行します。
python FFT_interpolate.py data_half.xlsx 1
実行結果の説明:
プログラムは data_half.xlsx を入力ファイルとして読み込みます。do_mirror が 1 (True) であるため、読み込まれた \(k \ge 0\) のデータから、反転対称性 \(E(k) = E(-k)\) を仮定して \(k < 0\) のデータが生成されます。その後、結合されたデータに対してFFT補間が実行され、data_half-fft-interpolated.xlsx が出力されます。グラフには、ミラーリングによって拡張されたデータと補間結果が表示されます。
例3: plot モードで実行し、FFTスペクトルも表示
デフォルトの入力ファイルを使用し、ミラーリングは無効、グラフ表示モードを plot にして実行します。
python FFT_interpolate.py interpolate_fft_test.xlsx 0 plot
または、デフォルトファイルなので最初の引数を省略しても良いです。
python FFT_interpolate.py "" 0 plot
(Windows環境では " " もしくは "" で空引数を渡すことでデフォルト値が使われますが、Unix/Linux環境では "" は空文字列として解釈され、プログラム内での infile 変数は空文字列となるため、infile が指定されずにサンプルデータが生成される動作になることに注意してください。この場合、Unix/Linuxでは interpolate_fft_test.xlsx を明示的に指定することが推奨されます。)
実行結果の説明:
プログラムは interpolate_fft_test.xlsx を入力ファイルとして読み込み、ミラーリングは行いません。mode が plot であるため、表示されるグラフは2つのサブプロットを持ちます。上側のサブプロットには、元のデータと補間されたデータが表示されます。下側のサブプロットには、元のデータのFFTによって得られた周波数スペクトル(実部と虚部)が表示され、信号の周波数成分を確認することができます。補間結果は interpolate_fft_test-fft-interpolated.xlsx に保存されます。