Date Tags ADPCM

強引に3,2bit化してみた。なんとなくできてしまっているが、2bitは流石にジリジリいう。 なんでかな、と思ったらステップサイズが4bitむけのものになっていて、テーブル参照インデックスが0でも7になってしまい、確実に揺れてしまうのが問題であると想像している。テーブル自作を試みているが、なかなかに苦戦。

IMA-ADPCMのステップサイズが謎。どっから導出したんだろうか。 純粋な指数関数ではなさそう。とくに、最初の8要素は線形関数になってるのが奇特。(テーブルの情報量を増やしたいのかな?)しかし、後になると指数関数 \(2^{\log_{2}(32767/7)/88 x + \log_{2}(7)}\) とほぼ一致。 自作のテーブルより、IMA-ADPCMのテーブルの方がいいRMSを出している。。。何故やろ・・・。

テーブルは一旦諦めて、モデルの改善を考えたが、あんまり良くない。 フィルタ次数を8にしたり、IIR(予測値をフィードバック)したり。

効果があったのが3つ。

  • ノイズシェーピング。残差を量子化するからその量子化誤差を1/16を掛けてフィードバックする(大きすぎると発散する)。残差わずかに減少。
  • LR->MS。ステレオ音源で残差減少。注意点としては、16bit幅を超えるからやるならPCMを32bit幅で持つべき。いまは破壊的な処理をしてる。
  • プリエンファシス。1サンプルエンコード/デコード処理でやりたいが、そうなってない(汚い実装になってる)。一回RMS減ったのは見たけど、本当かもう一度確かめたい。

これらはスイッチできるといいなあ。 2bitとなると音質クッソ厳しい(りんごの木、Mani Mani等音圧変化の激しい曲はかなりきびしい。声のみだけだったらいける。)けど、ここらで独立させてみるか。