用fpga实现klt变换的方法

文档序号:7765704阅读:247来源:国知局
专利名称:用fpga实现klt变换的方法
技术领域
本发明属于数字信号处理技术领域,涉及图像压缩编码的实现方法,可应用于通过硬件实现图像压缩编码的变换部分。
背景技术
图像压缩编码的主要步骤是首先将图像划分成多个宏块,然后以宏块为单位进行模式预测、变换、量化以及熵编码。模式预测是根据当前宏块上方和左方的宏块的重构像素值来计算预测像素值的。实际像素值与预测值的差称作残差,残差数据仍然存在着可以开发的相关性。KLT作为一种依赖于数据特性的最优变换,与其它变换方法相比,它根据图像残差特性离线训练出的变换矩阵,能够更充分发掘残差数据中存在的规律性和相关性,从而提高压缩性能,所以目前在数字信号处理及通信中得到了越来越广泛的应用。但是KLT变换要进行复杂的矩阵乘法运算且变换系数大,在要求实时处理及延时较小的高性能图像压缩变换硬件系统中,KLT变换成为瓶颈。采用传统的执行方法在FPGA上进行KLT变换,会导致运算效率低,占用资源大以及数据吞吐率小,因此有必要从FPGA硬件实现的角度出发,发明一种快速高效的实现KLT 变换的方法。

发明内容
本发明的目的在于克服上述已有技术的不足,提出一种用FPGA实现KLT变换的方法,从而满足图像压缩编码实时性和高性能的要求。为实现上述目的,本发明提出如下两种技术方案技术方案1.用FPGA实现一维KLT变换的方法,包括如下步骤(1. 1)将大小为4X4的图像残差矩阵按行展成一维列向量,离线训练后得到大小为16 X 16的KLT矩阵,将它们存储在FPGA中的8个双端口 RAM中;(1. 2)控制8个双端口 RAM的端口,在每个时钟周期内将每个RAM的地址同时加 1,并令两个输出端同时输出,使每个时钟周期内读出变换矩阵的一个行向量;(1.3)将残差列向量的系数和读出的变换矩阵行向量的系数同时送入FPGA中的 "DSP48E单元”进行乘加运算,即可得到变换结果向量中的一个系数;(1.4)重复步骤(1.2)和(1.3),即从RAM中读出变换矩阵下一行的系数与残差列向量的系数进行乘加运算,直到变换结果向量的16个数据计算完毕。技术方案2.用FPGA实现二维KLT变换的方法,包括如下步骤(2. 1)对大小为16X16的图像残差矩阵X进行离线训练,得到大小为16X16的 KLT行变换矩阵R和大小为16 X 16的KLT列变换矩阵C,将行变换矩阵R存储在第一组的8 个双端口 RAM中,记为RAM1,将列变换矩阵C存储在第二组的8个双端口 RAM中,记为RAM2 ;(2. 2)控制存储行变换矩阵R的RAM1的地址端,并令RAM1的输出端同时输出数据,使每个时钟周期内读出行变换矩阵R的一个列向量;(2.3)将残差矩阵X行向量的系数与读出的行变换矩阵R列向量的系数同时送入 FPGA中的“DSP48E单元”进行乘加运算,得到的结果为中间矩阵M的系数,该中间矩阵M的系数以行的顺序串行输出;(2.4)开辟一个新的双端口 RAM,记为RAMm,将输出的中间矩阵M的系数从RAMm的 A端口写入,当256个系数全部写入完毕,产生一个脉冲指示信号;(2. 5)在步骤(2. 4)产生的脉冲信号指示下,控制存储中间矩阵M的RAMm的B端口地址端,使该中间矩阵M的系数按列的顺序串行读出;(2. 6)在步骤(2. 4)产生的脉冲信号指示下,控制存储列变换矩阵C的RAM2的地址端,并令RAM2的输出端同时输出数据,使每个时钟周期内读出列变换矩阵C的一个列向量;(2. 7)将由步骤(2. 5)产生的中间矩阵M的系数和由步骤(2. 6)产生的列变换矩阵C列向量的系数同时送入FPGA中的“DSP48E单元”进行乘累加运算,得到最终的变换结果矩阵,该矩阵在每17个时钟周期内输出一个列向量。本发明与现有技术相比具有以下优点 第一,本发明将数据量庞大的KLT变换矩阵通过初始化存储在双端口 RAM组中,有效减少了查找表的使用,提高了读取变换矩阵系数的速度。第二,本发明对一维KLT变换采用直接乘加的方式,对二维KLT变换采用先乘加、再乘累加的方式,将运算部分用FPGA中的“DSP48E单元”处理,提高了运算速率,且在 “DSP48E”单元内对电路进行流水化处理,减少了 FPGA中其它资源使用,提升了系统的工作频率。


图1为本发明实现一维KLT变换的步骤示意图;图2为本发明实现二维KLT变换的步骤示意图;图3为本发明的一维KLT变换与二维KLT变换的乘加运算原理示意图;图4为本发明的二维KLT变换的乘累加运算原理示意图。
具体实施例方式以下参照附图对本发明做进一步详细描述实施例1 参照图1,本发明对大小为4X4的图像残差块采用一维KLT变换,包括如下步骤步骤A,将大小为4X4的图像残差矩阵按行展成一维列向量,离线训练后得到大小为16 X 16的KLT矩阵,将它们存储在FPGA中的8个双端口 RAM中。步骤B,控制8个双端口 RAM的端口,在每个时钟周期内将每个RAM的地址同时加 1,并令两个输出端同时输出,使每个时钟周期内读出变换矩阵的一个行向量。步骤C,将残差列向量的系数和读出的变换矩阵行向量的系数同时送入FPGA中的 “DSP48E单元”进行乘加运算。参照图3,本步骤的具体实现如下
(Ca)将变换矩阵行向量的系数如 Ei15与残差列向量的系数bQ b15同时送入 "DSP48E单元”内部的输入寄存器组REGin中保存;(Cb)从输入寄存器组REGin中取出彻 a15与bQ b15,并将它们对应相乘,得到 16个乘积ρ。 p15保存至寄存器组REGmul中;(Ce)从寄存器组REGmul中取出Ptl P15分成4组,对每组的4个数求和,得到4个和值% S4,保存至寄存器组REGadd中;(Cd)从寄存器组REGadd中取出% s4,将它们再次相加,得到和值sum,将sum经过一级输出寄存器REG。ut后输出,sum即为最终变换结果向量的一个系数。步骤D,重复步骤B和步骤C,即从RAM中读出变换矩阵下一行的系数与残差列向量的系数进行乘加运算,直到变换结果向量的16个数据计算完毕。实施例2 参照图2,本发明对大小为16X 16的图像残差块采用二维KLT变换,包括如下步骤步骤1,对大小为16X16的图像残差矩阵X进行离线训练,得到大小为16X16的 KLT行变换矩阵R和大小为16 X 16的KLT列变换矩阵C,将行变换矩阵R存储在第一组的8 个双端口 RAM中,记为RAM1,将列变换矩阵C存储在第二组的8个双端口 RAM中,记为RAM2。步骤2,控制存储行变换矩阵R的RAM1的地址端,并令RAM1的输出端同时输出数据,使每个时钟周期内读出行变换矩阵R的一个列向量,其中控制RAM1地址端的步骤是 在每个时钟周期内对RAM1的地址加1,重复进行16个时钟周期;在下一个时钟周期内保持 RAM1的地址不变;依此重复进行16次。步骤3,将残差矩阵X行向量的系数与读出的行变换矩阵R列向量的系数同时送入 FPGA中的‘‘DSP48E单元”进行乘加运算,得到的结果为中间矩阵M的系数,该中间矩阵M的系数以行的顺序串行输出。参照图3,本步骤的具体实现如下(3a)将残差块X第1行的系数与行变换矩阵R第1列的系数同时送入“DSP48E单元”内部的输入寄存器组REGin中保存;(3b)从输入寄存器组REGin中取出残差矩阵X行向量的系数与行变换矩阵R列向量的系数,并将它们对应相乘,得到16个乘积P(l p15,保存至寄存器组REGmul中;(3c)从寄存器组REGmul中取出Pci P15,分成4组,对每组4个数求和,得到4个和值% s4,保存至寄存器组REGadd中;(3d)从寄存器组REGadd中取出% 、并将它们再次相加,得到和值sum,将该sum 经过一级输出寄存器REG。ut后输出,sum即为中间矩阵M的一个系数;(3e)保持残差矩阵X第1行的系数在输入寄存器组REGin中不变,并将行变换矩阵R第2列的系数送入输入寄存器组REGin中保存,重复步骤(3b) 步骤(3d)直至行变换矩阵R第16列的系数被送入至输入寄存器组REGin中;(3f)将残差矩阵X第2行的系数与行变换矩阵R第1列的系数同时送入输入寄存器组REGin中保存,重复步骤(3b) 步骤(3e)直至残差块X第16行的系数与行变换矩阵 R第16列的系数被同时送入输入寄存器组REGin中。步骤4,开辟一个新的双端口 RAM,记为RAMm,将输出的中间矩阵M的系数从RAMm的A端口写入,当256个系数全部写入完毕,产生一个脉冲指示信号。步骤5,在步骤4产生的脉冲信号指示下,控制存储中间矩阵M的RAMm的B端口地址端,使该中间矩阵M的系数按列的顺序串行读出本步骤中控制RAMm的B端口地址端的方法是(5a)设定RAMm的B端口的地址初始值为0 ;(5b)在每个时钟周期内对地址加17,重复进行16个时钟周期;(5c)在下一个时钟周期内保持地址不变;(5d)在下一个时钟周期内将地址减254,即跳转到保存下一列第一个数据的地址;(5e)将步骤(5b) 步骤(5d)重复16次。步骤6,在步骤4产生的脉冲信号指示下,控制存储列变换矩阵C的RAM2的地址端,并令RAM2的输出端同时输出数据,使每个时钟周期内读出列变换矩阵C的一个列向量, 其中控制RAM2地址端的步骤是在每个时钟周期内对RAM2的地址加1,重复进行16个时钟周期;在下一个时钟周期内保持RAM2的地址不变;依此重复进行16次。步骤7,将由步骤5产生的中间矩阵M的系数和由步骤6产生的列变换矩阵C的系数同时送入FPGA中的“DSP48E单元”进行乘累加运算,得到最终的变换结果矩阵,该矩阵在每17个时钟周期内输出一个列向量。参照图4,本步骤的具体实现如下(7a)将按列串行输出的中间矩阵M的系数mk,k = 0,1,...25516 = 0,分别与列变换矩阵C第1列的系数Cu C1^相乘,结果记为CMu CM1M ;(7b)在下一个时钟周期内将中间矩阵M的系数mk+1分别与列变换矩阵C第2列的系数(3cm C15il相乘,并将该16个乘积与CMcia CM15il对应相加,所得结果记为CMcm CM15a ;(7c)重复步骤(7b)直到中间矩阵M的系数mk+15分别与列变换矩阵C第16列的系数C(1,15 C15,5相乘,所得的16个乘积与CMcm4 CM15,14对应相加完毕为止,得到的CMtl, 15 CM15,15即为最终变换结果矩阵的一个列向量。以上仅为本发明的一个具体实例,不构成对本发明的任何限制,显然在本发明的思想下,可做出不同修改与变更,但这些均在本发明的保护之列。
权利要求
1.一种用FPGA实现一维KLT变换的方法,包括如下步骤(1. 1)将大小为4X4的图像残差矩阵按行展成一维列向量,离线训练后得到大小为 16 X 16的KLT矩阵,将它们存储在FPGA中的8个双端口 RAM中;(1.2)控制8个双端口RAM的端口,在每个时钟周期内将每个RAM的地址同时加1,并令两个输出端同时输出,使每个时钟周期内读出变换矩阵的一个行向量;(1.3)将残差列向量的系数和读出的变换矩阵行向量的系数同时送入FPGA中的 "DSP48E单元”进行乘加运算,即可得到变换结果向量中的一个系数;(1.4)重复步骤(1.2)和(1.3),即从RAM中读出变换矩阵下一行的系数与残差列向量的系数进行乘加运算,直到变换结果向量的16个数据计算完毕。
2.一种用FPGA实现二维KLT变换的方法,包括如下步骤(2. 1)对大小为16X16的图像残差矩阵X进行离线训练,得到大小为16X16的KLT行变换矩阵R和大小为16X16的KLT列变换矩阵C,将行变换矩阵R存储在第一组的8个双端口 RAM中,记为RAM1,将列变换矩阵C存储在第二组的8个双端口 RAM中,记为RAM2 ;(2. 2)控制存储行变换矩阵R的RAM1的地址端,并令RAM1的输出端同时输出数据,使每个时钟周期内读出行变换矩阵R的一个列向量;(2. 3)将残差矩阵X行向量的系数与读出的行变换矩阵R列向量的系数同时送入FPGA 中的“DSP48E单元”进行乘加运算,得到的结果为中间矩阵M的系数,该中间矩阵M的系数以行的顺序串行输出;(2.4)开辟一个新的双端口 RAM,记为RAMm,将输出的中间矩阵M的系数从RAMm的A端口写入,当256个系数全部写入完毕,产生一个脉冲指示信号;(2. 5)在步骤(2. 4)产生的脉冲信号指示下,控制存储中间矩阵M的RAMm的B端口地址端,使该中间矩阵M的系数按列的顺序串行读出;(2. 6)在步骤(2. 4)产生的脉冲信号指示下,控制存储列变换矩阵C的RAM2的地址端, 并令RAM2的输出端同时输出数据,使每个时钟周期内读出列变换矩阵C的一个列向量;(2. 7)将由步骤(2. 5)产生的中间矩阵M的系数和由步骤(2. 6)产生的列变换矩阵C 列向量的系数同时送入FPGA中的“DSP48E单元”进行乘累加运算,得到最终的变换结果矩阵,该矩阵在每17个时钟周期内输出一个列向量。
3.根据权利要求1所述的用FPGA实现一维KLT变换的方法,其中步骤(1. 所述的将残差列向量的系数和读出的变换矩阵行向量的系数同时送入FPGA中的“DSP48E单元”进行乘加运算,按照如下步骤进行(1. 3a)将变换矩阵行向量的系数与残差列向量的系数同时送入“DSP48E单元”内部的输入寄存器组REGin中保存;(1. 3b)从输入寄存器组REGin中取出变换矩阵行向量的系数与残差列向量的系数,并将它们对应相乘,得到16个乘积,保存至寄存器组REGmul中;(1.3c)从寄存器组REGmul中取出16个乘积,分成4组,对每组的4个数求和,得到4个和值,保存至寄存器组REGadd中;(1. 3d)从寄存器组REGadd中取出被保存的4个和值再次相加,得到1个和值,并将该和值经过一级输出寄存器REG。ut后输出。
4.根据权利要求2所述的用FPGA实现二维KLT变换的方法,其中步骤(2.2)所述的控制存储行变换矩阵R的RAM1的地址端,按照如下步骤进行(2. 2a)在每个时钟周期内对RAM1的地址加1,重复进行16个时钟周期; (2. 2b)在下一个时钟周期内保持RAM1的地址不变; (2. 2c)重复步骤(2. 2a) 步骤(2. 2b) 16次。
5.根据权利要求2所述的用FPGA实现二维KLT变换的方法,其中步骤(2.3)所涉及的乘加运算,按照如下步骤进行(2. 3a)将残差矩阵X第1行系数与行变换矩阵R第1列的系数同时送入“DSP48E单元”内部的输入寄存器组REGin中保存;(2. 3b)从输入寄存器组REGin中取出残差矩阵X行向量的系数与行变换矩阵R列向量的系数,并将它们对应相乘,得到16个乘积,保存至寄存器组REGmul中;(2. 3c)从寄存器组REGmul中取出16个乘积,分成4组,对每组4个数求和,得到4个和值,保存至寄存器组REGadd中;(2. 3d)从寄存器组REGadd中取出被保存的4个和值再次相加,得到1个和值,并将该和值经过一级输出寄存器REG。ut后输出;(2. 3e)保持残差矩阵X第1行的系数在输入寄存器组REGin中不变,并将行变换矩阵 R第2列的系数送入输入寄存器组REGin中保存,重复步骤(2. 3b) 步骤(2. 3d)直至行变换矩阵R第16列的系数被送入至输入寄存器组REGin中;(2. 3f)将残差矩阵X第2行的系数与行变换矩阵R第1列的系数同时送入输入寄存器组REGin中保存,重复步骤(2. 3b) 步骤(2. 3e)直至残差块X第16行的系数与行变换矩阵R第16列的系数被同时送入输入寄存器组REGin中。
6.根据权利要求2所述的用FPGA实现二维KLT变换的方法,其中步骤(2.5)所述的控制存储中间矩阵M的RAMm的B端口地址端,按照如下步骤进行(2. 5a)设定RAMm的B端口的地址初始值为0 ;(2. 5b)在每个时钟周期内对地址加17,重复进行16个时钟周期;(2. 5c)在下一个时钟周期内保持地址不变;(2. 5d)在下一个时钟周期内将地址减254,即跳转到保存下一列第一个数据的地址; (2. 5e)重复步骤(2. 5b) 步骤(2. 5d) 16次。
7.根据权利要求2所述的用FPGA实现二维KLT变换的方法,其中步骤(2.6)所述的控制存储列变换矩阵C的RAM2的地址端,按照如下步骤进行(2. 6a)在每个时钟周期内对RAM2的地址加1,重复进行16个时钟周期; (2. 6b)在下一个时钟周期内保持RAM2的地址不变; (2. 6c)重复步骤(2. 6a) 步骤(2. 6b) 16次。
8.根据权利要求2所述的用FPGA实现二维KLT变换的方法,其中步骤(2.7)所涉及的乘累加运算,按照如下步骤进行(2. 7a)将按列串行输出的中间矩阵M的系数mk,k = 0,1,. . . 255且16 = 0,分别与列变换矩阵C第1列的系数Cthtl C15itl相乘,结果记为CM" CM1M ;(2. 7b)在下一个时钟周期内将中间矩阵M的系数mk+1分别与列变换矩阵C第2列的系数Ccm c15a相乘,并将该16个乘积与CMchl CM15il对应相加,所得结果记为CMchl CM15,(2. 7c)重复步骤(2. 7b)直到中间矩阵M的系数mk+15分别与列变换矩阵C第16列的系数C(1,15 C15,15相乘,所得的16个乘积与CMihl4 CM15,14对应相加完毕为止,得到的CMtl, 15 CM15,15即为最终变换结果矩阵的一个列向量。
全文摘要
本发明公开一种用FPGA实现KLT变换的方法。包括一维KLT变换和二维KLT变换,一维KLT变换的步骤是将变换矩阵存储在双端口RAM组中;利用“DSP48E单元”完成KLT变换矩阵的系数与残差矩阵的系数的乘加运算并输出结果。二维KLT变换的步骤是(1)将行变换矩阵R与列变换矩阵C存储在双端口RAM中;(2)利用“DSP48E单元”完成残差矩阵X的系数与行变换矩阵R的系数的乘加运算,得到中间矩阵M;(3)利用“DSP48E单元”完成中间矩阵M的系数与列变换矩阵C的系数的乘累加运算并输出结果。本发明减少了其它资源的使用,提升了系统的速度和数据吞吐率,可应用于图像压缩编码技术中。
文档编号H04N7/26GK102447898SQ201110249279
公开日2012年5月9日 申请日期2011年8月26日 优先权日2011年8月26日
发明者张犁, 曾凡平, 李甫, 杨子龙, 王娟, 石光明, 邱云辉 申请人:西安电子科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1