- Inside IMA ADPCM こっちも同じ内容
- Simple Time Domain Audio Coding MediaWikiの前身となる資料。時間領域符号化の包括的なまとめでもある。有益そう。
強引に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等音圧変化の激しい曲はかなりきびしい。声のみだけだったらいける。)けど、ここらで独立させてみるか。