Date Tags ADPCM

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