I like fpga

change the world by fpga
2021/05/30

8×8の画像をDCTする[pixel image processing dct]

FPGA   VERILOG   ZYNQ   

FPGAで、DCTの演算を行う。DCTは、画像の圧縮(サイズを小さくする)ために使用されることが多い。例えば、MPEGやAVC、HEVCで使われている。DCTの式は、wiki を参照すると良いと思う。今回実装したのは、DCT-Ⅱになる。

離散コサイン変換

ただ、そのままDCTの式を演算すると乗算や小数点の計算が多く、演算に時間がかかるそこで、chenさんという方が考えた変換方式を参考に考える。

A Fast Computational Algorithm for the Discrete Cosine Transform

データフローは、前回の記事とほぼ同じなので、解説は前回の記事を参考にしてほしい。

DCTを含めたデータフローの図だ。

DCTのモジュールのIOだ。

module calc(
	input CLOCK,
	input RESET,
	input INPUT_DATA_ENABLE,
	input [31:0] INPUT_DATA[8][8],
	output OUTPUT_DATA_ENABLE,
	output [31:0] OUTPUT_DATA[8][8]
    );
  • CLOCK 動作クロック
  • RESET リセット
  • INPUT_DATA_ENABLE INPUT_DATAが有効時に1になる。有効になったらDCTの演算を開始する。
  • INPUT_DATA 16bitの画像データがpixel単位で64個入力される。入力時は16bitだけれども、演算途中で、32bitまで桁が増えるので32bit準備している。
  • OUTPUT_DATA_ENABLE DCT演算が完了したら1になる
  • OUTPUT_DATA DCT演算結果が格納される

もともとの計算式は、コサイン、サインの式を利用しているので、小数点の演算になるのだが、そのままでは実装できない気がしたので、整数演算に変換している。そして、MAX32bitに収まるように演算を工夫した。

こちらが、実装したプロジェクトとモジュールだ。

https://github.com/y38y38/pixel_8x8_process_dct

https://github.com/y38y38/myip_start

https://github.com/y38y38/pixel_8x8_process_workspace

« »