実装してみた。案の定、FLAC-8は越えてない。3年前の追試になっている。 しかし次数や予測モデルをこれ以上増やすわけにはいかない。以下を試す。
- マルチチャンネル処理追加
- MS以外に、Left-Side, Right-Sideを追加する
- 選択基準をどうするか。FLACはleft, right, mid, side全部符号化したあとの長さで決めている。符号化の前に決められないか。
- 次数選択
- ブロックごとに係数次数を変える。flakeでは実際の符号長を計算して選択している。
- L-D法で全部の係数が一気に求まるからやや効率的にやれる
- flakeでは妙に気合入れているからやるべきか
- ブロックサイズ選択
- レイテンシの観点からして4096は上限。しかしこれより短くすることはあり。
- ブロックサイズを可変にすると負荷変動するので良くなさそう。
FLACとのデコード速度差を埋めたくてswitch分FALLTRHUによるループアンローリングをしたが、アセンブリを見るとSIMDがまったくない。遅くなるのは明確。やるとしたら、ループアンローリングをやって自前でSIMDを書くしかない。
また、係数を順序反転した方が圧縮率高かったんだけどバグっぽいな。。。
もう一度怪文書を読み直していたら、再帰的Golomb-RiceとGolomb-Riceの使い分けをするのがいいのではないかと思えてきた。おそらく、符号パラメータで場合分けできる。あるパラメータより小さければ再帰的Golomb-Rice、大きければGolomb-Rice符号を使う。
そして、 \(L_{\mathrm{GR}} = L_{\mathrm{RGR}}\) となる \(k\) を見つければいいことを思いつく。