実装してみた。案の定、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\) を見つければいいことを思いつく。