AACはMPEG-2 AdvancedAudioCodingの略です。MP3がMPEG-1 Layer3だったように、動画圧縮CODEC中の音声CODECという扱いになります。実は上位互換でMPEG-2 Audioが開発されていたんですが、それじゃぜんぜん圧縮率が出ない!ということで互換性を廃して開発されたものになります。iPodに採用されて爆発的に普及しましたね。音質はMP3の比ではなく、同じ音質で約1.5倍の圧縮が可能になります。

では、どこからその圧縮率の違いが来るのか。

一番大きいのは窓幅です。AACはMP3の約2倍の窓幅を持っています。窓幅とは周波数変換の処理単位のことです。処理単位が多ければ多いほど、まとめて削っちゃったり、より細かく解析できたりするので、圧縮の世界においては窓幅の効果は支配的です。従ってAACのアドバンテージのほとんどはここにあります。さらに、MP3では演算量を削減するためにサブバンド分割してから周波数変換を行っていましたが、AACではダイレクトに2048点MDCTで周波数変換してしまいます。シンプルで素敵ですね。

ただ、窓幅を大きくすると大きくするなりの問題もあります。特に大きいのがプリエコーで、周波数成分一つの誤差は窓全体に分散するので、ハイハットとかの突発的、非定常的な音源で、音の直前にノイズが乗ってしまいます。そこで使われるのが窓幅の適応的変更です。非定常的な場所では窓幅を256にしてしまうのです。256と2048のつなぎ目は、えらい人が考えたえらいかっこいい窓関数があるので、完全再構成が可能になります。

後はいつもどおり周波数成分に聴覚心理モデルをかけて、どの帯域にどれぐらいの容量を割り振るかを決めて、エントロピー符号化するだけです。そういえばMSステレオもMP3ではフレーム単位でしたが、AACではバンド単位で変更が可能になりました。

基本はこれだけなんですけど、いくつか強力なツールも搭載されています。まず、周波数成分のフレーム間予測。動画でも動き予測で一つ前の絵を使って今の絵を予測したりしますが、それの音声版です。周波数成分単位で予測値を、前2フレーム分の対応周波数成分から生成し、実際の周波数成分との差分を符号化します。予測の使用/不使用は、バンド単位で可能です。また、ロバストにするために定期的に予測のリセットを行いますが、全てのバンドを同時にリセットするとそのフレームの符号量が増大してしまうので、今回はバンド0のリセット、次回はバンド1のリセット、みたいに、ずらしながらリセットします。

ただし即座に分かるように、周波数成分をバッファリングする必要があったり、シークどうするよ、とか問題山済みなので、Main-profileでのみ採用となっています。iPodのAACはLow-profileなので使ってなかったりします。

もう一つはTemporalNoiseShapingで、周波数変換の直後、フレーム内の周波数成分に対して予測を行い、周波数成分を残差に変換して符号化しますが、これが何で時間領域での雑音整形になるのかはいまいち理解できていません。きっとすごい方法なのでしょう。

さらに詳しく知りたい方は

をどうぞ。

そういえば

を買いました。レビューはそのうち…っと思っていましたが、先に挙げた方で十分です。MDCTのSPLの計算式も無いですし、MPEG-1の聴覚心理モデルの解説も、MP2で使われるものまでしか書かれていません。やっぱりIntroduction to digital audio coding and standardは名著ですねー。

ちなみに着うたで使われているHE-AACは、AACにSBRという高周波の予測を加えたものです。人間の耳は、高周波成分をパワーでしか認識していなくて、そのおかげでインテンシティステレオというL+RとL,Rのパワー比だけを保持するという手法が使えるんですが、さらにそれすら保持せずに、低周波から高周波を予測して勝手に作っちゃうというアバンギャルドな手法です。ただしこれが効果があるのはインテンシティステレオすら使えない超高圧縮域だけですので、実はいらない娘だったりします。HE-AACではVorbisっぽい音になります。

MPEG-2からMPEG-4へはあんまり進化しなかったので、そろそろ音声系はさちってきた気もします。逆にそれがチャンスなのかもしれません。