基于Xilinx Artix-7的JPEG2000图像无损压缩系统:完整工程与独立模块化设计
JPEG2000 图像无损压缩算法 FPGA第三方IP JPEG2K是基于xilinx Artix-7的FPGA完整工程内有完整的MATLB算法工程和RTL源代码还有详细的文档 JPEG2000压缩系统部分由6个独立模块组成去马赛克模块、伽马校正模块、分量间变换模块、小波变换模块、量化模块和编码模块 RTL源码是vhdl编码JPEG2000这玩意儿在图像压缩界算是扛把子级别的存在特别是无损压缩这块比老JPEG强了不是一星半点。今天咱们就扒一扒怎么用FPGA把这算法整利索了——这个基于Artix-7的完整工程有点意思从MATLAB仿真到VHDL代码一气呵成连文档都给你整得明明白白。先说说这个架构的六个核心模块最前端的去马赛克模块就是个典型的数据管道。看这段VHDL代码的端口定义entity Demosaic is port( clk : in std_logic; raw_data : in std_logic_vector(7 downto 0); rgb_out : out std_logic_vector(23 downto 0) ); end Demosaic;这个模块吃进去的是拜耳阵列的原始数据每个时钟周期处理一个像素。重点在于插值算法的实现工程里用了双线性插值的变种用移位寄存器搭了个3x3的窗口做邻域操作比直接写for循环的RTL节省了快30%的LUT资源。伽马校正这块有点骚操作直接给搞了个查找表type gamma_lut is array(0 to 255) of std_logic_vector(7 downto 0); signal gamma_table : gamma_lut : ( 0 00000000, 1 00000101, -- 中间数值用MATLAB生成的系数填充 255 11111111 );查表法的好处就是省逻辑Artix-7的BRAM资源刚好够塞这个表。不过要注意的是这个表得配合MATLAB生成的校正曲线参数工程包里那个GammaParams.mat文件就是干这个用的。分量变换模块玩的是颜色空间转换把RGB转成YCbCr。这里用了定点数运算的精髓Y 16 (R * 65 G * 129 B * 25)/256; Cb 128 (R * (-38) - G * 74 B * 112)/256; Cr 128 (R * 112 - G * 94 - B * 18)/256;看见没直接拿移位操作代替除法把256换成左移8位。不过得留神数据溢出的坑工程里的testbench里有一堆assert语句专门盯着这事。JPEG2000 图像无损压缩算法 FPGA第三方IP JPEG2K是基于xilinx Artix-7的FPGA完整工程内有完整的MATLB算法工程和RTL源代码还有详细的文档 JPEG2000压缩系统部分由6个独立模块组成去马赛克模块、伽马校正模块、分量间变换模块、小波变换模块、量化模块和编码模块 RTL源码是vhdl编码小波变换模块是整个系统的重头戏这个9/7小波变换的流水线设计贼有意思process(clk) begin if rising_edge(clk) then -- 第一级滤波器 stage1 (data_in * 97) srl 8; -- 第二级延时补偿 stage2 stage1(15 downto 8) stage1_delayed(7 downto 0); -- 系数重组 wavelet_coeff stage2(31 downto 16) stage2(15 downto 0); end if; end process;这种双缓冲结构完美解决了边界延拓的问题实测在1080p图像处理时能跑到150MHz不带喘的。不过要注意系数量化位宽工程文档里特别提醒说要是改参数得同步调整MATLAB的浮点模型。量化模块反而简单粗暴直接拿小波系数右移quantized wavelet_coeff srl quant_step;但别被表象骗了这个quant_step是动态调整的得配合码率控制模块联动。工程里有个QuantCtrl.vhd文件专门搞这个算法移植自MATLAB的rate-distortion优化模型。编码模块的VHDL实现最让人头秃特别是EBCOT Tier-1部分。看这个状态机片段when RUN_CODING if significance_flag 1 then next_state SIGN_CODING; else code_buffer code_buffer(30 downto 0) 0; bit_counter bit_counter 1; end if;这种比特级的精细操作简直是在挑战FPGA的时序极限。好在Artix-7的时序余量够大配合多周期路径约束硬是给跑通了。测试数据里那个lena.raw文件跑下来压缩比能到2.8:1PSNR还保持无限大毕竟是无损压缩。整个工程最实用的其实是那套MATLAB验证框架跑完VHDL仿真后直接把生成的压缩数据扔回MATLAB做重构验证。这种软硬协同的套路算是FPGA开发的正确姿势比纯写代码靠谱多了。想魔改这个工程的话注意三点首先改小波层级数记得同步改DWT模块的流水线级数其次颜色空间转换别随便动系数除非准备好重新训练MATLAB模型最后要是想加有损压缩重点折腾量化步长那块就成。源码包里的doc文件夹藏着宝——那个《时钟域交叉注意事项》的PDF关键时刻能救命。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2476917.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!