音のうなりと三角関数の積和公式・干渉の数理
2つの近い周波数が生む心地よい揺らぎ — 包絡線と楽器チューニングの原理
- 1
- 周波数がわずかに異なる2つの純音(例えば440Hzと442Hz)を同時に鳴らすと、音量が1秒間に2回周期的に「ウワン、ウワン」と揺らぐ現象を『うなり(Beats)』と呼ぶ
- 2
- 高校数学で学ぶ三角関数の和積公式 によって、高速振動波が低速な包絡線(エンベロープ)で変調される構造が完全に説明される
- 3
- オーケストラの楽器調律(うなりが消えるまでペグを回す)、ドップラー超音波血流計、ヘテロダイン無線受信機などの工学の根幹
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
受験数学で『丸暗記させられて嫌になる公式ワースト1』になりがちな三角関数の積和・和積公式が、耳で聴こえるリアルな音の現象と100%一致する感動を味わえます。ギターのチューニングで『うなりを消す=周波数が完全一致した証拠』という直感を数式で解き明かせます。
身につく武器・思考力
振幅変調(AM変調)の信号処理直感、三角関数の合成・積和変形の幾何学的イメージ、音響エンジニアリング基礎
実社会・ITでの活躍現場
- •ギターやピアノ調律師による開放弦ハーモニクスを使ったうなりゼロ合わせチューニング
- •医療用超音波ドップラー血流計(血流速度による反射波のうなり周波数解析)
- •ラジオ・Wi-Fi受信機のスーパーヘテロダイン周波数変換ミキサー回路
- •バイノーラルビート(左右の耳にわずかに異なる周波数を聴かせて脳波誘導を促す音響技術)
Layer 1 — 直感・シミュレーター
『うなりを聴く』ボタンを押すと、Web Audio APIが2つの正弦波を同時に出力します。スライダーで周波数差 を 0.2Hz(ゆっくりした大きな波)から 8.0Hz(小刻みな濁り)まで変化させると、上の波形の包絡線(オレンジの点線)の周期と、耳で聴こえる音量の揺らぎ回数が完全に一致することを体感できます。
440 Hz の音叉と、わずかに調律が狂ったギターの弦を同時に鳴らしたところ、1秒間に4回のうなりが聞こえた。ギター弦の周波数として考えられるものはどれか?
Layer 2 — 定義・受験・証明
定義
**うなり(Beats)**とは、周波数がわずかに異なる2つの波が重ね合わさる(干渉する)ことで、それらの周波数の差 に等しい周期的な振幅の増減(音量の明滅)が生じる波動現象である。
公式・数理モデル
証明・導出
**三角関数の加法定理からの和積公式の導出** 加法定理より:
両式を足し合わせると:
ここで , と変数変換すると、, であるため:
角周波数 , を代入すると:
音の強さ(エネルギー)は振幅の2乗に比例するため、 が でも でも最大音量となる。したがって包絡線が半周期進むごとに1回のピークが訪れるため、うなりの周波数は となる(Q.E.D.)。
押さえておきたいポイント
- 聴こえる音の高さは2つの周波数の平均値 であり、音量の揺らぎは周波数の差 である
- 周波数差が 15Hz 以上離れると、人間の耳は「うなり(周期的な音量変化)」ではなく「2つの異なる濁った和音」または「差音」として知覚するようになる
- AMラジオ放送の振幅変調(Amplitude Modulation)も、この三角関数の積和公式と全く同一の原理である
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
合成音声のうなり波形生成およびスペクトル解析コード
2つの正弦波を重ね合わせてうなり音を合成し、包絡線のヒルベルト変換とFFT周波数ピークを出力するPythonコードです。
1import numpy as np23# サンプリング設定4fs = 44100 # サンプリング周波数 (Hz)5duration = 2.0 # 2秒間6t = np.linspace(0, duration, int(fs * duration), endpoint=False)78# 2つの周波数 (Hz)9f1 = 440.0 # A410f2 = 443.0 # 3Hz高い音1112# 波形の重ね合わせ13wave1 = np.sin(2 * np.pi * f1 * t)14wave2 = np.sin(2 * np.pi * f2 * t)15beat_wave = 0.5 * (wave1 + wave2)1617# うなり周波数の理論値18f_beat_theory = abs(f1 - f2)19f_carrier_theory = (f1 + f2) / 2.02021print(f"基音1: {f1} Hz, 基音2: {f2} Hz")22print(f"知覚されるキャリア音高: {f_carrier_theory:.1f} Hz")23print(f"1秒間のうなり回数: {f_beat_theory:.1f} 回 (周期 {1.0/f_beat_theory:.3f} 秒)")24# waveファイルを保存して聴くことも可能25# from scipy.io import wavfile; wavfile.write("beats.wav", fs, (beat_wave * 32767).astype(np.int16))
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元