提升小波变换不仅具有传统小波多分辨率的优点,并且简化了运算及易于硬件实现,在数字图像编码中得到广泛的应用. 在新的图像压缩标准JPEG2000中,采用9/7 ,5/3 提升小波变换作为编码算法,其中的5/3小波变换可以实现无损或有损的图像压缩. FPGA 器件具有集成度高、使用灵活的特点,越来越广泛地用于信号处理领域. 本文采用基于流水线加法运算及桶状移位操作,在Altera 公司的FLEX10K20 器件上实现快速小波变换及逆变换的设计.
1 5/ 3 提升小波
Mallat 将计算机视觉领域内的多分辨率思想引入到小波分析中,提出了著名的快速小波算法—Mallat 算法,使小波分析理论得到广泛的应用.Mallat 算法如下:
式中,h, g为分析滤波器,实现低通滤波和高通滤波功能; h, g为综合滤波器,实现信号的重构.Mallat算法是基于卷积运算的,运算过程复杂,并且需要大量的存贮单元用于暂存中间运算的数据,因此用硬件难以实现.Daubechies 和Sweldens 在Mallat 算法的基础上创建了提升算法,被誉为第二代小波变换.与Mallat 算法相比,提升算法不依赖于傅立叶变换,降低了计算量和复杂程度,其运算效率提高了1倍. 由于具有整数变换及耗费存贮单元资源少的特点,提升算法能够通过硬件方式实现.
小波提升算法的基本思想是通过由基本小波(lazy wavelet) 逐步构建出一个具有更加良好性质的新小波,其实现步骤有3 个:分解(split) 、预测(predict) 和更新(update) . 分解是将数据分为偶数序列和奇数序列2个部分,预测是用分解的偶数序列预测奇数序列,得到的预测误差为变换的高频分量,更新是由预测误差来更新偶数序列,得到变换的低频分量. 在JPEG2000中,5/ 3提升小波变换的算法为
从算式可以得出,提升算法是原位计算,即进行小波变换时在原位计算各个系数,计算的系数可以直接替代原始数据而不需要附加数据存储空间. 例如用式(3) 计算某个奇数位置的系数时,只要该位置上的原有数据及2 个相邻的偶数序列数据,当用计算的结果覆盖原来的数据后不影响下一系数的计算,这一特点使得提升算法便于用FPGA 硬件电路实现.
2 FPGA 实现5/ 3 提升小波变换的方法
由小波提升算法可以看出,5/ 3提升小波变换中的主要计算是加、减运算,而除法运算是除以2 和除以4,在硬件中可通过“右移”操作实现快速运算,因此采用FPGA 实现提升小波算法是可行的. 目前FPGA 的容量已达到百万门级,可以实现复杂的系统级设计,并且由于FPGA 厂商提供了功能强大的开发软件,降低了开发周期和费用.Altera公司提供的DSP设计工具箱Altera DSP Builder,可以在Matlab 的Simulink 环境中进行图形化的FPGA 设计及仿真,并能将设计的文件转换成VHDL语言,再通过开发软件Quartus Ⅱ完成FPGA 的硬件设计.
2.1 基于Simulink 的设计流程
Altera DSP Builder是一套完整的基于FPGA的DSP开发工具,在Simulink中作为一个独立的Blockse 工具箱,包含数学运算(arithmetic) 、存贮单元(storage) 及Matlab文件(mdl) / VHDL 文件转换模块等功能库. 利用这些功能单元及Simulink中的其他工具箱可以进行FPGA的设计、仿真及生成VHDL代码. 用FPGA实现5/3提升小波算法的步骤如下:
步骤1设计硬件电路,根据式(3) 和(4) ,从相应的库中调出加/ 减运算元件Pipelined Adder、延迟元件1/ z 、移位元件Barrel Shifter等,建立如图1所示的5/3小波变换框图. 图中输入的信号分为已分解的奇、偶序列,数据为带符号的10 位二进制数. 由于加/ 减运算需要一定的时间,因此图中在加法器后面加入延时为一个时钟的延时单元,以保证时序的正确. 为了简化电路设计采用“边界补零”的方法处理数据的边界,用数据选择(Multiplexer) 元件实现,图1 中的start 和end 信号表示数据的开始和结束. 输入的仿真数据由Simulink 产生,通过查表模块lookupNDDriect 将奇、偶序列数据分别送入小波变换模块中.
图1 5/ 3 提升小波变换FPGA 设计框图
步骤2在Matlab中对图1所示的小波变换功能进行仿真,输出的波形如图2所示. 当验证功能确认后进行mdl/ VHDL 转换,点击SignalCompile模块,在弹出的对话框,选择FPGA 器件为FLEX10K系列并将Reset 的选项设为Connect to Ground ,运行Convert MDL to VHDL命令,则将图1 中在输入和输出端口内的图形转换为可综合的VHDL 文件,而Simulink 产生的仿真信号被转换为测试向量代码. 在生成的文件中还包含用于Quartus Ⅱ软件编译的脚本文件testa_ quartus. tcl ,其中testa 是文件名.
图2 Matlab 中仿真波形
2.2 在Quartus Ⅱ中编译文件
在Simulink 中生成的文件还需要在Quartus Ⅱ中进行编译,例如选择具体的FPGA 器件的型号、指定输入、输出引脚等. 并且还可以将设计的文件作为一个子功能模块,被其他的功能模块调用.在Quartus Ⅱ的开发界面中,打开Tcl Consol 窗口,在窗口中首先将工作路径设置为脚本文件存放的路径,然后再输入source testa _quartus. tcl , Quartus Ⅱ就可以根据脚本文件自动生成名称为testa. qpf 的Quartus Ⅱ项目文件.
在项目管理窗口(project navigator) 中,重新选择FPGA 器件进行编译、仿真及下载. 当选用FLEX10K系列中的EPF10K20 器件时,经编译后,本文所设计的提升小波变换电路占用的逻辑单元(logicalelements) 为242个,约占整个器件的21 % ,时钟频率可达到20ns. 仿真结果的波形如图3所示,其中iiodds ,iievens 分别是输入的奇、偶序列;oouHs ,oouLs是变换的高频和低频系数. 与图2相比,这里的仿真结果包含了器件的延时, 当选用不同的器件时, 延时的时间不相同. 通过下载电缆将生成的sof 文件配置到EPF10K20 器件中,能够实现提升小波变换的功能.
图3 Quartus Ⅱ中仿真波形
上述设计的是一维的5/ 3小波变换,如果实现二维图像的小波变换时,可以将一维的变换转换为一个子功能模块,分别对二维图像进行行变换和列变换. 在Quartus Ⅱ中用Create Symbol 命令将设计的文件转换成子模块符号Symbol .
3 FPGA 实现5/3提升小波逆变换的方法
逆变换的设计方法与正变换的方法相似,根据式(5) 和(6) ,首先根据输入的高通、低通滤波系数序列计算出偶序列,再根据偶序列的数值计算出奇数列的数值,对于边界问题也采用“补零”的方法. 逆变换设计的方法是在图1 中将低通滤波单元改为偶序列计算单元,并首先进行计算,将高通滤波单元改为奇序列计算单元,利用偶序列的计算结果计算出奇序列的数值.
为了验证设计的提升小波逆变换功能,在Simulink 环境中,先将采样点数为64正弦信号分为奇、偶序列后,输入图1 所示的正变换电路中,小波变换的仿真结果如图4所示. 再将变换的高频和低频系数输入到小波逆变换电路中相应的输入端,变换后的仿真波形如图5所示. 从图中可以看出,信号经过正变换和逆变换后能够实现重构,这也证明5/3小波提升变换是一种完全可逆的变换.
图4 提升小波正变换仿真波形
图5 提升小波逆变换仿真波形
4 结语
讨论了用FPGA 设计5/3 提升小波变换及逆变换的方法,用DSP Builder 及Simulink 软件设计小波变换的硬件结构,并对结果进行了仿真验证. 本文介绍的结构虽然只是一维变换,但二维小波变换是一维的扩充,所以本文的方法可以应用于二维图像的小波变换. FPGA 是目前数字电路系统设计的重要技术之一,具有使用灵活、开发周期短的特点,采用FPGA 实现小波变换与用DSP 处理器的方法相比,具有速度快,数据宽度可任意设置的特点,并且VHDL 语言具有可移植性的特点,具有更强的通用性.