フーリエ変換#
フーリエ級数の近似区間#
フーリエ級数展開・複素フーリエ級数展開では区間上の関数について基本周波数 \(\omega_0 = 2\pi / T\) を整数倍した \(\omega_0, 2\omega_0, 3\omega_0, \ldots\) の周波数を持つ波の足し合わせで表現するため,区間外の領域の関数は近似することができなかった.
具体例として,\(y=t\) という関数でこの近似区間の問題を可視化してみる.sympyのフーリエ級数展開の関数を用いる.
from sympy import symbols, pi, fourier_series
from sympy.plotting import plot
t = symbols('t')
f = t # f(t) = tの定義
ff = fourier_series(f, (t, -pi, pi)) # フーリエ級数展開を実行
ff_approx = ff.truncate(20) # 第20項目まで計算
plot(f, ff_approx, xlim=(-3*pi, 3*pi), ylim=(-4, 4)) # 区間外まで可視化
Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.
Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.

<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x1118340a0>
このように区間外では近似された関数が繰り返されているのがわかるかと思う.これはフーリエ級数展開が周期関数である正弦波の重ね合わせで構成されているからである.しかしながら,与えられた関数や信号がこのような周期性を持つ場合は限られており,関数や信号の解析を行う上で 非周期 な対象へのフーリエ解析の方法が求められる.本講義では,非周期関数への拡張を行なった フーリエ変換 を学ぶことが目標である.
フーリエ変換#
フーリエ変換 は無限区間で定義されかつ非周期関数に対するフーリエ解析の方法である.これまでのフーリエ級数展開と同様に,フーリエ変換は時間の関数を 周波数 の関数へ変換可能であり,与えられた関数にどのような周波数が含まれているかを解析することができる.一方で,フーリエ変換では周波数の関数から時間の関数へ変換する 逆フーリエ変換 も定義されている.フーリエ変換は
として定義され,
逆フーリエ変換は
で与えられる.
フーリエ変換の導出#
では,フーリエ変換と逆フーリエ変換を複素フーリエ級数と複素フーリエ係数から導出する.複素フーリエ級数と複素フーリエ係数は以下で定義されていた.
ここから \(T\) を無限に大きくしたときの複素フーリエ級数展開を考える.そのために上記の二式に含まれる基本周波数 \(\omega_0\) について,足し合わされる整数倍の周波数 \(k \omega_0\) を \(\omega_k\) と表記する.
\(\omega_k\) を使って複素フーリエ級数と係数を整理する.複素フーリエ級数は
となり,複素フーリエ係数は,
となる.ここで,\(\omega_{k+1}\) と \(\omega_k\) は \(\omega_0\) の整数倍であることから次のような性質を導ける.
この差を \(\Delta \omega\) として定義する.
区分求積法を利用するために \(f(t)\) に \(C_k\) を代入する.
区間 \(T\) を \(\infty\) にするために積分の定義(区分求積法)から複素フーリエ級数を整理する.
区分求積法
厳密には無限区間 \([-\infty, \infty]\) での積分より,広義積分として扱う必要があるが後述する絶対可積分の条件よりこのように考えて良い.
後述するが関数 \(f(t)\) が \([-\infty, \infty]\) で 区分的に滑らか で,絶対可積分 であるという条件のもと,有限区間 \(T\) を無限区間に拡張すると \(T \rightarrow \infty\) のとき \(\Delta \omega\) は \(2\pi / T\) より \(\Delta \omega = 0\) に収束するので次のように変形できる.
このとき,時刻 \(t\) の関数 \(f(t)\) から周波数 \(\omega\) の関数 \(F(\omega)\)への変換を フーリエ変換 と呼び,以下で与えられる.
フーリエ変換は式の通り,\(-\infty\) から \(\infty\) までのすべての時刻 \(t\) にわたる積分で周波数の関数へ変換できる. 一方で,周波数 \(\omega\) の関数 \(F(\omega)\) から時刻 \(t\) の関数 \(f(t)\) への変換を 逆フーリエ変換 と呼び,以下で与えられる.
式の通り,\(-\infty\) から \(\infty\) までのすべての周波数 \(\omega\) を持つ関数の重ね合わせと解釈できる.
フーリエ変換の条件#
フーリエ変換の導出で登場したフーリエ変換を行うための条件について紹介する. 前述のの変形を行うには,関数 \(f(t)\) が区間 \([-\infty, \infty]\) で区分的に滑らかで,絶対可積分である必要があった.
ここで関数 \(f(t)\) が区間 \([-\infty, \infty]\) で区分的に滑らかであるとは,
関数 \(f(t)\) と導関数 \(f'(t)\) が連続(滑らかな関数)
1周期の間に有限個の不連続点しかもたず,かつ,どの不連続点 \(t_0\)に対しても \(f(t_0-0)\) と \(f(t_0+0)\) が有限の値として存在する関数(区分的に連続な関数)
という二条件を満たした 「関数 \(f(t)\) と導関数 \(f'(t)\) がともに区分的に連続な関数である」ということを示す.
そして,絶対可積分であるとは,絶対値をとって積分したときに発散しないということを示す.
波の重ね合わせ#
フーリエ級数展開,複素フーリエ級数展開,フーリエ変換はすべて時刻 \(t\) に関する関数 \(f(t)\) を異なる周波数 \(\omega\) の波の重ね合わせで表現することを試みている.複素フーリエ級数とフーリエ変換を見比べてみると
複素フーリエ級数展開
フーリエ変換・逆フーリエ変換
となり,これらのフーリエ解析方法は変換後の周波数の扱いが整数倍であるか?それとも連続的に定義されているか?の違いで区別される.そして,周波数 \(\omega\) に関する情報はフーリエ級数の場合は 離散スペクトル ,フーリエ変換の場合は 連続スペクトル と呼ばれる
具体例#
では,以下の関数をフーリエ変換しよう.
解答はクリックで確認できる.
フーリエ変換の式 \(F(\omega)\) の式に当てはめて計算する.
ここで \(e^{-\infty}e^{ - i\omega \infty} = e^{-\infty}e^{ i\omega \infty} = 0\) を利用してる.以上より,\(f(t)\) のフーリエ変換 \(F(\omega)\) を計算することができた.
Pythonでフーリエ変換#
では,Pythonでフーリエ変換を実行する.まず注意点として,フーリエ変換は無限区間で周期を持たない非周期関数 \(f(t)\) を時間の関数から周波数の関数へ変換できるが,そのための条件は \(f(t)\) が区間 \([-\infty,\infty]\) 区分的に滑らかで絶対可積分である必要があった.絶対可積分とは,絶対値をとって積分したときに発散しないことを示している.この条件は厳しく,例えば \(f(\pm \infty)=0\)とならない場合は,絶対可積分とならない.また広義積分をするので,解析的に求められない場合もある.そのため,\(f\) の定義によってはエラーとなるので注意されたい.
以下でフーリエ変換する関数を定義する
from sympy import symbols, exp
from sympy.plotting import plot
t = symbols('t', real=True)
f = exp(-t**2/2)
f
plot(f)

<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x10fb61dc0>
Sympyでは,時刻の変数 \(t\) と周波数の変数 \(\omega\) を定義して,fourier_transform(関数,t, omega)
でフーリエ変換できる.ただし,解析的に求められない場合は,式の代わりに,FourierTransform
クラスが帰ってくる.
from sympy import fourier_transform
omega = symbols('omega', real=True)
ft = fourier_transform(f, t, omega)
ft
時刻から周波数の関数に変換されていることを確認するためにフーリエ変換後のグラフをプロットする
plot(ft)

<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x128c19b80>
Sympyでは,フーリエ変換と同様に,時刻の変数 \(t\) と周波数の変数 \(\omega\) を定義して,inverse_fourier_transform(関数, omega, t)
で逆フーリエ変換できる.ただし,解析的に求められない場合は,式の代わりに,InverseFourierTransform
クラスが帰ってくる.
from sympy import inverse_fourier_transform
ift = inverse_fourier_transform(ft, omega, t)
ift
同様に周波数から時刻の関数に変換されていることを確認するために逆フーリエ変換後のグラフをプロットする.
plot(ift)

<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x128e12a30>
フーリエ変換の性質#
フーリエ変換には微分方程式の適用や周波数解析において役立つ性質がいくつかある.
フーリエ変換の線形性#
関数 \(f(t)\) から周波数に関する関数 \(F(\omega)\) を得るフーリエ変換を \(\mathcal{F}(f(t))\) とする.
このときフーリエ変換には以下の線形性の性質がある.
\(f(t)\) の定数倍 \(cf(t)\) のフーリエ変換の性質
証明はクリックで確認できる.
\(f(t)\) と \(g(t)\) の和に関するフーリエ変換の性質
証明はクリックで確認できる.
フーリエ変換の導関数の性質#
関数 \(f(t)\) のフーリエ変換 \(\mathcal{F}(f(t))\) と関数 \(f(t)\) の\(n\) 次導関数 \(f^{(n)}(t)\) には以下の関係がある.
これは導関数 \(f^{(n)}(t)\) のフーリエ変換の結果 \(\mathcal{F}(f^{(n)}(t))\) は元の関数 \(f(t)\) のフーリエ変換後の周波数領域で \(i \omega\) をかけることに等しい.
証明はクリックで確認できる.
第二行目では絶対可積分の条件 \(f(\pm \infty)=0\) を利用している.これを \(f'(t), f''(t),\ldots\) と計算すると導関数の性質を導出できる.
フーリエ変換の時刻と周波数のシフト則#
フーリエ変換の時刻のシフト則
関数 \(f(t)\) を \(t_0\) だけ平行移動した関数 \(f(t-t_0)\) のフーリエ変換は次の性質がある.
証明はクリックで確認できる.
フーリエ変換の周波数のシフト則
関数 \(f(t)\) のフーリエ変換後の \(F(\omega)\) を \(\omega_0\) だけ平行移動した関数 \(F(\omega-\omega_0)\) には以下の性質がある.
証明はクリックで確認できる.