フーリエ変換(Fourier Transform)は、時間領域の信号を周波数領域に変換する手法です。フーリエ級数が周期関数を対象とするのに対し、フーリエ変換は非周期関数も扱えるように拡張されたものです。
フーリエ変換は信号処理、画像処理、通信工学、量子力学、偏微分方程式の解法など、理工学のあらゆる分野で使われる最も重要な道具の1つです。
本記事の内容
- フーリエ級数からフーリエ変換への拡張
- フーリエ変換と逆フーリエ変換の定義
- フーリエ変換の主要な性質
- 代表的な関数のフーリエ変換
- Pythonでの実装と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
フーリエ級数からフーリエ変換へ
複素フーリエ級数
フーリエ変換を導出するために、まず複素フーリエ級数を導入します。オイラーの公式 $e^{i\theta} = \cos\theta + i\sin\theta$ を用いると、フーリエ級数は
$$ f(x) = \sum_{n=-\infty}^{\infty} c_n e^{inx} $$
と書けます。ここで複素フーリエ係数は、
$$ c_n = \frac{1}{2\pi} \int_{-\pi}^{\pi} f(x) e^{-inx} \, dx $$
です。
周期を無限大に拡張
周期 $2L$ の関数に対する複素フーリエ級数は、
$$ f(x) = \sum_{n=-\infty}^{\infty} c_n e^{in\pi x/L}, \quad c_n = \frac{1}{2L} \int_{-L}^{L} f(x) e^{-in\pi x/L} \, dx $$
ここで $\omega_n = n\pi/L$, $\Delta\omega = \pi/L$ とおくと、
$$ f(x) = \sum_{n=-\infty}^{\infty} \left[\frac{1}{2\pi} \int_{-L}^{L} f(t) e^{-i\omega_n t} \, dt \right] e^{i\omega_n x} \Delta\omega $$
$L \to \infty$ とすると、$\Delta\omega \to 0$ となり、和が積分に置き換わります。
$$ f(x) = \frac{1}{2\pi} \int_{-\infty}^{\infty} \left[\int_{-\infty}^{\infty} f(t) e^{-i\omega t} \, dt \right] e^{i\omega x} \, d\omega $$
括弧内の積分がフーリエ変換です。
フーリエ変換の定義
フーリエ変換
$$ \hat{f}(\omega) = \mathcal{F}[f](\omega) = \int_{-\infty}^{\infty} f(t) e^{-i\omega t} \, dt $$
逆フーリエ変換
$$ f(t) = \mathcal{F}^{-1}[\hat{f}](t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} \hat{f}(\omega) e^{i\omega t} \, d\omega $$
$f(t)$ は時間領域の信号、$\hat{f}(\omega)$ は周波数領域のスペクトルを表します。フーリエ変換は信号に含まれる各周波数成分の振幅と位相を教えてくれます。
注意: 係数の規約
フーリエ変換の定義には複数の規約があります。本記事では上記の規約(係数 $1$ と $1/2\pi$)を採用しますが、物理学では $1/\sqrt{2\pi}$ と $1/\sqrt{2\pi}$ の対称な規約が使われることもあります。
代表的な関数のフーリエ変換
ガウス関数
$f(t) = e^{-at^2}$($a > 0$)のフーリエ変換は、
$$ \hat{f}(\omega) = \sqrt{\frac{\pi}{a}} e^{-\omega^2/(4a)} $$
ガウス関数のフーリエ変換もガウス関数になるという重要な性質があります。
導出の概略
$$ \begin{align} \hat{f}(\omega) &= \int_{-\infty}^{\infty} e^{-at^2} e^{-i\omega t} \, dt \\ &= \int_{-\infty}^{\infty} e^{-a(t^2 + i\omega t/a)} \, dt \\ &= \int_{-\infty}^{\infty} e^{-a(t + i\omega/(2a))^2 – \omega^2/(4a)} \, dt \\ &= e^{-\omega^2/(4a)} \int_{-\infty}^{\infty} e^{-a u^2} \, du \quad (u = t + i\omega/(2a)) \\ &= e^{-\omega^2/(4a)} \sqrt{\frac{\pi}{a}} \end{align} $$
矩形パルス
$$ \mathrm{rect}(t) = \begin{cases} 1 & (|t| < 1/2) \\ 0 & (|t| > 1/2) \end{cases} $$
のフーリエ変換は、
$$ \hat{f}(\omega) = \int_{-1/2}^{1/2} e^{-i\omega t} \, dt = \frac{e^{i\omega/2} – e^{-i\omega/2}}{i\omega} = \frac{\sin(\omega/2)}{\omega/2} = \mathrm{sinc}\left(\frac{\omega}{2}\right) $$
矩形パルスのフーリエ変換は sinc 関数になります。
指数減衰関数
$f(t) = e^{-a|t|}$($a > 0$)のフーリエ変換は、
$$ \hat{f}(\omega) = \frac{2a}{a^2 + \omega^2} $$
これはローレンツ関数と呼ばれる形です。
フーリエ変換の性質
線形性
$$ \mathcal{F}[\alpha f + \beta g] = \alpha \mathcal{F}[f] + \beta \mathcal{F}[g] $$
時間シフト
$$ \mathcal{F}[f(t – t_0)](\omega) = e^{-i\omega t_0} \hat{f}(\omega) $$
時間領域のシフトは、周波数領域では位相の回転に対応します。
周波数シフト(変調)
$$ \mathcal{F}[e^{i\omega_0 t} f(t)](\omega) = \hat{f}(\omega – \omega_0) $$
微分
$$ \mathcal{F}[f'(t)](\omega) = i\omega \hat{f}(\omega) $$
時間領域の微分は、周波数領域では $i\omega$ の乗算に対応します。この性質は微分方程式を代数方程式に変換する際に利用されます。
スケーリング
$$ \mathcal{F}[f(at)](\omega) = \frac{1}{|a|} \hat{f}\left(\frac{\omega}{a}\right) $$
時間領域で圧縮すると周波数領域では拡がり、逆もまた然りです。これは不確定性原理に関連します。
パーセバルの定理
$$ \int_{-\infty}^{\infty} |f(t)|^2 \, dt = \frac{1}{2\pi} \int_{-\infty}^{\infty} |\hat{f}(\omega)|^2 \, d\omega $$
信号のエネルギーは時間領域でも周波数領域でも保存されます。
Pythonでの実装と可視化
ガウス関数のフーリエ変換
import numpy as np
import matplotlib.pyplot as plt
# ガウス関数のフーリエ変換
a = 1.0
t = np.linspace(-5, 5, 1000)
dt = t[1] - t[0]
f_t = np.exp(-a * t**2)
# 数値フーリエ変換(FFTを使用)
N = len(t)
omega = 2 * np.pi * np.fft.fftfreq(N, d=dt)
F_omega = np.fft.fft(f_t) * dt
F_omega = np.fft.fftshift(F_omega)
omega = np.fft.fftshift(omega)
# 解析解
F_analytical = np.sqrt(np.pi / a) * np.exp(-omega**2 / (4 * a))
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
ax = axes[0]
ax.plot(t, f_t, 'b-', linewidth=2)
ax.set_xlabel('$t$')
ax.set_ylabel('$f(t)$')
ax.set_title('Gaussian: $f(t) = e^{-t^2}$')
ax.grid(True, alpha=0.3)
ax = axes[1]
ax.plot(omega, np.real(F_omega), 'b-', linewidth=2, label='FFT (real part)')
ax.plot(omega, F_analytical, 'r--', linewidth=2, label='Analytical')
ax.set_xlabel('$\\omega$')
ax.set_ylabel('$\\hat{f}(\\omega)$')
ax.set_title('Fourier Transform of Gaussian')
ax.set_xlim(-10, 10)
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('fourier_gaussian.png', dpi=150, bbox_inches='tight')
plt.show()
矩形パルスのフーリエ変換
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(-5, 5, 2000)
dt = t[1] - t[0]
# 矩形パルス
rect = np.where(np.abs(t) < 0.5, 1.0, 0.0)
# 数値フーリエ変換
N = len(t)
omega = 2 * np.pi * np.fft.fftfreq(N, d=dt)
F_omega = np.fft.fftshift(np.fft.fft(rect) * dt)
omega = np.fft.fftshift(omega)
# 解析解: sinc関数
F_analytical = np.sinc(omega / (2 * np.pi)) # np.sincはsinc(x) = sin(πx)/(πx)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
ax = axes[0]
ax.plot(t, rect, 'b-', linewidth=2)
ax.set_xlabel('$t$')
ax.set_ylabel('$f(t)$')
ax.set_title('Rectangular pulse')
ax.set_xlim(-3, 3)
ax.grid(True, alpha=0.3)
ax = axes[1]
ax.plot(omega, np.abs(F_omega), 'b-', linewidth=2, label='$|\\hat{f}(\\omega)|$ (FFT)')
ax.set_xlabel('$\\omega$')
ax.set_ylabel('$|\\hat{f}(\\omega)|$')
ax.set_title('Fourier Transform of rectangular pulse')
ax.set_xlim(-30, 30)
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('fourier_rect.png', dpi=150, bbox_inches='tight')
plt.show()
不確定性原理の可視化
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 3, figsize=(15, 8))
sigmas = [0.5, 1.0, 2.0]
for idx, sigma in enumerate(sigmas):
t = np.linspace(-10, 10, 2000)
dt = t[1] - t[0]
# ガウスパルス
f_t = np.exp(-t**2 / (2 * sigma**2))
# FFT
N = len(t)
omega = 2 * np.pi * np.fft.fftfreq(N, d=dt)
F_omega = np.abs(np.fft.fftshift(np.fft.fft(f_t) * dt))
omega = np.fft.fftshift(omega)
# 時間領域
ax = axes[0, idx]
ax.plot(t, f_t, 'b-', linewidth=2)
ax.set_xlabel('$t$')
ax.set_ylabel('$f(t)$')
ax.set_title(f'$\\sigma_t = {sigma}$')
ax.set_xlim(-5, 5)
ax.grid(True, alpha=0.3)
# 周波数領域
ax = axes[1, idx]
ax.plot(omega, F_omega, 'r-', linewidth=2)
ax.set_xlabel('$\\omega$')
ax.set_ylabel('$|\\hat{f}(\\omega)|$')
sigma_omega = 1 / sigma
ax.set_title(f'$\\sigma_\\omega = {sigma_omega:.1f}$')
ax.set_xlim(-10, 10)
ax.grid(True, alpha=0.3)
plt.suptitle('Uncertainty principle: $\\sigma_t \\sigma_\\omega \\geq 1/2$', fontsize=14, y=1.02)
plt.tight_layout()
plt.savefig('uncertainty_principle.png', dpi=150, bbox_inches='tight')
plt.show()
時間領域で幅が広い($\sigma_t$ が大きい)ほど、周波数領域では幅が狭く($\sigma_\omega$ が小さく)なります。これが不確定性原理の直感的な理解です。
まとめ
本記事では、フーリエ変換の定義と性質を解説しました。
- フーリエ変換: 時間領域の信号を周波数領域に変換する $\hat{f}(\omega) = \int f(t) e^{-i\omega t} dt$
- 逆フーリエ変換: 周波数領域から時間領域に戻す
- 主要な性質: 線形性、時間シフト、微分、スケーリング
- 不確定性原理: 時間と周波数の精度にはトレードオフがある
- パーセバルの定理: エネルギーは時間・周波数領域で保存される
次のステップとして、畳み込みとフーリエ変換の関係について学びましょう。