Math World Lab

音声圧縮の仕組み(周波数成分と人間の聴覚特性)

音波をフーリエ分解し、耳に聞こえにくい成分を削って情報量を減らす数学

この単元の発見をシェア
3行要約(Key Takeaways / AIOサマリー)
1
どんな複雑な音波も、フーリエ級数によって「周波数と振幅の異なる複数のサイン波の足し算」として分解できる(フーリエの定理)
2
音声圧縮(MP3など)はこの分解を利用し、音の各周波数成分をフーリエ変換で取り出したあと、振幅が小さく人間の耳に聞こえにくい成分ほど大胆にデータを削減する
3
全ての周波数成分を保持しなくても、主要な成分だけ残せば人間の耳にはほとんど区別がつかない近似音が再現できる、という点が非可逆圧縮(lossy compression)の数学的な根拠になっている

なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値

Purpose & Motivation

なぜ生まれたのか?

どんな複雑な音波も、フーリエ級数によって「周波数と振幅の異なる複数のサイン波の足し算」として分解できる(フーリエの定理)

身につく武器・思考力

音声圧縮(MP3など)はこの分解を利用し、音の各周波数成分をフーリエ変換で取り出したあと、振幅が小さく人間の耳に聞こえにくい成分ほど大胆にデータを削減する

実社会・ITでの活躍現場

  • •音声圧縮における周波数成分の分解と低寄与成分の除去(簡略化モデル)
  • •ITシステム・アルゴリズム実装における論理設計
  • •データ分析やシミュレーションにおける数理モデリング

Layer 1 — 直感・シミュレーター

3本のサイン波(周波数・振幅をスライダーで調整可能)を自由に設定すると、それらを足し合わせた合成波形がグラフに描かれる。各サイン波の振幅バーの右にある「除去」ボタンを押すと、そのサイン波を波形の合成から取り除いた「圧縮後」の波形が重ねて表示され、振幅が最も小さい成分を消しても全体の波形がほとんど変わらないことを視覚的に確認できる。

3本のサイン波の周波数・振幅を調整し、振幅の小さい成分を「除去」ボタンで消してみよう。波形がどれだけ変わるかを観察できる。
成分 1
成分 2
成分 3
最大波形誤差: 0.000

グレー線が全成分の合成波、青線が「除去」した成分を除いた圧縮後の波形です。振幅の小さい成分を消しても波形はほぼ変わりません。

↑ パーセバルの定理により、波形のエネルギーは各周波数成分のエネルギーの和に分解できます。振幅(エネルギー寄与)が小さい成分から間引くと誤差が最小限に抑えられる、というのがMP3などの非可逆音声圧縮の簡略化された数学的直感です(実際のMP3はさらに聴覚のマスキング効果も利用します)。

直感チェック!ミニクイズ

複数のサイン波を足し合わせた音波から、振幅が最も小さい周波数成分を1つ取り除くと、波形と聞こえ方はどうなるか?

Layer 2 — 定義・受験・証明

定義

任意の周期的な信号(音波の圧力変化)f(t)f(t) は、フーリエ級数として、異なる周波数 ωk\omega_k と振幅 AkA_k、位相 ϕk\phi_k を持つ複数のサイン波(正弦波)の重ね合わせで表現できる。

f(t)=∑k=1KAksin⁡(ωkt+ϕk)f(t) = \sum_{k=1}^{K} A_k \sin(\omega_k t + \phi_k)

逆に、実際に観測された波形 f(t)f(t) から各周波数成分の振幅 AkA_k を取り出す操作がフーリエ変換(離散信号の場合は離散フーリエ変換, DFT)であり、

Ak∝∣∑n=0N−1f(tn)e−iωktn∣A_k \propto \left| \sum_{n=0}^{N-1} f(t_n) e^{-i\omega_k t_n} \right|

として計算される。音声圧縮は、この AkA_k の分布のうち小さい成分を間引く(省略・粗く量子化する)ことでデータ量を削減する。

公式・数理モデル

f(t)=∑k=1KAksin⁡(ωkt+ϕk),f^(t)=∑k∈SAksin⁡(ωkt+ϕk)  (S:保持する成分の集合)f(t) = \sum_{k=1}^{K} A_k \sin(\omega_k t + \phi_k), \qquad \hat f(t) = \sum_{k \in S} A_k \sin(\omega_k t + \phi_k) \;(S: \text{保持する成分の集合})

証明・導出

近似誤差がエネルギー(振幅の2乗)の小さい成分を省くことで最小化されることの証明:

サイン波の直交性より、異なる周波数 k≠jk \ne j の成分同士は1周期にわたる積分において打ち消し合う。

∫0Tsin⁡(ωkt+ϕk)sin⁡(ωjt+ϕj) dt=0(k≠j,  ωk,ωjが基本周波数の整数倍のとき)\int_0^T \sin(\omega_k t+\phi_k)\sin(\omega_j t+\phi_j)\,dt = 0 \quad (k\ne j,\; \omega_k,\omega_j \text{が基本周波数の整数倍のとき})

この直交性により、信号全体のエネルギー(パワー)は各周波数成分のエネルギーの単純な和として分解できる(パーセバルの定理)。

∫0Tf(t)2 dt=∑k=1KAk2T2\int_0^T f(t)^2\,dt = \sum_{k=1}^{K} \frac{A_k^2 T}{2}

いま、KK 個の成分のうち一部の集合 SS だけを残して近似信号 f^(t)=∑k∈SAksin⁡(ωkt+ϕk)\hat f(t) = \sum_{k \in S} A_k \sin(\omega_k t+\phi_k) を作ったときの誤差エネルギーは、直交性により取り除いた成分(k∉Sk \notin S)のエネルギーの和にちょうど一致する。

∫0T(f(t)−f^(t))2 dt=∑k∉SAk2T2\int_0^T (f(t)-\hat f(t))^2\,dt = \sum_{k \notin S} \frac{A_k^2 T}{2}

したがって、限られた個数の成分しか残せないという制約のもとで誤差エネルギーを最小にするには、振幅 AkA_k が小さい(=エネルギー寄与が小さい)成分から優先的に取り除けばよい、ということが数学的に導かれる。これが「振幅の小さい周波数成分から削る」圧縮戦略の正当性を保証している。

押さえておきたいポイント

  • 実際のMP3圧縮は、単に振幅の大小だけでなく「人間の聴覚のマスキング効果(大きな音の近くの周波数の小さな音は聞こえにくくなる心理音響モデル)」も利用しており、ここで示した振幅ベースの説明はその簡略化されたアナロジーである
  • パーセバルの定理(信号のエネルギーは周波数成分ごとのエネルギーの和に等しい)が、どの成分を削るとどれだけ誤差が増えるかを定量的に保証している
  • 非可逆圧縮(lossy compression)は、この誤差が人間の知覚では気づかれない範囲に収まるように成分を削減する設計思想に基づく
  • 同じ「周波数成分に分解し、寄与の小さい成分を間引く」という発想は画像圧縮のDCT(離散コサイン変換)とも共通する圧縮の基本原理である
参照基準・学習指導要領との対応

本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。

Layer 3 — 工学応用・現場実装

音声圧縮における周波数成分の分解と低寄与成分の除去(簡略化モデル)

複数のサイン波の合成として表現された音声信号から、離散フーリエ変換に相当する処理で各周波数成分の振幅を評価し、寄与の小さい成分を除去してデータ量を削減する、非可逆音声圧縮の考え方を簡略化したTypeScript実装。

1type SineComponent = { frequency: number; amplitude: number; phase: number };
2
3// 複数のサイン波成分を1つの波形(サンプル列)に合成する
4function synthesizeWaveform(
5 components: SineComponent[],
6 sampleCount: number,
7 duration: number
8): number[] {
9 const samples: number[] = [];
10 for (let n = 0; n < sampleCount; n++) {
11 const t = (n / sampleCount) * duration;
12 let value = 0;
13 for (const c of components) {
14 value += c.amplitude * Math.sin(2 * Math.PI * c.frequency * t + c.phase);
15 }
16 samples.push(value);
17 }
18 return samples;
19}
20
21// 振幅が小さい(聴感上の寄与が小さい)成分を間引いて圧縮する
22function compressByAmplitude(
23 components: SineComponent[],
24 keepCount: number
25): SineComponent[] {
26 return [...components]
27 .sort((a, b) => b.amplitude - a.amplitude) // 振幅の大きい順にソート
28 .slice(0, keepCount); // 上位 keepCount 個だけ残す
29}
30
31// 例: 3つの周波数成分から成る音(基音 + 倍音2つ)
32const originalTone: SineComponent[] = [
33 { frequency: 440, amplitude: 1.0, phase: 0 }, // 基音(ラ, A4)
34 { frequency: 880, amplitude: 0.3, phase: 0 }, // 2倍音
35 { frequency: 1320, amplitude: 0.05, phase: 0 }, // 3倍音(振幅が最小)
36];
37
38const compressedTone = compressByAmplitude(originalTone, 2); // 上位2成分のみ保持
39console.log("圧縮後に保持する成分:", compressedTone);
40
41const originalWave = synthesizeWaveform(originalTone, 100, 0.01);
42const compressedWave = synthesizeWaveform(compressedTone, 100, 0.01);
43console.log("波形の平均誤差:",
44 originalWave.reduce((sum, v, i) => sum + Math.abs(v - compressedWave[i]), 0) / 100
45);

次に学ぶならコレ!おすすめトピック

この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元

数理モデル・概念が近い関連トピック

関連度高工学応用

画像圧縮の仕組み(離散コサイン変換の直感)

少数のコサイン波の足し算だけで、画像の明るさの並びを近似する数学

関連度高大学数学

フーリエ変換と周波数分解

どんなに複雑な波も、単純なサイン波の重ね合わせに分解できる

y = v₀t - ½gt²
関連度高中学数学

ゲーム物理とジャンプの放物線(二次関数の運動学)

「なぜマリオは気持ちよく跳べるのか?」重力加速度と二次関数で創る2Dアクションの物理

同じレベルで次に挑戦したいトピック

同レベル推薦工学応用

勾配降下法

谷底を探すAIの基本アルゴリズム

同レベル推薦工学応用

ニューラルネットワークの数学(順伝播と活性化関数)

入力に重みを掛けて足し合わせ、非線形関数で発火させるAIの基本素子

同レベル推薦工学応用

レコメンドの仕組み(コサイン類似度とベクトル検索)

ユーザーの好みと商品の近さを「ベクトルのなす角」で判定するアルゴリズム

工学・実社会での応用先でつながるトピック

工学・実践連携小学校・算数

比例と反比例

y=kxy = kx と y=kxy = \frac{k}{x}、グラフと表はどう違う?

工学・実践連携中学数学

二次関数と放物線

a, b, c を動かすと放物線の形と位置はどう変わる?

工学・実践連携中学数学

円の方程式(基礎)

中心と半径を動かして、円の方程式が「距離」そのものであることを確かめる

あなたの数学力をさらに伸ばす

数学の弱点診断や算数パズルに挑戦してみませんか?

簡単な質問に答えてあなたにぴったりの学習ロードマップを発見したり、直感を試すパズルで数の面白さを体験できます。