Skip to content
aikiriao edited this page Oct 1, 2020 · 13 revisions

AADの概要

なんですかこれ

ADPCMという記録方式に則ったロッシー音声コーデックです。音声ファイルを圧縮することができます。

ADPCMはロッシーな記録方式なので、圧縮により音質が劣化します。 音圧が高いポップスでは気づきにくいかもしれないですが、楽器ソロ演奏では「シュワシュワ」「ザラザラ」といったノイズが目立ちます。

mp3, ogg, opusなどの変換符号化より音質は悪い反面、デコード時負荷が低いのがポイントです。

設計指針

ADPCMと言うと、IMA-ADPCM, MS-ADPCM, ITU-T G.726が有名です。

本コーデックではそれらの良いとこ取りを目指しました。ポイントは

  • ステップサイズテーブルを高精度化
  • テーブルを参照するインデックスに固定小数を使用(インデックスは整数だけでなく小数値もとる)
  • 予測は前値予測ではなく、適応フィルタを使用
  • 2-bit/sampleまでサポート
    • 音楽は厳しいですが、人間の声ならギリギリ許容できる程度の音質になります。聞き取れないことはないはずです。
  • 各ブロックで独立にデコードできるようにした
    • cf) CDROM-XAなどのフィルタを使うコーデックは、ファイルの途中からデコードすると、先頭部分が一致しない。

(結果、負荷が高くなって本末転倒かもしれない…。)

AAD File Format

バイトオーダーは全てビッグエンディアン。また、1byte=8bitを前提とする。

ヘッダフォーマット

名前 サイズ[byte] 内容(補足)
AADシグネチャ 4 'A', 'A', 'D', '\0'
フォーマットバージョン番号 4 エンコードしたときのフォーマットバージョン(aad.hのAAD_FORMAT_VERSION)
コーデックバージョン番号 4 エンコードしたときのコーデックバージョン(aad.hのAAD_CODEC_VERSION)
チャンネル数 2 最大AAD_MAX_NUM_CHANNELSに制限している(撤廃予定)
サンプル数 4 1チャンネルあたりの全サンプル数
サンプリングレート 4  
サンプルあたりビット数 2 2, 3, 4のいずれか。1もいつかは対応したい。
ブロックサイズ 2 ブロックヘッダとブロックデータを含めたサイズ。末尾のブロックではこの値以下になる
ブロックあたりサンプル数 4 末尾のブロックではこの値以下になる
マルチチャンネル処理法 1 0:何もしていない、1:LR->MS処理(効果が薄いため、廃止予定)

ブロックヘッダフォーマット

名前 サイズ[byte] 内容(補足)
テーブルインデックス上位8bit 1  
テーブルインデックス下位4bit / 係数シフト数 1 下位4bitは固定小数の小数部。
フィルタ係数 8 符号付き16bit整数の係数が4つ。係数シフト数分左シフトして使う。
フィルタ入力履歴 8 符号付き16bit整数のサンプルが4つ(先頭4サンプル)

これがチャンネル数分並ぶ。ヘッダサイズは18 * チャンネル数[byte]。

ブロックデータフォーマット

サンプルあたりビット数で異なる。ビッグエンディアン、かつ、上位bitから順にデータを格納。

  • 4bit: 2サンプル(=1byte)単位でインターリーブ。
  • 3bit: 8サンプル(=3byte)単位でインターリーブ。
  • 2bit: 4サンプル(=1byte)単位でインターリーブ。
  • 1bit: 8サンプル(=1byte)単位でインターリーブ。(未サポート。将来的にやりたい。)