フーリエ変換は、非周期関数を周波数領域で解析するための基本ツールです。フーリエ級数が周期関数を対象とするのに対し、フーリエ変換は周期の制限を取り払い、あらゆる関数を連続的な周波数成分に分解します。
信号処理、画像処理、通信工学、量子力学など、科学技術の基盤を成す変換です。
本記事の内容
- フーリエ変換の定義と逆変換
- フーリエ級数からの導出(周期→∞の極限)
- 主要な性質(線形性、シフト、スケーリング、畳み込み)
- ガウス関数のフーリエ変換
- Pythonでの実装
前提知識
フーリエ変換の定義
$$ \boxed{F(\omega) = \mathcal{F}\{f(t)\} = \int_{-\infty}^{\infty} f(t) e^{-i\omega t} \, dt} $$
$$ \boxed{f(t) = \mathcal{F}^{-1}\{F(\omega)\} = \frac{1}{2\pi}\int_{-\infty}^{\infty} F(\omega) e^{i\omega t} \, d\omega} $$
$F(\omega)$ は関数 $f(t)$ の周波数スペクトルであり、各角周波数 $\omega$ の成分の振幅と位相を表します。
主要な性質
| 性質 | 時間領域 | 周波数領域 |
|---|---|---|
| 線形性 | $af(t)+bg(t)$ | $aF(\omega)+bG(\omega)$ |
| 時間シフト | $f(t-t_0)$ | $e^{-i\omega t_0}F(\omega)$ |
| 周波数シフト | $e^{i\omega_0 t}f(t)$ | $F(\omega-\omega_0)$ |
| スケーリング | $f(at)$ | $\frac{1}{|a|}F(\omega/a)$ |
| 微分 | $f'(t)$ | $i\omega F(\omega)$ |
| 畳み込み | $(f*g)(t)$ | $F(\omega)G(\omega)$ |
| パーセバル | $\int|f|^2 dt$ | $\frac{1}{2\pi}\int|F|^2 d\omega$ |
畳み込み定理の意味
時間領域での畳み込み $(f*g)(t) = \int f(\tau)g(t-\tau)d\tau$ が、周波数領域では単なる積 $F(\omega)G(\omega)$ になります。これがフーリエ変換の最大の実用的価値です。
ガウス関数のフーリエ変換
$f(t) = e^{-at^2}$ ($a > 0$) のフーリエ変換:
$$ \begin{align} 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^{-au^2} \, du \quad (u = t + i\omega/(2a)) \\ &= \sqrt{\frac{\pi}{a}} \, e^{-\omega^2/(4a)} \end{align} $$
ガウス関数のフーリエ変換はガウス関数です。時間領域で幅が広い($a$が小さい)ほど周波数領域で幅が狭くなり、不確定性原理の基礎となります。
基本的な変換対
| $f(t)$ | $F(\omega)$ |
|---|---|
| $\delta(t)$ | $1$ |
| $1$ | $2\pi\delta(\omega)$ |
| $e^{-at}u(t)$ ($a>0$) | $\frac{1}{a+i\omega}$ |
| $e^{-a|t|}$ | $\frac{2a}{a^2+\omega^2}$ |
| $e^{-at^2}$ | $\sqrt{\pi/a}\,e^{-\omega^2/(4a)}$ |
| $\text{rect}(t/T)$ | $T\text{sinc}(\omega T/2)$ |
Pythonでの実装
import numpy as np
import matplotlib.pyplot as plt
# サンプリング
dt = 0.01
t = np.arange(-10, 10, dt)
N = len(t)
freq = np.fft.fftfreq(N, d=dt) * 2 * np.pi # 角周波数
fig, axes = plt.subplots(2, 2, figsize=(12, 9))
# ガウス関数のフーリエ変換
for a, color in [(0.5, 'blue'), (1.0, 'red'), (2.0, 'green')]:
f = np.exp(-a * t**2)
F = np.fft.fft(f) * dt
F_exact = np.sqrt(np.pi/a) * np.exp(-freq**2/(4*a))
axes[0, 0].plot(t, f, color=color, label=f'a={a}')
axes[0, 1].plot(np.fft.fftshift(freq), np.fft.fftshift(np.abs(F)),
color=color, label=f'a={a} (数値)')
axes[0, 0].set_title('ガウス関数 $e^{-at^2}$')
axes[0, 0].set_xlabel('t')
axes[0, 0].legend()
axes[0, 0].grid(True, alpha=0.3)
axes[0, 0].set_xlim(-5, 5)
axes[0, 1].set_title('フーリエ変換 $|F(\\omega)|$')
axes[0, 1].set_xlabel('$\\omega$')
axes[0, 1].legend()
axes[0, 1].grid(True, alpha=0.3)
axes[0, 1].set_xlim(-10, 10)
# 矩形パルスとsinc
T = 2.0
rect = np.where(np.abs(t) < T/2, 1.0, 0.0)
F_rect = np.fft.fft(rect) * dt
axes[1, 0].plot(t, rect, 'b-', linewidth=2)
axes[1, 0].set_title(f'矩形パルス (幅={T})')
axes[1, 0].set_xlabel('t')
axes[1, 0].set_xlim(-5, 5)
axes[1, 0].grid(True, alpha=0.3)
freq_shifted = np.fft.fftshift(freq)
F_shifted = np.fft.fftshift(F_rect)
axes[1, 1].plot(freq_shifted, np.abs(F_shifted), 'b-', linewidth=1.5)
axes[1, 1].set_title('矩形パルスのスペクトル(sinc型)')
axes[1, 1].set_xlabel('$\\omega$')
axes[1, 1].set_ylabel('$|F(\\omega)|$')
axes[1, 1].set_xlim(-20, 20)
axes[1, 1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('fourier_transform.png', dpi=150, bbox_inches='tight')
plt.show()
まとめ
- フーリエ変換: $F(\omega) = \int f(t)e^{-i\omega t}dt$ で時間→周波数に変換
- 逆変換: $f(t) = \frac{1}{2\pi}\int F(\omega)e^{i\omega t}d\omega$
- 畳み込み定理: 時間領域の畳み込み = 周波数領域の積
- ガウス関数のFTはガウス関数(不確定性原理の基礎)
- パーセバルの等式でエネルギーが保存される
次のステップとして、以下の記事も参考にしてください。