Pythonで固定小数実装(丸め含め)を模擬したところ、丸めのための係数を、係数最大値を2の冪数(2^-2, 2^-1, 2^0, 2^1, ...)に切り上げて処理していたのが大きく効いていることがわかった。

これは係数最大値が2の冪から離れてしまうと、丸めによって大幅に情報が落ちてしまうことに起因している。

  • (例)係数を符号付き8bitで記録することを考えていた時、係数が[128, 61, 1] となった場合は8bitに丸めるために半分に割られて[64, 30, 0]になる。一方、[127, 61, 1]ならば割られることはない。

だから、係数最大値を2の冪より僅かに小さくするのがベストになる。正則化パラメータに応じて連続的に減少することを見ているが、うまい設定方策が思いつかない。

  • 分散が無視できないくらい大きくなりそうならば、L-D法連打による二分探索を行うのが良いかもしれない。

この現象はいつも起こるのではなく、以下の特徴がある:

  • 係数が多いと顕著(FIRフィルタ次数が多ければ誤差が多くなるのでうなずける)
    • 次数が4とか16なら目立たない。128ならばはっきり出てくる。
  • 係数ビット数が少ないと顕著
    • 7,8,9bitでは顕著。
    • 11, 12bitくらいにするとほぼ目立たず、誤差分散も減る。しかし係数の記録領域が増える。。。