🎼 三角関数恒等式を「音波」で理解する:ドの音とFFT解析
概要
音は波、つまり**正弦波(サイン波)**です。たとえば「ド(C4)」の音はおよそ 261.6 Hz の正弦波として表されます:
$$
s(t) = \sin(2\pi f t)
$$
ここで、三角関数の恒等式を用いれば、複数の音の合成や分解、倍音や干渉などの音響現象を数式として理解できます。
📐 各恒等式を音波として解釈
🔹 加法定理(合成波の原理)
式:
$$
\sin(a \pm b) = \sin(a)\cos(b) \pm \cos(a)\sin(b)
$$
音としての意味:
2つの異なる周波数の音が合成された時、それぞれの振幅が混ざり合って別の成分を形成します。
🔹 倍角公式(倍音)
式:
$$
\sin(2θ) = 2\sinθ\cosθ
$$
音としての意味:
「ド」(261.6 Hz)→ sin波 → 倍角になると 523.2 Hz(1オクターブ上の「ド」)。倍音生成の数学的根拠です。
🔹 二重角の cos と tan
式:
$$
\cos(2θ) = \cos^2θ − \sin^2θ = 2\cos^2θ − 1 = 1 − 2\sin^2θ \
\tan(2θ) = \frac{2\tanθ}{1 − \tan^2θ}
$$
音としての意味:
位相差や振幅比の変換に現れる。特にLissajous図形などに関係。
🔹 半角公式(包絡線と振幅の分離)
式:
$$
\sin^2θ = \frac{1 − \cos(2θ)}{2},\quad \cos^2θ = \frac{1 + \cos(2θ)}{2}
$$
音としての意味:
振幅変調(AM)信号の包絡線として使われる。エネルギー分布の解析にも応用。
🔹 積和公式(AM・FM合成)
式:
$$
\sin(a)\sin(b) = \frac{1}{2} [\cos(a − b) − \cos(a + b)] \
\cos(a)\cos(b) = \frac{1}{2} [\cos(a − b) + \cos(a + b)] \
\sin(a)\cos(b) = \frac{1}{2} [\sin(a + b) + \sin(a − b)]
$$
音としての意味:
**AM(振幅変調)やFM(周波数変調)**の合成波がこれに対応。AMラジオの搬送波と情報信号の合成式と同様。
🔹 和積公式(ビート現象)
式:
$$
\sin(a) ± \sin(b) = 2\sin\left(\frac{a ± b}{2}\right)\cos\left(\frac{a ∓ b}{2}\right)
$$
音としての意味:
近い音同士が合成されると「うなり(ビート)」が発生します。これは振幅が周期的に変化する現象。
🎧 FFTでの観測
入力信号:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft
fs = 44100
t = np.linspace(0, 0.02, int(fs*0.02), endpoint=False)
a = 2 * np.pi * 261.6 * t # ド(C4)
b = 2 * np.pi * 293.7 * t # レ(D4)
s = np.sin(a) + np.sin(b) # 合成波
# FFT
fft_result = fft(s)
freqs = np.fft.fftfreq(len(t), 1/fs)
magnitude = np.abs(fft_result)[:len(t)//2]
plt.plot(freqs[:1000], magnitude[:1000])
plt.title("FFT of sin(C4) + sin(D4)")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")
plt.grid()
plt.show()
出力:
- 261.6Hz と 293.7Hz にピーク
- (261.6 + 293.7)/2 = 277.65Hz の振幅変調も視認可能
- ビート周波数 32.1Hz の包絡も
🔁 応用例:サイン波をベースにした音響処理
式種別 | 応用例 | FFT結果 |
---|---|---|
加法定理 | 周波数変調 (FM合成) | 平均・差周波数が現れる |
倍角公式 | 倍音(1オクターブ上) | 周波数2倍のピーク |
和積公式 | ビート(うなり)生成 | 2ピーク+包絡周波数 |
積和公式 | AM/FM合成波のモデリング | サイドバンド成分 |
半角公式 | エネルギー/包絡線抽出 | 平均成分と倍周波成分が見える |
🧠 まとめ
これらの三角関数恒等式は、音の合成・分解・変調の本質を数式で表すものであり、音響合成、楽器モデリング、音声処理に不可欠です。
■ 補足:$\sin^n(\omega t)$ のFFTとは?
- $\sin(\omega t)$ のべき乗は、単純な正弦波とは異なり、**複数の高調波(倍音)**を含みます。
- 特に 奇数 n では奇数次高調波、偶数 n では偶数次高調波が現れます。
■ 例1:$\sin^2(\omega t)$
三角恒等式より:
$$
\sin^2(\omega t) = \frac{1 - \cos(2\omega t)}{2}
$$
⇒ 含まれる周波数成分:
- DC成分(0 Hz)
- $2\omega$(2倍の周波数)
■ 例2:$\sin^3(\omega t)$
$$
\sin^3(\omega t) = \frac{3\sin(\omega t) - \sin(3\omega t)}{4}
$$
⇒ 含まれる周波数成分:
- $\omega$(基本周波数)
- $3\omega$(3倍音)
■ 一般公式(Fourier展開)
$$
\sin^n(\omega t) = \sum_{k=1,3,5,\dots}^{n} a_k \sin(k\omega t) \quad \text{(n odd)}
$$
$$
\sin^n(\omega t) = \sum_{k=0,2,4,\dots}^{n} b_k \cos(k\omega t) \quad \text{(n even)}
$$
係数 $a_k, b_k$ は ベッセル関数や組合せ係数で決まります。
■ Python 実装例(FFTによる観察)
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq
# パラメータ
fs = 10000
T = 1.0
t = np.linspace(0, T, int(fs*T), endpoint=False)
f0 = 50 # 基本周波数(Hz)
w = 2 * np.pi * f0
# 正弦波のべき乗
n = 3
y = np.sin(w * t)**n
# FFT
Y = fft(y)
freq = fftfreq(len(t), 1/fs)
mag = np.abs(Y)[:len(t)//2]
# グラフ
plt.plot(freq[:1000], mag[:1000])
plt.title(f"FFT of sin^{n}(2π×{f0}t)")
plt.xlabel("Frequency [Hz]")
plt.ylabel("Amplitude")
plt.grid()
plt.show()
■ 結果と解釈(例: $n=3$)
-
$f_0 = 50$ Hz の正弦波なら、FFTで:
- 50 Hz のピーク(基本音)
- 150 Hz のピーク(3次高調波)
-
音楽的には「倍音構成」、波動物理では「非線形振動」のスペクトルとして利用。
■ 応用例
n | 名称 | 含まれる周波数 | 音響効果 |
---|---|---|---|
2 | 二乗波 | DC, $2f$ | AM変調、包絡線抽出 |
3 | 立方波 | $f$, $3f$ | 倍音豊かな音 |
4 | 4乗波 | DC, $2f$, $4f$ | ブザー、角波近似 |
n高次 | 高次非線形波 | $f, 3f, 5f, \dots, nf$ | 減衰、歪み分析 |