音声圧縮の仕組み(周波数成分と人間の聴覚特性)
音波をフーリエ分解し、耳に聞こえにくい成分を削って情報量を減らす数学
- 1
- どんな複雑な音波も、フーリエ級数によって「周波数と振幅の異なる複数のサイン波の足し算」として分解できる(フーリエの定理)
- 2
- 音声圧縮(MP3など)はこの分解を利用し、音の各周波数成分をフーリエ変換で取り出したあと、振幅が小さく人間の耳に聞こえにくい成分ほど大胆にデータを削減する
- 3
- 全ての周波数成分を保持しなくても、主要な成分だけ残せば人間の耳にはほとんど区別がつかない近似音が再現できる、という点が非可逆圧縮(lossy compression)の数学的な根拠になっている
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
どんな複雑な音波も、フーリエ級数によって「周波数と振幅の異なる複数のサイン波の足し算」として分解できる(フーリエの定理)
身につく武器・思考力
音声圧縮(MP3など)はこの分解を利用し、音の各周波数成分をフーリエ変換で取り出したあと、振幅が小さく人間の耳に聞こえにくい成分ほど大胆にデータを削減する
実社会・ITでの活躍現場
- •音声圧縮における周波数成分の分解と低寄与成分の除去(簡略化モデル)
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
3本のサイン波(周波数・振幅をスライダーで調整可能)を自由に設定すると、それらを足し合わせた合成波形がグラフに描かれる。各サイン波の振幅バーの右にある「除去」ボタンを押すと、そのサイン波を波形の合成から取り除いた「圧縮後」の波形が重ねて表示され、振幅が最も小さい成分を消しても全体の波形がほとんど変わらないことを視覚的に確認できる。
グレー線が全成分の合成波、青線が「除去」した成分を除いた圧縮後の波形です。振幅の小さい成分を消しても波形はほぼ変わりません。
↑ パーセバルの定理により、波形のエネルギーは各周波数成分のエネルギーの和に分解できます。振幅(エネルギー寄与)が小さい成分から間引くと誤差が最小限に抑えられる、というのがMP3などの非可逆音声圧縮の簡略化された数学的直感です(実際のMP3はさらに聴覚のマスキング効果も利用します)。
複数のサイン波を足し合わせた音波から、振幅が最も小さい周波数成分を1つ取り除くと、波形と聞こえ方はどうなるか?
Layer 2 — 定義・受験・証明
定義
任意の周期的な信号(音波の圧力変化) は、フーリエ級数として、異なる周波数 と振幅 、位相 を持つ複数のサイン波(正弦波)の重ね合わせで表現できる。
逆に、実際に観測された波形 から各周波数成分の振幅 を取り出す操作がフーリエ変換(離散信号の場合は離散フーリエ変換, DFT)であり、
として計算される。音声圧縮は、この の分布のうち小さい成分を間引く(省略・粗く量子化する)ことでデータ量を削減する。
公式・数理モデル
証明・導出
近似誤差がエネルギー(振幅の2乗)の小さい成分を省くことで最小化されることの証明:
サイン波の直交性より、異なる周波数 の成分同士は1周期にわたる積分において打ち消し合う。
この直交性により、信号全体のエネルギー(パワー)は各周波数成分のエネルギーの単純な和として分解できる(パーセバルの定理)。
いま、 個の成分のうち一部の集合 だけを残して近似信号 を作ったときの誤差エネルギーは、直交性により取り除いた成分()のエネルギーの和にちょうど一致する。
したがって、限られた個数の成分しか残せないという制約のもとで誤差エネルギーを最小にするには、振幅 が小さい(=エネルギー寄与が小さい)成分から優先的に取り除けばよい、ということが数学的に導かれる。これが「振幅の小さい周波数成分から削る」圧縮戦略の正当性を保証している。
押さえておきたいポイント
- 実際のMP3圧縮は、単に振幅の大小だけでなく「人間の聴覚のマスキング効果(大きな音の近くの周波数の小さな音は聞こえにくくなる心理音響モデル)」も利用しており、ここで示した振幅ベースの説明はその簡略化されたアナロジーである
- パーセバルの定理(信号のエネルギーは周波数成分ごとのエネルギーの和に等しい)が、どの成分を削るとどれだけ誤差が増えるかを定量的に保証している
- 非可逆圧縮(lossy compression)は、この誤差が人間の知覚では気づかれない範囲に収まるように成分を削減する設計思想に基づく
- 同じ「周波数成分に分解し、寄与の小さい成分を間引く」という発想は画像圧縮のDCT(離散コサイン変換)とも共通する圧縮の基本原理である
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
音声圧縮における周波数成分の分解と低寄与成分の除去(簡略化モデル)
複数のサイン波の合成として表現された音声信号から、離散フーリエ変換に相当する処理で各周波数成分の振幅を評価し、寄与の小さい成分を除去してデータ量を削減する、非可逆音声圧縮の考え方を簡略化したTypeScript実装。
1type SineComponent = { frequency: number; amplitude: number; phase: number };23// 複数のサイン波成分を1つの波形(サンプル列)に合成する4function synthesizeWaveform(5 components: SineComponent[],6 sampleCount: number,7 duration: number8): 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}2021// 振幅が小さい(聴感上の寄与が小さい)成分を間引いて圧縮する22function compressByAmplitude(23 components: SineComponent[],24 keepCount: number25): SineComponent[] {26 return [...components]27 .sort((a, b) => b.amplitude - a.amplitude) // 振幅の大きい順にソート28 .slice(0, keepCount); // 上位 keepCount 個だけ残す29}3031// 例: 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];3738const compressedTone = compressByAmplitude(originalTone, 2); // 上位2成分のみ保持39console.log("圧縮後に保持する成分:", compressedTone);4041const 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) / 10045);
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元