フーリエ変換の定義と性質

フーリエ変換は、非周期関数を周波数領域で解析するための基本ツールです。フーリエ級数が周期関数を対象とするのに対し、フーリエ変換は周期の制限を取り払い、あらゆる関数を連続的な周波数成分に分解します。

信号処理、画像処理、通信工学、量子力学など、科学技術の基盤を成す変換です。

本記事の内容

  • フーリエ変換の定義と逆変換
  • フーリエ級数からの導出(周期→∞の極限)
  • 主要な性質(線形性、シフト、スケーリング、畳み込み)
  • ガウス関数のフーリエ変換
  • 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はガウス関数(不確定性原理の基礎)
  • パーセバルの等式でエネルギーが保存される

次のステップとして、以下の記事も参考にしてください。