フーリエ係数は、周期関数をフーリエ級数展開したときに各三角関数の前につく「重み」です。前回の記事では、フーリエ級数展開の定義とフーリエ係数の公式を導出しました。本記事では、フーリエ係数の計算方法と物理的な意味をさらに深く掘り下げます。
フーリエ係数を正しく理解することは、信号処理における周波数スペクトルの解析、通信工学におけるフィルタ設計、振動解析におけるモード分解など、理工学の幅広い応用に直結します。各係数が「元の関数のどの周波数成分をどれだけ含んでいるか」を定量的に教えてくれるからです。
本記事の内容
- 三角関数の直交性の復習と証明
- フーリエ係数 $a_0$, $a_n$, $b_n$ の導出(直交性を活用して1ステップずつ)
- 各フーリエ係数の物理的意味
- 具体的な計算例:矩形波と鋸歯状波
- パーセバルの等式(エネルギー保存の観点)
- Python による可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
フーリエ級数展開の復習
まず、フーリエ級数展開の定義を簡潔に復習しましょう。周期 $2\pi$ の周期関数 $f(x)$ がディリクレ条件を満たすとき、次のように三角関数の無限級数で表せます。
$$ f(x) = \frac{a_0}{2} + \sum_{n=1}^{\infty}\left(a_n \cos nx + b_n \sin nx\right) $$
ここで $a_0$, $a_n$, $b_n$ がフーリエ係数です。これらの係数を求めるには、三角関数の直交性が鍵となります。
三角関数の直交性
直交性とは
関数の直交性は、ベクトルの直交性の拡張です。2つのベクトル $\bm{u}$, $\bm{v}$ の内積 $\bm{u} \cdot \bm{v} = 0$ のとき、ベクトルは直交しているといいます。同様に、2つの関数 $g(x)$, $h(x)$ の内積を次のように定義し、これが $0$ になるとき、関数は直交しているといいます。
$$ \langle g, h \rangle = \int_{-\pi}^{\pi} g(x)\, h(x)\, dx = 0 $$
三角関数系 $\{1, \cos x, \sin x, \cos 2x, \sin 2x, \dots\}$ は、区間 $[-\pi, \pi]$ 上で互いに直交する完全直交系を成します。以下、3つのケースに分けて丁寧に証明します。
(1) cos と sin の直交
任意の正整数 $m$, $n$ に対して、次が成り立ちます。
$$ \int_{-\pi}^{\pi} \cos mx \cdot \sin nx\, dx = 0 $$
積和公式を用いて変形します。
$$ \cos mx \cdot \sin nx = \frac{1}{2}\left[\sin(m+n)x – \sin(m-n)x\right] $$
これを区間 $[-\pi, \pi]$ で積分すると、
$$ \begin{align} \int_{-\pi}^{\pi} \cos mx \cdot \sin nx\, dx &= \frac{1}{2}\int_{-\pi}^{\pi} \sin(m+n)x\, dx – \frac{1}{2}\int_{-\pi}^{\pi} \sin(m-n)x\, dx \end{align} $$
$\sin$ は奇関数であり、対称区間 $[-\pi, \pi]$ 上で積分すると $0$ になります。$m = n$ の場合も $\sin 0 = 0$ なので $0$ です。よって、
$$ \int_{-\pi}^{\pi} \cos mx \cdot \sin nx\, dx = 0 \quad (\text{任意の正整数 } m, n) $$
(2) cos 同士の直交
正整数 $m$, $n$ に対して、積和公式を使います。
$$ \cos mx \cdot \cos nx = \frac{1}{2}\left[\cos(m-n)x + \cos(m+n)x\right] $$
$m \neq n$ のとき、$m-n \neq 0$ かつ $m+n \neq 0$ なので、
$$ \begin{align} \int_{-\pi}^{\pi} \cos mx \cdot \cos nx\, dx &= \frac{1}{2}\int_{-\pi}^{\pi} \cos(m-n)x\, dx + \frac{1}{2}\int_{-\pi}^{\pi} \cos(m+n)x\, dx \\ &= \frac{1}{2}\left[\frac{\sin(m-n)x}{m-n}\right]_{-\pi}^{\pi} + \frac{1}{2}\left[\frac{\sin(m+n)x}{m+n}\right]_{-\pi}^{\pi} \\ &= \frac{1}{2} \cdot \frac{\sin(m-n)\pi – \sin(-(m-n)\pi)}{m-n} + \frac{1}{2} \cdot \frac{\sin(m+n)\pi – \sin(-(m+n)\pi)}{m+n} \\ &= \frac{\sin(m-n)\pi}{m-n} + \frac{\sin(m+n)\pi}{m+n} \end{align} $$
$(m-n)$ と $(m+n)$ はいずれも整数なので、$\sin(k\pi) = 0$($k$ は整数)より、
$$ \int_{-\pi}^{\pi} \cos mx \cdot \cos nx\, dx = 0 \quad (m \neq n) $$
$m = n$ のときは、半角公式を用いて、
$$ \begin{align} \int_{-\pi}^{\pi} \cos^2 nx\, dx &= \int_{-\pi}^{\pi} \frac{1 + \cos 2nx}{2}\, dx \\ &= \frac{1}{2}\left[x + \frac{\sin 2nx}{2n}\right]_{-\pi}^{\pi} \\ &= \frac{1}{2}\left[\left(\pi + 0\right) – \left(-\pi + 0\right)\right] \\ &= \pi \end{align} $$
(3) sin 同士の直交
同様に、積和公式を使います。
$$ \sin mx \cdot \sin nx = \frac{1}{2}\left[\cos(m-n)x – \cos(m+n)x\right] $$
$m \neq n$ のとき、
$$ \begin{align} \int_{-\pi}^{\pi} \sin mx \cdot \sin nx\, dx &= \frac{1}{2}\int_{-\pi}^{\pi} \cos(m-n)x\, dx – \frac{1}{2}\int_{-\pi}^{\pi} \cos(m+n)x\, dx \\ &= \frac{\sin(m-n)\pi}{m-n} – \frac{\sin(m+n)\pi}{m+n} \\ &= 0 – 0 = 0 \end{align} $$
$m = n$ のときは、
$$ \begin{align} \int_{-\pi}^{\pi} \sin^2 nx\, dx &= \int_{-\pi}^{\pi} \frac{1 – \cos 2nx}{2}\, dx \\ &= \frac{1}{2}\left[x – \frac{\sin 2nx}{2n}\right]_{-\pi}^{\pi} \\ &= \frac{1}{2}\left[\left(\pi – 0\right) – \left(-\pi – 0\right)\right] \\ &= \pi \end{align} $$
直交性のまとめ
三角関数の直交性をまとめると、次のようになります。
$$ \int_{-\pi}^{\pi} \cos mx \cdot \cos nx\, dx = \begin{cases} 0 & (m \neq n) \\ \pi & (m = n \geq 1) \end{cases} $$
$$ \int_{-\pi}^{\pi} \sin mx \cdot \sin nx\, dx = \begin{cases} 0 & (m \neq n) \\ \pi & (m = n \geq 1) \end{cases} $$
$$ \int_{-\pi}^{\pi} \cos mx \cdot \sin nx\, dx = 0 \quad (\text{任意の正整数 } m, n) $$
また、定数関数 $1$ との直交性として、
$$ \int_{-\pi}^{\pi} 1 \cdot \cos nx\, dx = 0, \quad \int_{-\pi}^{\pi} 1 \cdot \sin nx\, dx = 0 \quad (n \geq 1) $$
も成り立ちます。これらの関係が、フーリエ係数の導出において決定的な役割を果たします。
フーリエ係数の導出
三角関数の直交性を武器にして、フーリエ係数 $a_0$, $a_n$, $b_n$ を1ステップずつ導出します。
$a_0$ の導出
フーリエ級数展開の式の両辺を区間 $[-\pi, \pi]$ で積分します。
$$ \int_{-\pi}^{\pi} f(x)\, dx = \int_{-\pi}^{\pi} \frac{a_0}{2}\, dx + \sum_{n=1}^{\infty}\left(a_n \int_{-\pi}^{\pi} \cos nx\, dx + b_n \int_{-\pi}^{\pi} \sin nx\, dx\right) $$
右辺の各項を評価します。
$$ \begin{align} \int_{-\pi}^{\pi} \frac{a_0}{2}\, dx &= \frac{a_0}{2} \cdot 2\pi = a_0 \pi \\ \int_{-\pi}^{\pi} \cos nx\, dx &= \left[\frac{\sin nx}{n}\right]_{-\pi}^{\pi} = 0 \quad (n \geq 1) \\ \int_{-\pi}^{\pi} \sin nx\, dx &= \left[-\frac{\cos nx}{n}\right]_{-\pi}^{\pi} = 0 \quad (n \geq 1) \end{align} $$
$\cos nx$ と $\sin nx$ は $n \geq 1$ のとき周期の整数倍分の積分なので $0$ になります。よって、
$$ \int_{-\pi}^{\pi} f(x)\, dx = a_0 \pi $$
したがって、
$$ \boxed{a_0 = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\, dx} $$
$a_n$($n \geq 1$)の導出
フーリエ級数展開の両辺に $\cos mx$($m$ は正の整数)を掛けて $[-\pi, \pi]$ で積分します。
$$ \int_{-\pi}^{\pi} f(x)\cos mx\, dx = \frac{a_0}{2}\underbrace{\int_{-\pi}^{\pi} \cos mx\, dx}_{= 0} + \sum_{n=1}^{\infty}\left(a_n \int_{-\pi}^{\pi} \cos nx \cos mx\, dx + b_n \underbrace{\int_{-\pi}^{\pi} \sin nx \cos mx\, dx}_{= 0}\right) $$
直交性により、$\cos nx \cos mx$ の積分は $n \neq m$ のとき $0$、$n = m$ のとき $\pi$ です。また、$\sin nx \cos mx$ の積分は常に $0$ です。したがって、和の中で $n = m$ の項だけが残ります。
$$ \int_{-\pi}^{\pi} f(x)\cos mx\, dx = a_m \cdot \pi $$
$$ \boxed{a_m = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\cos mx\, dx} $$
これが $a_n$ の公式です。直交性のおかげで、特定の $n$ 番目の cos 成分の振幅だけを「フィルタリング」して取り出せるわけです。
$b_n$($n \geq 1$)の導出
同様に、両辺に $\sin mx$ を掛けて $[-\pi, \pi]$ で積分します。
$$ \int_{-\pi}^{\pi} f(x)\sin mx\, dx = \frac{a_0}{2}\underbrace{\int_{-\pi}^{\pi} \sin mx\, dx}_{= 0} + \sum_{n=1}^{\infty}\left(a_n \underbrace{\int_{-\pi}^{\pi} \cos nx \sin mx\, dx}_{= 0} + b_n \int_{-\pi}^{\pi} \sin nx \sin mx\, dx\right) $$
同じく直交性により、$\sin nx \sin mx$ の積分は $n = m$ のときだけ $\pi$、それ以外は $0$ です。
$$ \int_{-\pi}^{\pi} f(x)\sin mx\, dx = b_m \cdot \pi $$
$$ \boxed{b_m = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\sin mx\, dx} $$
以上で、3つのフーリエ係数の公式がすべて導出されました。ポイントは、「三角関数を掛けて積分する」という操作が、特定の周波数成分だけを抽出するフィルタとして機能していることです。
フーリエ係数の物理的意味
導出した3つの係数は、それぞれ明確な物理的意味を持っています。
$a_0$:直流成分(DC成分)
$$ a_0 = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\, dx $$
$a_0$ は関数 $f(x)$ の1周期分の平均値の $2$ 倍です(フーリエ級数の定義で $\frac{a_0}{2}$ として現れるため)。電気工学でいえば直流成分(DC 成分)に相当します。信号全体の「ゼロレベルのオフセット」を表しています。
例えば、$f(x)$ が上下に対称な波形(平均値 $0$)であれば $a_0 = 0$ です。信号全体が上にシフトしていれば $a_0 > 0$ となります。
$a_n$:余弦成分(偶関数成分)の振幅
$$ a_n = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\cos nx\, dx $$
$a_n$ は、周波数 $n$ の $\cos$ 成分がどれだけ含まれているかを表します。$\cos$ は偶関数なので、$a_n$ は $f(x)$ の偶関数的な成分を捉えています。
$f(x)$ が奇関数($f(-x) = -f(x)$)であれば、$f(x)\cos nx$ は奇関数 $\times$ 偶関数 $=$ 奇関数となり、対称区間での積分は $0$ です。よって、奇関数に対しては $a_n = 0$($n = 0, 1, 2, \dots$)となります。
$b_n$:正弦成分(奇関数成分)の振幅
$$ b_n = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\sin nx\, dx $$
$b_n$ は、周波数 $n$ の $\sin$ 成分がどれだけ含まれているかを表します。$\sin$ は奇関数なので、$b_n$ は $f(x)$ の奇関数的な成分を捉えています。
$f(x)$ が偶関数($f(-x) = f(x)$)であれば、$f(x)\sin nx$ は偶関数 $\times$ 奇関数 $=$ 奇関数となり、$b_n = 0$ です。
対称性とフーリエ係数の関係
関数の対称性とフーリエ係数の関係をまとめると、次の表になります。
| 関数の性質 | $a_0$ | $a_n$ | $b_n$ |
|---|---|---|---|
| 一般の関数 | $\neq 0$ | $\neq 0$ | $\neq 0$ |
| 偶関数 $f(-x) = f(x)$ | $\neq 0$ | $\neq 0$ | $= 0$ |
| 奇関数 $f(-x) = -f(x)$ | $= 0$ | $= 0$ | $\neq 0$ |
| 平均値 $0$ の関数 | $= 0$ | $\neq 0$ | $\neq 0$ |
この性質を活用すると、計算前に「どの係数が $0$ か」を見抜くことができ、計算量を大幅に減らせます。
計算例1:矩形波のフーリエ係数
周期 $2\pi$ の矩形波を次のように定義します。
$$ f(x) = \begin{cases} 1 & (0 < x < \pi) \\ -1 & (-\pi < x < 0) \end{cases} $$
この関数は奇関数です。したがって、先ほどの対称性の議論から、$a_0 = 0$, $a_n = 0$ であることが直ちにわかります。$b_n$ のみ計算すればよいのです。
$b_n$ の計算
$f(x)\sin nx$ は奇関数 $\times$ 奇関数 $=$ 偶関数なので、偶関数の対称性を利用します。
$$ \begin{align} b_n &= \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\sin nx\, dx \\ &= \frac{2}{\pi}\int_{0}^{\pi} f(x)\sin nx\, dx \quad (\because \text{偶関数の対称性}) \\ &= \frac{2}{\pi}\int_{0}^{\pi} 1 \cdot \sin nx\, dx \\ &= \frac{2}{\pi}\left[-\frac{\cos nx}{n}\right]_{0}^{\pi} \\ &= \frac{2}{\pi}\left(-\frac{\cos n\pi}{n} + \frac{1}{n}\right) \\ &= \frac{2}{n\pi}(1 – \cos n\pi) \end{align} $$
$\cos n\pi = (-1)^n$ を代入すると、
$$ b_n = \frac{2}{n\pi}(1 – (-1)^n) $$
$n$ が偶数のとき $b_n = 0$、$n$ が奇数のとき $b_n = \frac{4}{n\pi}$ です。矩形波のフーリエ級数は、
$$ f(x) = \frac{4}{\pi}\left(\sin x + \frac{\sin 3x}{3} + \frac{\sin 5x}{5} + \frac{\sin 7x}{7} + \cdots\right) = \frac{4}{\pi}\sum_{k=0}^{\infty}\frac{\sin(2k+1)x}{2k+1} $$
奇数次の $\sin$ のみが現れ、高次になるほど振幅 $\frac{4}{n\pi}$ が小さくなる($\frac{1}{n}$ に比例して減衰する)ことがわかります。
計算例2:鋸歯状波のフーリエ係数
次に、鋸歯状波(のこぎり波)のフーリエ係数を計算します。周期 $2\pi$ の鋸歯状波を次のように定義します。
$$ f(x) = x \quad (-\pi < x < \pi) $$
この関数も奇関数($f(-x) = -x = -f(x)$)です。したがって、$a_0 = 0$, $a_n = 0$ が成り立ち、$b_n$ のみ計算します。
$b_n$ の計算
偶関数の対称性($f(x)\sin nx$ が偶関数)を利用して、
$$ \begin{align} b_n &= \frac{1}{\pi}\int_{-\pi}^{\pi} x \sin nx\, dx \\ &= \frac{2}{\pi}\int_{0}^{\pi} x \sin nx\, dx \end{align} $$
部分積分を適用します。$u = x$, $dv = \sin nx\, dx$ とおくと、$du = dx$, $v = -\frac{\cos nx}{n}$ なので、
$$ \begin{align} \int_{0}^{\pi} x \sin nx\, dx &= \left[-\frac{x\cos nx}{n}\right]_{0}^{\pi} + \frac{1}{n}\int_{0}^{\pi} \cos nx\, dx \\ &= -\frac{\pi\cos n\pi}{n} + 0 + \frac{1}{n}\left[\frac{\sin nx}{n}\right]_{0}^{\pi} \\ &= -\frac{\pi\cos n\pi}{n} + \frac{1}{n^2}(\sin n\pi – \sin 0) \\ &= -\frac{\pi(-1)^n}{n} + 0 \\ &= \frac{(-1)^{n+1}\pi}{n} \end{align} $$
したがって、
$$ b_n = \frac{2}{\pi} \cdot \frac{(-1)^{n+1}\pi}{n} = \frac{2(-1)^{n+1}}{n} $$
具体的に書き下すと、
$$ b_1 = 2, \quad b_2 = -1, \quad b_3 = \frac{2}{3}, \quad b_4 = -\frac{1}{2}, \quad \dots $$
鋸歯状波のフーリエ級数は次のようになります。
$$ f(x) = 2\left(\sin x – \frac{\sin 2x}{2} + \frac{\sin 3x}{3} – \frac{\sin 4x}{4} + \cdots\right) = 2\sum_{n=1}^{\infty}\frac{(-1)^{n+1}}{n}\sin nx $$
矩形波との違いは、奇数次だけでなくすべての $n$ で $b_n \neq 0$ となる点です。また、符号が交互に入れ替わるのが特徴です。振幅は $\frac{2}{n}$ に比例して減衰し、矩形波と同じ $\frac{1}{n}$ のオーダーです。
パーセバルの等式
フーリエ係数に関する重要な定理として、パーセバルの等式(Parseval’s theorem)があります。これは「時間(空間)領域のエネルギーと周波数領域のエネルギーは等しい」ことを主張するもので、次のように書けます。
$$ \frac{1}{\pi}\int_{-\pi}^{\pi} |f(x)|^2\, dx = \frac{a_0^2}{2} + \sum_{n=1}^{\infty}(a_n^2 + b_n^2) $$
パーセバルの等式の導出
フーリエ級数展開の式を代入して示します。
$$ \frac{1}{\pi}\int_{-\pi}^{\pi} |f(x)|^2\, dx = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x) \cdot f(x)\, dx $$
$f(x)$ をフーリエ級数で置き換えます。
$$ = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x) \left[\frac{a_0}{2} + \sum_{n=1}^{\infty}(a_n \cos nx + b_n \sin nx)\right] dx $$
積分と和の順序を交換して、
$$ = \frac{a_0}{2} \cdot \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\, dx + \sum_{n=1}^{\infty}\left(a_n \cdot \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\cos nx\, dx + b_n \cdot \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\sin nx\, dx\right) $$
各積分はフーリエ係数の定義そのものです。
$$ \begin{align} &= \frac{a_0}{2} \cdot a_0 + \sum_{n=1}^{\infty}(a_n \cdot a_n + b_n \cdot b_n) \\ &= \frac{a_0^2}{2} + \sum_{n=1}^{\infty}(a_n^2 + b_n^2) \end{align} $$
これがパーセバルの等式です。
パーセバルの等式の物理的意味
左辺は $f(x)$ の二乗平均(パワー)に比例する量であり、信号のエネルギーに対応します。右辺は各周波数成分のパワーの総和です。つまり、パーセバルの等式は、フーリエ級数展開において信号のエネルギーが保存されることを保証しています。
具体例:矩形波でのパーセバルの等式
矩形波 $f(x) = \pm 1$ に対して検証してみましょう。
左辺は、
$$ \frac{1}{\pi}\int_{-\pi}^{\pi} |f(x)|^2\, dx = \frac{1}{\pi}\int_{-\pi}^{\pi} 1\, dx = \frac{2\pi}{\pi} = 2 $$
右辺は、$a_0 = 0$, $a_n = 0$, $b_n = \frac{4}{n\pi}$($n$ が奇数のみ)なので、
$$ \sum_{n=1,3,5,\dots}^{\infty} b_n^2 = \sum_{k=0}^{\infty}\left(\frac{4}{(2k+1)\pi}\right)^2 = \frac{16}{\pi^2}\sum_{k=0}^{\infty}\frac{1}{(2k+1)^2} $$
パーセバルの等式より、
$$ \frac{16}{\pi^2}\sum_{k=0}^{\infty}\frac{1}{(2k+1)^2} = 2 $$
$$ \sum_{k=0}^{\infty}\frac{1}{(2k+1)^2} = \frac{\pi^2}{8} $$
これは有名な級数の公式であり、$\frac{1}{1^2} + \frac{1}{3^2} + \frac{1}{5^2} + \cdots = \frac{\pi^2}{8}$ が得られます。パーセバルの等式からこのような美しい恒等式が導かれるのは注目に値します。
Pythonでの実装と可視化
矩形波と鋸歯状波のフーリエ級数近似を Python で実装し、項数を変えながら収束の様子を確認しましょう。
import numpy as np
import matplotlib.pyplot as plt
# --- 矩形波 ---
def square_wave(x):
"""周期2πの矩形波"""
x_mod = np.mod(x + np.pi, 2 * np.pi) - np.pi
y = np.where(x_mod > 0, 1.0, -1.0)
y[np.isclose(x_mod, 0)] = 0
return y
def fourier_square(x, N):
"""矩形波のフーリエ級数近似(奇数次N項まで)"""
result = np.zeros_like(x, dtype=float)
for k in range(N):
n = 2 * k + 1
result += (4.0 / (n * np.pi)) * np.sin(n * x)
return result
# --- 鋸歯状波 ---
def sawtooth_wave(x):
"""周期2πの鋸歯状波 f(x) = x on (-π, π)"""
x_mod = np.mod(x + np.pi, 2 * np.pi) - np.pi
return x_mod
def fourier_sawtooth(x, N):
"""鋸歯状波のフーリエ級数近似(N項まで)"""
result = np.zeros_like(x, dtype=float)
for n in range(1, N + 1):
result += (2.0 * (-1) ** (n + 1) / n) * np.sin(n * x)
return result
# --- 可視化 ---
x = np.linspace(-2 * np.pi, 2 * np.pi, 2000)
N_values = [1, 3, 5, 10, 50]
fig, axes = plt.subplots(2, len(N_values), figsize=(18, 7), sharex=True)
# 矩形波(上段)
for i, N in enumerate(N_values):
ax = axes[0, i]
ax.plot(x, square_wave(x), 'k--', linewidth=0.8, alpha=0.5, label='Exact')
ax.plot(x, fourier_square(x, N), 'b-', linewidth=1.2, label=f'N={N}')
ax.set_ylim(-1.8, 1.8)
ax.set_title(f'Square wave (N={N})')
ax.legend(fontsize=8)
ax.grid(True, alpha=0.3)
# 鋸歯状波(下段)
for i, N in enumerate(N_values):
ax = axes[1, i]
ax.plot(x, sawtooth_wave(x), 'k--', linewidth=0.8, alpha=0.5, label='Exact')
ax.plot(x, fourier_sawtooth(x, N), 'r-', linewidth=1.2, label=f'N={N}')
ax.set_ylim(-4.5, 4.5)
ax.set_title(f'Sawtooth wave (N={N})')
ax.legend(fontsize=8)
ax.grid(True, alpha=0.3)
axes[0, 0].set_ylabel('Square wave')
axes[1, 0].set_ylabel('Sawtooth wave')
for i in range(len(N_values)):
axes[1, i].set_xlabel('x')
plt.suptitle('Fourier Series Approximation', fontsize=14, y=1.02)
plt.tight_layout()
plt.savefig('fourier_coefficients_convergence.png', dpi=150, bbox_inches='tight')
plt.show()
上記コードを実行すると、上段に矩形波、下段に鋸歯状波のフーリエ級数近似が描画されます。$N=1$ では単純な $\sin$ 波ですが、$N$ を増やすにつれて元の波形に近づいていきます。$N=50$ ではかなり良い近似が得られますが、不連続点付近にはギブス現象によるオーバーシュートが残ります。
次に、パーセバルの等式を数値的に検証するコードも示します。
import numpy as np
# --- パーセバルの等式の数値検証(矩形波)---
# 左辺: (1/π) ∫|f(x)|^2 dx
x = np.linspace(-np.pi, np.pi, 100000)
f = np.where(x > 0, 1.0, -1.0)
lhs = np.trapz(f**2, x) / np.pi
# 右辺: Σ b_n^2(奇数次のみ)
N_max = 1000
rhs = 0.0
for k in range(N_max):
n = 2 * k + 1
b_n = 4.0 / (n * np.pi)
rhs += b_n**2
print(f"左辺(信号のパワー): {lhs:.10f}")
print(f"右辺(フーリエ係数のパワー和, N={N_max}項): {rhs:.10f}")
print(f"差: {abs(lhs - rhs):.2e}")
# おまけ: Σ 1/(2k+1)^2 = π^2/8 の検証
series_sum = sum(1.0 / (2*k+1)**2 for k in range(10000))
print(f"\nΣ 1/(2k+1)^2 = {series_sum:.10f}")
print(f"π^2/8 = {np.pi**2/8:.10f}")
実行すると、左辺と右辺がほぼ一致し、パーセバルの等式が数値的にも成立していることを確認できます。また、$\sum \frac{1}{(2k+1)^2} = \frac{\pi^2}{8}$ という恒等式も数値的に検証されます。
最後に、フーリエ係数のスペクトル(各周波数成分の振幅)を可視化します。
import numpy as np
import matplotlib.pyplot as plt
# フーリエ係数のスペクトル表示
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
n_max = 20
# 矩形波のスペクトル
n_sq = np.arange(1, n_max + 1)
b_sq = np.array([4.0 / (n * np.pi) if n % 2 == 1 else 0.0 for n in n_sq])
axes[0].stem(n_sq, np.abs(b_sq), linefmt='b-', markerfmt='bo', basefmt='k-')
axes[0].set_xlabel('n (harmonic number)')
axes[0].set_ylabel('|b_n|')
axes[0].set_title('Square Wave: Fourier Coefficient Spectrum')
axes[0].grid(True, alpha=0.3)
axes[0].set_xticks(n_sq)
# 鋸歯状波のスペクトル
n_st = np.arange(1, n_max + 1)
b_st = np.array([2.0 * (-1)**(n+1) / n for n in n_st])
axes[1].stem(n_st, np.abs(b_st), linefmt='r-', markerfmt='ro', basefmt='k-')
axes[1].set_xlabel('n (harmonic number)')
axes[1].set_ylabel('|b_n|')
axes[1].set_title('Sawtooth Wave: Fourier Coefficient Spectrum')
axes[1].grid(True, alpha=0.3)
axes[1].set_xticks(n_st)
plt.tight_layout()
plt.savefig('fourier_spectrum.png', dpi=150, bbox_inches='tight')
plt.show()
このスペクトル図により、矩形波が奇数次高調波のみを含むのに対し、鋸歯状波はすべての高調波を含むことが視覚的に確認できます。いずれも $\frac{1}{n}$ に比例して減衰していきます。
まとめ
本記事では、フーリエ係数の計算方法と物理的意味について解説しました。
- 三角関数の直交性を利用すると、フーリエ級数の各係数を独立に抽出できます。「三角関数を掛けて積分する」操作が、特定周波数成分のフィルタとして機能します
- $a_0$ は直流成分(信号の平均値)、$a_n$ は余弦(偶関数)成分の振幅、$b_n$ は正弦(奇関数)成分の振幅を表します
- 関数の対称性(偶関数・奇関数)を利用すると、計算前にどの係数が $0$ かを判定でき、計算を大幅に簡略化できます
- 矩形波のフーリエ係数は奇数次の $b_n = \frac{4}{n\pi}$ のみ、鋸歯状波は全次数の $b_n = \frac{2(-1)^{n+1}}{n}$ となります
- パーセバルの等式は、時間領域と周波数領域でエネルギーが保存されることを保証し、フーリエ係数から美しい級数公式を導くこともできます
次のステップとして、以下のトピックも参考にしてください。
- 周期関数の制約を外して任意の関数を扱えるように拡張したフーリエ変換
- 離散的な信号に適用する離散フーリエ変換(DFT)と高速フーリエ変換(FFT)
- 複素指数関数を用いた複素フーリエ級数