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