キュービック補間(Cubic Convolution Interpolation)

cubic-convolution-interpolation.png
cube.png

線形補間が補間するのに2つのデータ値を要したのに対し、
Cubit Convolution 補間では4つのデータを要する。カーネルの幅は4(±2)なのである。
カーネルをどのくらい尖らせるか、を左右するパラメータaを使う。
補間したい場所を山の頂点に持って行き、あとは範囲内にある4つの既存データから補間する

(1)
\begin{align} f(x)=\left\{ \begin{aligned} (a+2)|x|^3 -(a+3)|x|^2+1\\ a|x|^3-5a|x|^2+8a|x|-4a\\ 0 \end{aligned} \right\} \begin{aligned} 0 \leq |x| < 1\\ 1 \leq |x| < 2\\ 2 \leq |x| \end{aligned} \end{align}

ここでいうxには補間場所からの距離を入れる。
左の図はパラメータaを変えた時のフィルタの形の様子を表している。aがマイナス方向に大きいほどカーブが激しくなるようだ。

使用上の注意

このカーネルは、yの値が負になるようなサイドローブを持ってる。(両端の部分)
なので、補間した結果の値が負になってしまう場合も起こりえる。(言い換えれば、データの最小値よりも小さくなってしまうってこと)
なので、そんな値が出てしまった場合は0(データの最小値)にクランプする、
または、最小値最大値を測り直して、再正規化する
という処理を加える必要がある。

aの値

-3~0
が最適な値である。
0だと、よりブラーがかかった感じになる。
3だとよりシャープな感じになる。
-0.5が一番普通の感じ。らしい。

欠点

係数を計算するだけでも沢山の計算が必要である。
時間がかかるので、ルックアップテーブルを作る、などの最適化が必要になると思う。

最適化のヒント

同じ式でも形を変えると演算回数を減らすことが出来る。
掛け算 足し算
$x^3+2x^2+3x+4$ 5 3
$(((x+2)x+3)x+4)$ 2 3
では、一番上にあった式にこれを適用してみると、、?
掛け算 足し算
$(a+2)|x|^3-(a+)|x|^2+1$ 5 4
$|x|^2((a+2)|x|-a-3)+1$ 3 4
掛け算 足し算
$a|x|^3-5a|x|2+8a|x|-4a$ 9 3
$a(|x|(|x|^2-5|x|+8)-4)$ 4 3

サポートサイト Wikidot.com