AADのフォーマットを書いてく。デバッグ効率のため(データ到着順で見れるようにしたい)に、ビッグエンディアンで...
ヘッダフォーマット
| 名前 | サイズ[byte] | 内容(補足) |
|---|---|---|
| AADシグネチャ | 4 | 'A', 'A', 'D', '0' |
| フォーマットバージョン番号 | 4 | 1 |
| チャンネル数 | 2 | |
| サンプル数 | 4 | 1チャンネルあたりの全サンプル数 |
| サンプリングレート | 4 | |
| サンプルあたりビット数 | 2 | 2, 3, 4のいずれか。1もいつかは対応したい。 |
| ブロックサイズ | 2 | ブロックのヘッダと圧縮済みデータを含めたサイズ。末尾のブロックではこの値以下になる |
| ブロックあたりサンプル数 | 4 | 末尾のブロックではこの値以下になる |
ブロックサイズは256の倍数にしたい。デフォルト1024で。
ブロックヘッダフォーマット
| 名前 | サイズ[byte] | 内容(補足) |
|---|---|---|
| フィルタ係数 | 8 * チャンネル数 | 符号付き16bit整数の係数が4つ それがチャンネル数ぶん |
| フィルタ入力履歴 | 8 * チャンネル数 | 符号付き16bit整数のサンプルが4つ(先頭4サンプル) それがチャンネル数ぶん |
| テーブルインデックス | 1 * チャンネル数 | |
| 予約領域 | 1 * チャンネル数 | 偶数にするため。 |
ヘッダサイズは18 * チャンネル数[byte]。
しかしヘッダが大きすぎるかもしれない。入力履歴は毎回リセットすべきか? SLAではブロックごとにフィルタ係数をリセットしていたけど、こっちではまずそう。ブロックあたりサンプル数が少なくて適応が遅くなる。 →ホールド(直前サンプルが続いている)でもOK。軽く試したけど、当然、誤差は増える。
まずは富豪的に、上のフォーマットで作る。
ブロックデータフォーマット
サンプルあたりビット数で異なる。ビッグエンディアンで、上位bitから順に書いていく。
- 4bit: 2サンプル(=1byte)単位でインターリーブ。
- 3bit: 8サンプル(=3byte)単位でインターリーブ。
- 2bit: 4サンプル(=1byte)単位でインターリーブ。
- 1bit: 8サンプル(=1byte)単位でインターリーブ。
ブロックデータサイズは、(インターリーブの単位*チャンネル数)の倍数に設定する。
フォーマット
ビッグエンディアンで記録する。
ヘッダフォーマット
| 名前 | サイズ[byte] | 内容(補足) |
|---|---|---|
| AADシグネチャ | 4 | 'A', 'A', 'D', '0' |
| フォーマットバージョン番号 | 4 | |
| コーデックバージョン番号 | 4 | |
| チャンネル数 | 2 | |
| サンプル数 | 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)単位でインターリーブ。(未サポート。将来的にやりたい。)