-
Notifications
You must be signed in to change notification settings - Fork 2
home
aikiriao edited this page Oct 1, 2020
·
13 revisions
ADPCMという記録方式に則ったロッシー音声コーデックです。音声ファイルを圧縮することができます。
ADPCMはロッシーな記録方式なので、圧縮により音質が劣化します。 音圧が高いポップスでは気づきにくいかもしれないですが、楽器ソロ演奏では「シュワシュワ」「ザラザラ」といったノイズが目立ちます。
mp3, ogg, opusなどの変換符号化より音質は悪い反面、デコード時負荷が低いのがポイントです。
ADPCMと言うと、IMA-ADPCM, MS-ADPCM, ITU-T G.726が有名です。
本コーデックではそれらの良いとこ取りを目指しました。ポイントは
- ステップサイズテーブルを高精度化
- テーブルを参照するインデックスに固定小数を使用(インデックスは整数だけでなく小数値もとる)
- 予測は前値予測ではなく、適応フィルタを使用
- 2-bit/sampleまでサポート
- 音楽は厳しいですが、人間の声ならギリギリ許容できる程度の音質になります。聞き取れないことはないはずです。
- 各ブロックで独立にデコードできるようにした
- cf) CDROM-XAなどのフィルタを使うコーデックは、ファイルの途中からデコードすると、先頭部分が一致しない。
(結果、負荷が高くなって本末転倒かもしれない…。)
バイトオーダーは全てビッグエンディアン。また、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)単位でインターリーブ。(未サポート。将来的にやりたい。)