FC2カウンター FPGAの部屋 演算処理のFPGAへの適用方法

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

バイキュービック法のFPGAへの適用

演算処理をFPGA へ適用するにはどうすれば良いかを検討している。私も先は長くないと思うので、少し公開してみようと思う。そのうちにVivaodo HLS で実装してみよう。

今回はバイキュービック(BiCubic)法をFPGA に適用できるように固定小数点に直して演算する方法だ。
具体的には、バイキュービック法を用いて画像を横2倍、縦2倍にするときの演算である。

参考したのは、「画像の拡大「Bicubic法」」と「分かる!画像補間 ~基本から応用まで~」だ。

このうちの「分かる!画像補間 ~基本から応用まで~」からバイキュービック(BiCubic)法の部分をそのまま引用させて頂いて、最初の式を式(1)、次の式を式(2)とした。
BiCubic_1_170210.png

中間値Mnの式を式3に示す。中間値 Mn は、ピクセル値 xmk に x の重み wxm と y の重み wyk を掛けて合計し、それを xmk に x の重み wxm と y の重み wyk を掛けた値の合計で割ることで求められる。
BiCubic_2_170210.png

今、図2に示す画像のピクセル4x4点を使用して、x11に3点(M0, M1, M2)を追加する。
BiCubic_3_170210.png

M0の値の導出
M0はy方向がyと一致しているので、y=0の時の値のみとなる。y=1の時はy軸方向の重みwy1が0となる。(y=0の時はwy0 = 1)
・M0からx11、x21へのx方向の重み
式(1)から
w(0.5) = (a+2)(0.5)3 – (a+3)(0.5)2 + 1 = 0.125(a+2) – (0.25)(a+3) + 1
= 0.125a + 0.25 – 0.25a + 1 = 0.5 – 0.125a
  ・a = -0.5の場合 w(0.5) = 0.5625
  ・a = -1の場合 w(0.5) = 0.625

・M0からx01、x31へのx方向の重み
式(1)から
w(1.5) = a(1.5)3 – 5a(1.5)2 + 8a(1.5) – 4a = 3.375a – 11.25a + 12a -4a
= 0.125a
  ・a = -0.5の場合 w(1.5) = -0.0625
  ・a = -1の場合 w(1.5) = -0.125

M0の値
よって、a = -0.5の場合(但しwy0 = 1)式3から
M0 = (0.5625x11 + 0.5625x21 - 0.0625x01 - 0.0625x31)/(0.5625×2 - 0.0625×2)
M0 = 0.5625x11 + 0.5625x21 - 0.0625x01 - 0.0625x31
a = -1の場合(但しwy0 = 1)式3から
M0 = (0.625x11 + 0.625x21 - 0.125x01 - 0.125x31)/(0.625×2 - 0.125x01×2)
M0 = 0.625x11 + 0.625x21 - 0.125x01 - 0.125x31

M1の値の導出
M1はx方向がxと一致しているのでx=0の時の値のみとなる。x=1の時はx軸方向の重みwx1が0となる。(x=0の時はwx0 = 1)
・M1からx11、x21へのy方向の重み
式(1)から
w(0.5) = (a+2)(0.5)3 – (a+3)(0.5)2 + 1 = 0.125(a+2) – (0.25)(a+3) + 1
= 0.125a + 0.25 – 0.25a + 1 = 0.5 – 0.125a
  ・a = -0.5の場合 w(0.5) = 0.5625
  ・a = -1の場合 w(0.5) = 0.625
  ・M1からx10、x13へのy方向の重み
式(1)から
w(1.5) = a(1.5)3 – 5a(1.5)2 + 8a(1.5) – 4a = 3.375a – 11.25a + 12a -4a
= 0.125a
  ・a = -0.5の場合 w(1.5) = -0.0625
  ・a = -1の場合 w(1.5) = -0.125

M1の値
よって、a = -0.5の場合(但しwy0 = 1)式3から
M1 = (0.5625x11 + 0.5625x21 - 0.0625x10 - 0.0625x13)/(0.5625×2 - 0.0625×2)
M1 = 0.5625x11 + 0.5625x21 - 0.0625x10 - 0.0625x13
a = -1の場合(但しwy0 = 1)式3から
M1 = (0.625x11 + 0.625x21 - 0.125x10 - 0.125x13)/(0.625×2 - 0.125x10×2)
M1 = 0.625x11 + 0.625x21 - 0.125x10 - 0.125x13

M2の値の導出

・M2からx11, x12, x21, x22へのx方向y方向の重み
式(1)から
w(0.5) = (a+2)(0.5)3 – (a+3)(0.5)2 + 1 = 0.125(a+2) – (0.25)(a+3) + 1
= 0.125a + 0.25 – 0.25a + 1 = 0.5 – 0.125a
  ・a = -0.5の場合 w(0.5) = 0.5625
  ・a = -1の場合 w(0.5) = 0.625
・M2からx00, x10, x20, x30, x01, x31, x02, x32, x03, x13, x23, x33へのx方向y方向の重み
式(1)から
w(1.5) = a(1.5)3 – 5a(1.5)2 + 8a(1.5) – 4a = 3.375a – 11.25a + 12a -4a
= 0.125a
  ・a = -0.5の場合 w(1.5) = -0.0625
  ・a = -1の場合 w(1.5) = -0.125

M2の値
a = -0.5の場合、式3から
M2 = {(0.5625)2x11 + (0.5625)2x21 + (0.5625)2x12 + (0.5625)2x22
+ (-0.0625)2x00 + (0.5625)(-0.0625)x10 + (0.5625)(-0.0625)x20 +(-0.0625)2x30
+ (-0.0625)(0.5625)x01 + (-0.0625)(0.5625)x31
+ (-0.0625)(0.5625)x02 + (-0.0625)(0.5625)x32
+ (-0.0625)2x03 + (0.5625)(-0.0625)x13 + (0.5625)(-0.0625)x23 +(-0.0625)2x33} /
{(0.5625)2 + (0.5625)2 + (0.5625)2 + (0.5625)2
+ (-0.0625)2 + (0.5625)(-0.0625) + (0.5625)(-0.0625) +(-0.0625)2
+ (-0.0625)(0.5625) + (-0.0625)(0.5625)
+ (-0.0625)(0.5625) + (-0.0625)(0.5625)
+ (-0.0625)2 + (0.5625)(-0.0625) + (0.5625)(-0.0625) +(-0.0625)2}
= {0.3164x11 + 0.3164x21 + 0.3164x12 + 0.3164x22
+ 0.0039x00 + (-0.0352)x10 + (-0.0352)x20 +0.0039x30
+ (-0.0352)x01 + (-0.0352)x31 + (-0.0352)x02 + (-0.0352)x32
+ 0.0039x03 + (-0.0352)x13 + (-0.0352)x23 +0.0039x33} /
{0.3164 + 0.3164 + 0.3164 + 0.3164
+ 0.0039 + (-0.0352) + (-0.0352) +0.0039
+ (-0.0352) + (-0.0352) + (-0.0352) + (-0.0352)
+ 0.0039 + (-0.0352) + (-0.0352) +0.0039}
M2 = 0.3164x11 + 0.3164x21 + 0.3164x12 + 0.3164x22
+ 0.0039x00 + (-0.0352)x10 + (-0.0352)x20 +0.0039x30
+ (-0.0352)x01 + (-0.0352)x31 + (-0.0352)x02 + (-0.0352)x32
+ 0.0039x03 + (-0.0352)x13 + (-0.0352)x23 +0.0039x33

a = -1.0の場合、式3から
M2 = {(0.625)2x11 + (0.625)2x21 + (0.625)2x12 + (0.625)2x22
+ (-0.125)2x00 + (0.625)(-0.125)x10 + (0.625)(-0.125)x20 +(-0.125)2x30
+ (-0.125)(0.625)x01 + (-0.125)(0.625)x31
+ (-0.125)(0.625)x02 + (-0.125)(0.625)x32
+ (-0.125)2x03 + (0.625)(-0.125)x13 + (0.625)(-0.125)x23 +(-0.125)2x33} /
{(0.625)2 + (0.625)2 + (0.625)2 + (0.625)2
+ (-0.125)2 + (0.625)(-0.125) + (0.625)(-0.125) +(-0.125)2
+ (-0.125)(0.625) + (-0.125)(0.625)
+ (-0.125)(0.625) + (-0.125)(0.625)
+ (-0.125)2 + (0.625)(-0.125) + (0.625)(-0.125) +(-0.125)2}
= {0.3906x11 + 0.3906x21 + 0.3906x12 + 0.3906x22
+ 0.0156x00 + (-0.0781)x10 + (-0.0781)x20 +0.0156x30
+ (-0.0781)x01 + (-0.0781)x31 + (-0.0781)x02 + (-0.0781)x32
+ 0.0156x03 + (-0.0781)x13 + (-0.0781)x23 +0.0156x33} /
{0.3906 + 0.3906 + 0.3906 + 0.3906
+ 0.0156 + (-0.0781) + (-0.0781) +0.0156
+ (-0.0781) + (-0.0781) + (-0.0781) + (-0.0781)
+ 0.0156 + (-0.0781) + (-0.0781) +0.0156}
M2 = 0.3906x11 + 0.3906x21 + 0.3906x12 + 0.3906x22
+ 0.0156x00 + (-0.0781)x10 + (-0.0781)x20 +0.0156x30
+ (-0.0781)x01 + (-0.0781)x31 + (-0.0781)x02 + (-0.0781)x32
+ 0.0156x03 + (-0.0781)x13 + (-0.0781)x23 +0.0156x33


式は小数点数なので、FPGAに実装するに重みを整数とする必要がある。整数にするために重みを256倍して、演算してから8ビット右シフト(1/256)する必要がある。
256倍した時のバイキュービック法のM0, M1, M2の式を示す。
 ・a = -0.5の場合
M0 = 144x11 + 144x21 - 16x01 - 16x31
M1 = 144x11 + 144x21 - 16x10 - 16x13
M2 = 81x11 + 81x21 + 81x12 + 81x22 + x00 + (-9)x10 + (-9)x20 +x30
+ (-9)x01 + (-9)x31 + (-9)x02 + (-9)x32 + x03 + (-9)x13 + (-9)x23 +x33

 ・a = -1.0の場合
M0 = 160x11 + 160x21 - 32x01 - 32x31
M1 = 160x11 + 160x21 - 32x10 - 32x13
M2 = 81x11 + 81x21 + 81x12 + 81x22 + x00 + (-9)x10 + (-9)x20 +x30
+ (-9)x01 + (-9)x31 + (-9)x02 + (-9)x32 + x03 + (-9)x13 + (-9)x23 +x33
  1. 2017年02月10日 05:14 |
  2. 演算処理のFPGAへの適用方法
  3. | トラックバック:0
  4. | コメント:0