1、 基于 FPGA 的快速 DCT 医学图像的压缩算法【摘要】 介绍了一种适用于医学图像压缩的二维 DCT 快速算法的FPGA 实现结构,采用行列分解法来实现该算法,首先把 88 的二维 DCT 变换分解为两个一维 DCT 变换,通过对变换的系数矩阵进行化简,使加法器和乘法器数量减少到最少,并采用了 FPGA 特有的并行流水线技术,明显节省了计算时间,提高了图像处理速度。 【关键词】 FPGA;二维 DCT;医学图像压缩;行列分解; 并行流水线Abstract:A FPGA design for fast Discrete Cosine transform(DCT) implementation
2、 architecture used in medical image compression is presented. The architecture is achieved using row-column decomposition. First, the 88 two-dimensional DCT is decomposed into two one-dimensional DCT, simplifying the coefficient matrix, we can reduce the number of adder and multiplier to minimum, an
3、d using the parallel pipeline technology of FPGA, the computation time is greatly saved and image processing speed is improved.Key words:FPGA;2D DCT;Medical image compression;Row-column decomposition;Parallel pipeline1 引 言DCT 变换是视频压缩编解码器中很重要的一部分,被广泛应用于各种视频格式的编码算法中,例如:JPEG,MPEG1,MPEG2,H.264 等1 。DCT 变
4、换虽然不能直接降低数据量,但是它可以利用图像的统计特性使得各种降低数据量的方法更为有效地工作。它能把图像的能量集中到少数的几个数据上,在很大程度上消除数据间的冗余性和相关性。一般来讲,医学图像都比较大,例如腹部横断面的 CT 图像(512512 的 bmp 图像),对于此类图像,如果要在整体上进行 DCT变换,将耗费大量的时间,因此我们需要将整幅图像切割成若干的子块,对子块进行 DCT 变换,在本研究中采用的是 88pixels 的字块。二维 DCT 变换需要进行大量的运算,大量的乘法及加法运算严重影响了变换速度,为减少运算次数,缩短运算时间,人们作了不懈的努力,并提出了多种快速算法,但处理过
5、程中数学运算仍然相当复杂。我们在前人工作的基础上,对用行列分解法实现 DCT 变换的方法进行了优化,并充分利用了 FPGA 器件的嵌入式乘法器及存储器资源,明显缩短了变换时间。2 DCT 算法原理2.1 一维 DCT 算法原理设x(n)表示 N 个有限的一维实数信号序列集合,n=0,1,2,N-1,则一维 DCT 定义为:y(k)=2Nc(k)N-1n=0x(n)cos(2n+1)k2N),其中 c(k)=12 k=01 k=1,2,N-12.2 二维 DCT 算法对于一个 NN 的图像,x(i,j)表示图像样值,其二维 DCT 变换公式如下:y(u,v)=2Ne(u)e(v)N-1i=0N-
6、1j=0x(i,j)cos(2i+1)u2Ncos(2j+1)v2N,其中e(u),e(v)=12 u,v=01 u,v0(u,v=0,1,2,N 1)生 物 医 学 工 程 研 究 第 28 卷第 3 期 王 宁,等:基于FPGA 的快速 DCT 医学图像的压缩算法 二维 DCT 变换具有很高的复杂度,从上式我们可以看出,二维 DCT 可以分解为两个一维的DCT 变换:y(u,v)=2Ne(v)N-1j=02Ne(u)N-1i=0x(i,j)cos(2i+1)u2Ncos(2j+1)v2N,首先对二维 DCT 进行一维列变换:x(u,j)=2Ne(u)N-1i=0x(i,j)cos(2i+1
7、)u2N转置之后再次进行一维列变换:y(u,v)=2Ne(v)N-1j=0x(u,j)cos(2i+1)v2N至此,我们就完成了一次完整的二维 DCT 变换。3 DCT 变换在 FPGA 上的实现3.1 一维 DCT 的实现在图像压缩处理中,通常将图像分为若干的子块,继而对每一个子块进行 DCT 变换,在本方案中我们采用 88pixels 的子块。根据一维 DCT 变换的原理,可以得到一列 8 点 DCT 的计算结果,如下:y0y1y2y3y4y5y6y7=d dddddddaceg-g-e-c-abf-f-b-b-ffbc-g-a-eeag-cd-d-ddd-d-dde-agc-c-ga-e
8、f-bb-f-fb-bfg-ec-aa-ce-gx0x1x2x3x4x5x6x7,其中 abcdefg=12cos/16cos/8cos3/16cos/4cos5/16cos3/8cos7/16要完成一次列向量的 DCT 变换需要 64 次乘法和 56 次加法,根据三角函数性质和矩阵系数对称性,上式可以分解为两个矩阵表达式:y0y2y4y6=ddddbf-f-bd-d-ddf-bb-fx0+x7x1+x6x2+x5x3+x4 ,y1y3y5y7=acegc-g-a-ee-a-gcg-ec-ax0-x7x1-x6x2-x5x3-x4,现在只需 32 个乘法器和 32 个加法器2,上面矩阵还可以继
9、续进行分解:y0y4=ddd-dx0+x7+x3+x4x1+x6+x2+x5y2y6=bff-bx0+x7-(x3+x4)x1+x6-(x2+x5)y1y7=ga-ag(x3-x4)-d(x2-x5)+d(x1-x6)d(x2-x5)+d(x1-x6)+(x0-x7)y5y3=ce-ec(x3-x4)+d(x2-x5)-d(x1-x6)-d(x2-x5)-d(x1-x6)+(x0-x7)经过上述分解运算,乘法器和加法器的数量分别减少到了 16次和 26 次,极大地降低了计算量。根据上面分解后的矩阵,我们可以得到图 1 的一维 DCT 流水线结构:图 1 一维 DCT 流水线结构Fig 1 On
10、e-dimensional pipeline structure如图 1 所示,一维 DCT 变换采用了 3 级流水线的并行处理结构,当有 8 点数据输入后,首先经过串并转换电路将其转换为并行数据,之后利用 FPGA 丰富的乘法器资源和并行处理特性,实现 8点实序列的并行输出,只需 1 个时钟周期就可以完成一次列向量的DCT 变换,一次完整的一维 DCT 变换需要 8 个时钟周期。图 2(左) 是一维 DCT 流水线结构的基本单元3,由 4 个乘法器和 2 个加法器组成,若采用图 2(右)的等价单元结构,则所需乘法器的数量将进一步减少,共需 13 个乘法器和 29 个加法器。图 2 基本结构单
11、元Fig 2 The basic structural unit3.2 二维 DCT 的实现实现了一维 DCT 变换后,要实现二维 DCT 就很容易,只需加上用于数据存储和转置的 RAM 存储器即可,二维 DCT 变换的结构框图见图 34:图 3 二维 DCT 变换的结构框图Fig 3 The block diagram of 2D-DCT transform行列变换 RAM 可以形象地看成 88 的阵列,RAM 的结构有8 块 88 的双端口同步 RAM 组成5 。每一块 RAM 块中存放 1/8 的88DCT 系数。 RAM 中的前 8 个字对应矩阵中的第一列,第二个 8个字对应第二列,以
12、此类推(一列中的 8 个数据分别放入 8 块 RAM中)。采用这样的 RAM 结构可以实现 8 个数据的同时读写。首先对 88 矩阵的每一列进行一维 DCT 变换,当一列数据完成第一次DCT 变换后,列向量中的 8 个数据同时写入 RAM 存储器,等待 8列数据全部写入 RAM 并进行转置,之后再次对列向量进行一维DCT 变换,因此,完成一个 88 点的二维 DCT 变换总共需要 16 个时钟周期,并且在第 9 个时钟沿有数据输出。若对前后两个一维 DCT 分别使用各自的 DCT 流水线结构,则可以在一个子块进行第二次 DCT 变换的同时,对下一个子块进行第一次 DCT 的计算,从而节约时钟周
13、期。例如:第一个子块耗费了16 个时钟周期,这时第二个子块也应经完成了一次 DCT 变换,只需再过 8 个时钟周期即可完成,因此两个子块总共耗费 24 个时钟,而不是 16+16=32 个时钟周期。对于 N 个子块来说,总共耗费的时钟周期数为(8+8N)个。4 仿真结果与分析本算法是在 Quartus II8.1 环境下进行的设计和仿真(verilog 语言描述),采用的是 Cyclone III 系列的 EP3C120F780I7 芯片,共消耗了 3 308 个 logic element(3%)、388 个 pins(73%)、1 993 个 logic register(2%)。如图 4
14、 所示,iclk 为时钟信号输入 ;d0d7 为 88 矩阵的数据输入,分别代表矩阵的 18 行数据,列向量数据同时输入;F0SF7S 表示完成每一列一维 DCT 变换后的数据输出,数据输入输出在同一时钟内完成;m0 m7 表示完成第二次一维 DCT 变换后的数据输出,即完成一次完整的二维 DCT 变换的数据输出。从图中可以看出,从第 9 个时钟沿开始有数据输出,并且在第 16 个时钟结束时完成一次完整的二维 DCT 变换(忽略误差不记) ,与理论结果相符,验证了算法的正确性。5 结论本研究结合 FPGA 具有丰富的乘法器和 RAM 存储器资源的优势,对基于行列分解法的二维 DCT 变换进行了优化。优化后的DCT 蝶形图只需 13 个乘法器和 29 个加法器,极大地降低了计算量,再加上 FPGA 高速的并行处理结构和流水线结构,实现了对列(行)向量中 8 个数据的同时读写,完成一次二维 DCT 变换只需耗费 16个时钟周期,并且可以实现两个子块 DCT 的同时进行,进一步减少计算时间。本算法耗时极少,达到了优化的目的,适用于高速实时的图像数据传输。【