フーリエ変換は、任意の関数を周波数成分に分解する数学的手法です。フーリエ級数が「周期関数」を対象とするのに対し、フーリエ変換は「非周期関数」を含むより広い関数のクラスを扱えるように拡張された概念です。
イメージとしては、「ある信号が時間とともにどう変化するか」という見方(時間領域)を、「どの周波数がどれだけ含まれているか」という見方(周波数領域)に変換する操作です。この変換により、信号処理、画像圧縮、量子力学、偏微分方程式の求解など、極めて広範な分野で強力なツールとなっています。本記事では、フーリエ級数からフーリエ変換への自然な拡張を示し、主要な性質と基本的な変換ペアを体系的にまとめます。
本記事の内容
- フーリエ級数からフーリエ変換への拡張
- フーリエ変換と逆フーリエ変換の定義
- フーリエ変換の主要な性質(線形性、シフト、スケーリング、微分)
- 基本的な変換ペア
- Pythonでの実装と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
フーリエ変換とは
フーリエ変換とは、時間(あるいは空間)の関数を周波数の関数に変換する操作です。大雑把に言うと、「信号のレシピ」を知るための変換であり、信号がどのような周波数成分をどれだけ含んでいるかを明らかにします。
フーリエ級数は周期関数を離散的な周波数成分($n = 1, 2, 3, \dots$)に分解しますが、非周期関数に対しては周波数が連続的になるため、和(級数)が積分に置き換わります。これがフーリエ変換です。
フーリエ級数からフーリエ変換への拡張
複素フーリエ級数の復習
周期 $T$ の関数 $f(t)$ の複素フーリエ級数は、
$$ f(t) = \sum_{n=-\infty}^{\infty} c_n \, e^{i 2\pi n t / T} $$
$$ c_n = \frac{1}{T} \int_{-T/2}^{T/2} f(t) \, e^{-i 2\pi n t / T} \, dt $$
ここで $c_n$ は複素フーリエ係数、$n/T$ は $n$ 番目の高調波の周波数です。
周期 $T \to \infty$ の極限
非周期関数を扱うため、周期 $T$ を無限大に飛ばすことを考えます。$\Delta f = 1/T$(周波数の間隔)、$f_n = n \Delta f = n/T$ とおくと、
$$ c_n = \frac{1}{T} \int_{-T/2}^{T/2} f(t) \, e^{-i 2\pi f_n t} \, dt = \frac{\Delta f}{1} \int_{-T/2}^{T/2} f(t) \, e^{-i 2\pi f_n t} \, dt $$
ここで $F(f_n) = \int_{-T/2}^{T/2} f(t) \, e^{-i 2\pi f_n t} \, dt$ とおくと、$c_n = F(f_n) \Delta f$ と書けます。これをフーリエ級数に代入すると、
$$ f(t) = \sum_{n=-\infty}^{\infty} F(f_n) \, e^{i 2\pi f_n t} \, \Delta f $$
$T \to \infty$ で $\Delta f \to 0$ となり、離散的な和が積分に移行します。
$$ \begin{align} f(t) &= \lim_{\Delta f \to 0} \sum_{n=-\infty}^{\infty} F(f_n) \, e^{i 2\pi f_n t} \, \Delta f \\ &= \int_{-\infty}^{\infty} F(f) \, e^{i 2\pi f t} \, df \end{align} $$
同時に、積分区間 $[-T/2, T/2]$ も $(-\infty, \infty)$ に拡がります。
$$ F(f) = \int_{-\infty}^{\infty} f(t) \, e^{-i 2\pi f t} \, dt $$
これがフーリエ変換と逆フーリエ変換の対です。
数学的定義
フーリエ変換
関数 $f(t)$ のフーリエ変換 $F(f)$(あるいは $\hat{f}(f)$)は、以下で定義されます。
$$ \begin{equation} F(f) = \mathcal{F}[f(t)] = \int_{-\infty}^{\infty} f(t) \, e^{-i 2\pi f t} \, dt \end{equation} $$
逆フーリエ変換
周波数領域の関数 $F(f)$ から元の時間領域の関数 $f(t)$ を復元する操作が逆フーリエ変換です。
$$ \begin{equation} f(t) = \mathcal{F}^{-1}[F(f)] = \int_{-\infty}^{\infty} F(f) \, e^{i 2\pi f t} \, df \end{equation} $$
角周波数表記
角周波数 $\omega = 2\pi f$ を用いた表記もよく使われます。
$$ \hat{f}(\omega) = \int_{-\infty}^{\infty} f(t) \, e^{-i\omega t} \, dt, \qquad f(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} \hat{f}(\omega) \, e^{i\omega t} \, d\omega $$
本記事では周波数 $f$(Hz)による表記を主に用います。
フーリエ変換の主要な性質
フーリエ変換は多くの有用な性質を持ちます。以下では、$\mathcal{F}[f(t)] = F(\nu)$, $\mathcal{F}[g(t)] = G(\nu)$ とします(混乱を避けるため周波数変数を $\nu$ と書きます)。
1. 線形性
$$ \begin{equation} \mathcal{F}[\alpha f(t) + \beta g(t)] = \alpha F(\nu) + \beta G(\nu) \end{equation} $$
フーリエ変換は積分で定義されるため、積分の線形性がそのまま成り立ちます。
2. 時間シフト
$$ \begin{equation} \mathcal{F}[f(t – t_0)] = e^{-i 2\pi \nu t_0} F(\nu) \end{equation} $$
証明:
$$ \begin{align} \mathcal{F}[f(t – t_0)] &= \int_{-\infty}^{\infty} f(t – t_0) \, e^{-i 2\pi \nu t} \, dt \\ &= \int_{-\infty}^{\infty} f(\tau) \, e^{-i 2\pi \nu (\tau + t_0)} \, d\tau \quad (\tau = t – t_0) \\ &= e^{-i 2\pi \nu t_0} \int_{-\infty}^{\infty} f(\tau) \, e^{-i 2\pi \nu \tau} \, d\tau \\ &= e^{-i 2\pi \nu t_0} F(\nu) \end{align} $$
つまり、時間のシフトは周波数領域では 位相の回転 に対応し、振幅スペクトル $|F(\nu)|$ は変わりません。
3. 周波数シフト(変調)
$$ \begin{equation} \mathcal{F}[e^{i 2\pi \nu_0 t} f(t)] = F(\nu – \nu_0) \end{equation} $$
時間領域での複素指数関数の乗算は、周波数領域でのスペクトルのシフトに対応します。これは通信工学における 変調 の数学的基礎です。
4. スケーリング
$$ \begin{equation} \mathcal{F}[f(at)] = \frac{1}{|a|} F\left(\frac{\nu}{a}\right) \quad (a \neq 0) \end{equation} $$
証明:
$$ \begin{align} \mathcal{F}[f(at)] &= \int_{-\infty}^{\infty} f(at) \, e^{-i 2\pi \nu t} \, dt \\ &= \frac{1}{|a|} \int_{-\infty}^{\infty} f(\tau) \, e^{-i 2\pi (\nu/a) \tau} \, d\tau \quad (\tau = at) \\ &= \frac{1}{|a|} F\left(\frac{\nu}{a}\right) \end{align} $$
この性質は、時間領域で信号を圧縮すると周波数領域では伸張され、逆もまた然りであることを示しています。これを 不確定性原理のフーリエ版 とも呼びます。
5. 微分
$$ \begin{equation} \mathcal{F}[f'(t)] = i 2\pi \nu \, F(\nu) \end{equation} $$
$$ \begin{equation} \mathcal{F}[f^{(n)}(t)] = (i 2\pi \nu)^n F(\nu) \end{equation} $$
微分が周波数領域では $(i2\pi\nu)$ の乗算に変わるため、微分方程式を代数方程式に変換できます。これがフーリエ変換を用いた偏微分方程式の求解法の根幹です。
6. 双対性
$$ \begin{equation} \mathcal{F}[F(t)] = f(-\nu) \end{equation} $$
フーリエ変換ペアの一方がわかれば、時間と周波数の役割を入れ替えて別のペアを得ることができます。
性質のまとめ
| 性質 | 時間領域 | 周波数領域 |
|---|---|---|
| 線形性 | $\alpha f + \beta g$ | $\alpha F + \beta G$ |
| 時間シフト | $f(t – t_0)$ | $e^{-i2\pi\nu t_0} F(\nu)$ |
| 周波数シフト | $e^{i2\pi\nu_0 t} f(t)$ | $F(\nu – \nu_0)$ |
| スケーリング | $f(at)$ | $\frac{1}{\|a\|} F(\nu/a)$ |
| 時間微分 | $f'(t)$ | $i2\pi\nu \, F(\nu)$ |
| 時間積分 | $\int_{-\infty}^{t} f(\tau)d\tau$ | $\frac{F(\nu)}{i2\pi\nu} + \frac{F(0)}{2}\delta(\nu)$ |
| 双対性 | $F(t)$ | $f(-\nu)$ |
基本的な変換ペア
よく使われるフーリエ変換ペアを一覧にまとめます。
ガウス関数
$$ f(t) = e^{-\alpha t^2} \quad \Longleftrightarrow \quad F(\nu) = \sqrt{\frac{\pi}{\alpha}} \, e^{-\pi^2 \nu^2 / \alpha} $$
ガウス関数のフーリエ変換もガウス関数になるという注目すべき性質を持ちます。
矩形パルス
$$ f(t) = \mathrm{rect}(t) = \begin{cases} 1 & (|t| < 1/2) \\ 0 & (|t| > 1/2) \end{cases} \quad \Longleftrightarrow \quad F(\nu) = \mathrm{sinc}(\nu) = \frac{\sin(\pi\nu)}{\pi\nu} $$
指数減衰関数
$$ f(t) = e^{-\alpha t} u(t) \quad (\alpha > 0) \quad \Longleftrightarrow \quad F(\nu) = \frac{1}{\alpha + i2\pi\nu} $$
ここで $u(t)$ は単位ステップ関数です。
デルタ関数
$$ f(t) = \delta(t) \quad \Longleftrightarrow \quad F(\nu) = 1 $$
デルタ関数のフーリエ変換はすべての周波数成分を等しく含む「白色スペクトル」です。
具体例: ガウスパルスのフーリエ変換
$f(t) = e^{-\pi t^2}$ のフーリエ変換を計算します($\alpha = \pi$ の場合)。
$$ \begin{align} F(\nu) &= \int_{-\infty}^{\infty} e^{-\pi t^2} e^{-i2\pi\nu t} \, dt \\ &= \int_{-\infty}^{\infty} e^{-\pi(t^2 + 2i\nu t)} \, dt \\ &= \int_{-\infty}^{\infty} e^{-\pi(t + i\nu)^2 – \pi\nu^2} \, dt \quad (\text{平方完成}) \\ &= e^{-\pi\nu^2} \int_{-\infty}^{\infty} e^{-\pi(t + i\nu)^2} \, dt \\ &= e^{-\pi\nu^2} \cdot 1 \quad (\because \text{ガウス積分の複素拡張}) \\ &= e^{-\pi\nu^2} \end{align} $$
つまり、$e^{-\pi t^2}$ は自分自身のフーリエ変換が自分自身となる 不動点 です。
Pythonでの実装
基本的な変換ペアの可視化
import numpy as np
import matplotlib.pyplot as plt
# 時間軸と周波数軸
t = np.linspace(-5, 5, 1000)
nu = np.linspace(-5, 5, 1000)
# ガウス関数
f_gauss = np.exp(-np.pi * t ** 2)
F_gauss = np.exp(-np.pi * nu ** 2)
# 矩形パルス
f_rect = np.where(np.abs(t) < 0.5, 1.0, 0.0)
F_sinc = np.sinc(nu) # np.sincはsin(pi*x)/(pi*x)
# 指数減衰
alpha = 2.0
f_exp = np.where(t >= 0, np.exp(-alpha * t), 0.0)
F_exp_mag = 1.0 / np.sqrt(alpha ** 2 + (2 * np.pi * nu) ** 2)
fig, axes = plt.subplots(3, 2, figsize=(12, 10))
# ガウス関数
axes[0, 0].plot(t, f_gauss, 'b-', linewidth=2)
axes[0, 0].set_title('Gaussian: $f(t) = e^{-\\pi t^2}$')
axes[0, 0].set_xlabel('t')
axes[0, 0].grid(True, alpha=0.3)
axes[0, 1].plot(nu, F_gauss, 'r-', linewidth=2)
axes[0, 1].set_title('FT: $F(\\nu) = e^{-\\pi \\nu^2}$')
axes[0, 1].set_xlabel('$\\nu$')
axes[0, 1].grid(True, alpha=0.3)
# 矩形パルス
axes[1, 0].plot(t, f_rect, 'b-', linewidth=2)
axes[1, 0].set_title('Rect: $f(t) = \\mathrm{rect}(t)$')
axes[1, 0].set_xlabel('t')
axes[1, 0].set_ylim(-0.3, 1.3)
axes[1, 0].grid(True, alpha=0.3)
axes[1, 1].plot(nu, F_sinc, 'r-', linewidth=2)
axes[1, 1].set_title('FT: $F(\\nu) = \\mathrm{sinc}(\\nu)$')
axes[1, 1].set_xlabel('$\\nu$')
axes[1, 1].grid(True, alpha=0.3)
# 指数減衰
axes[2, 0].plot(t, f_exp, 'b-', linewidth=2)
axes[2, 0].set_title(f'Exponential: $f(t) = e^{{-{alpha}t}} u(t)$')
axes[2, 0].set_xlabel('t')
axes[2, 0].grid(True, alpha=0.3)
axes[2, 1].plot(nu, F_exp_mag, 'r-', linewidth=2)
axes[2, 1].set_title(f'FT magnitude: $|F(\\nu)|$')
axes[2, 1].set_xlabel('$\\nu$')
axes[2, 1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("fourier_transform_pairs.png", dpi=150, bbox_inches="tight")
plt.show()
スケーリング性質の可視化
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(-5, 5, 1000)
nu = np.linspace(-10, 10, 1000)
fig, axes = plt.subplots(2, 3, figsize=(15, 8))
# 異なる幅のガウス関数
scales = [0.5, 1.0, 2.0]
colors = ['blue', 'green', 'red']
for a, color in zip(scales, colors):
f_t = np.exp(-np.pi * (a * t) ** 2)
F_nu = (1 / abs(a)) * np.exp(-np.pi * (nu / a) ** 2)
axes[0, scales.index(a)].plot(t, f_t, color=color, linewidth=2)
axes[0, scales.index(a)].set_title(f'$f({a}t) = e^{{-\\pi({a}t)^2}}$')
axes[0, scales.index(a)].set_xlabel('t')
axes[0, scales.index(a)].set_ylim(0, 2.2)
axes[0, scales.index(a)].grid(True, alpha=0.3)
axes[1, scales.index(a)].plot(nu, F_nu, color=color, linewidth=2)
axes[1, scales.index(a)].set_title(f'$F(\\nu) = \\frac{{1}}{{{a}}} e^{{-\\pi(\\nu/{a})^2}}$')
axes[1, scales.index(a)].set_xlabel('$\\nu$')
axes[1, scales.index(a)].set_ylim(0, 2.2)
axes[1, scales.index(a)].grid(True, alpha=0.3)
plt.suptitle('Scaling Property: Narrow in time ↔ Wide in frequency', fontsize=14, y=1.02)
plt.tight_layout()
plt.savefig("fourier_scaling_property.png", dpi=150, bbox_inches="tight")
plt.show()
$a = 2$ のとき時間領域では狭いパルスとなりますが、周波数領域では広いスペクトルを持ちます。逆に $a = 0.5$ のとき時間領域では広いパルスとなり、周波数スペクトルは狭くなります。これが「時間幅と帯域幅はトレードオフ」という不確定性原理の直感的な理解です。
数値フーリエ変換の検証
import numpy as np
import matplotlib.pyplot as plt
# ガウスパルスの数値フーリエ変換と解析解の比較
dt = 0.01
t = np.arange(-10, 10, dt)
f_t = np.exp(-np.pi * t ** 2)
# 数値フーリエ変換(台形公式による近似)
nu_vals = np.linspace(-5, 5, 500)
F_numerical = np.zeros(len(nu_vals), dtype=complex)
for i, nu in enumerate(nu_vals):
F_numerical[i] = np.trapz(f_t * np.exp(-1j * 2 * np.pi * nu * t), t)
# 解析解
F_analytical = np.exp(-np.pi * nu_vals ** 2)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 振幅の比較
axes[0].plot(nu_vals, np.abs(F_numerical), 'b-', linewidth=2, label='Numerical')
axes[0].plot(nu_vals, F_analytical, 'r--', linewidth=2, label='Analytical')
axes[0].set_xlabel('$\\nu$')
axes[0].set_ylabel('$|F(\\nu)|$')
axes[0].set_title('Magnitude Comparison')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# 誤差
axes[1].plot(nu_vals, np.abs(np.abs(F_numerical) - F_analytical), 'k-', linewidth=1)
axes[1].set_xlabel('$\\nu$')
axes[1].set_ylabel('Absolute Error')
axes[1].set_title('Numerical Error')
axes[1].set_yscale('log')
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("fourier_transform_verification.png", dpi=150, bbox_inches="tight")
plt.show()
数値フーリエ変換(台形公式による積分近似)と解析解がよく一致しており、誤差は $10^{-4}$ 以下に収まっています。実用的には、後ほど解説する FFT アルゴリズムを用いてはるかに高速に計算します。
まとめ
本記事では、フーリエ変換の定義と主要な性質を体系的に解説しました。
- フーリエ変換は、フーリエ級数の周期 $T \to \infty$ の極限として自然に導出されます
- フーリエ変換 $F(\nu) = \int f(t) e^{-i2\pi\nu t} dt$ と逆変換 $f(t) = \int F(\nu) e^{i2\pi\nu t} d\nu$ は対をなします
- 線形性、時間シフト、周波数シフト、スケーリング、微分など多くの有用な性質を持ちます
- スケーリング性質は「時間幅と帯域幅のトレードオフ」(不確定性原理)を表します
- 微分が周波数領域での乗算に変わるため、微分方程式を代数方程式に変換できます
- ガウス関数は自分自身のフーリエ変換が自分自身となる特別な関数です
次のステップとして、以下の記事も参考にしてください。