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)単位でインターリーブ。(未サポート。将来的にやりたい。)