二维DCT

2024-08-27

二维DCT(精选3篇)

二维DCT 篇1

在图像信号处理过程中,变换编码是个重要的环节。实施变换的目的是把散布在各个原坐标轴上的原始图像数据集中到新坐标中的少数坐标轴上,从而为后续的量化和编码提供高效数据压缩的可能性[1]。DCT(Discrete Cosine Transform,离散余弦变换)是一种重要的变换编码方法,在图像信号压缩处理等领域中获得广泛应用,比如H.261、JPEG、MPEG等国际上公用的编码标准中均采用该方法。各种研究出现在DCT的工程实现方面,基本思路是利用各种硬件条件,实现DCT的高速运算。文献[2]采用DSP编译器设计DCT硬件处理器,用于高清电视信号处理。文献[3]给出了基于CUDA编程模型的DCT实现,以利用GPU实现DCT快速变换。文献[4]提出使用FPGA进行DCT算法的逻辑实现,通过并行流水线的组织提高DCT运算速度。文献[5]则通过搭建PVM并行虚拟机环境,实现DCT算法的并行化处理,用于JPEG图像的压缩实践。

随着面向通用计算的多核硬件环境的日益普及,人们试图通过并行化设计,充分利用多核资源,提高原有算法的执行性能[6]。主流的并行设计支持平台包括基于消息传递模型的并行开发环境MPI(Message Passing Interface,消息传递接口),以及支持共享内存模型的OpenMP,Java concurrent等,这些环境普遍存在开发和维护难度较大的问题。TBB(Threading Building Blocks,线程构建模块)是一款由支持可扩展并行编程的C++库和简洁易用的模板框架组成的优秀开发环境[7]。该环境封装了底层各种高效的并行机制,适应高层面向任务的开发,能有效降低通用多核并行设计和实现的难度。不少并行化设计采用了TBB开发技术,取得了较好效果[8,9]。为适应通用多核计算环境,提高并行开发效率,本文以TBB作为基本开发平台,实现多核条件下的DCT并行化处理。

1DCT的并行化

DCT有8种不同形式,其中DCT-II是最常用的一种形式,通常直接被称为DCT。图像处理中最常使用二维DCT,可看作行方向的一维DCT和列方向的一维DCT组成,对于一个大小为M×N的图像,二维DCT的定义计算式为:undefined,其中0≤u≤M-1,0≤v≤N-1;Aij表示图像坐标(i,j)位置处的数值;Buv表示经过DCT变换后的矩阵中(u,v)位置处的数值。当u,v=0时,对应的undefined;当u,v≠0时,对应的undefined。B00为变换域的低频部分,即直流系数,其余的B值为高频部分,即交流系数,大多数的自然信号的能量都集中在DCT变换后的低频部分。DCT变换的在图像压缩实践中,一般将图像分解为n×n的子块,并对每个子块进行单独的DCT变换,然后对变换结果进行量化、编码。采用较大的子块可以明显减少图像分块效应,但由于随着子块尺寸的增加,算法的复杂度急剧增长,因此在图像压缩实践中通常采用8×8的子块进行变换。

根据DCT的计算式,对应的串行算法框架如下,

DCTcalc(A[], M, N, B[])

1: au0=1.0/sqrt(M), av0=1.0/sqrt(N), au1=sqrt(2.0/M),av1=sqrt(2.0/N);

2: for each u in [0, M-1]

3: for each v in [0, N-1]

4: tmp←0.0

5: for each i in [0, M-1]

6: for each j in [0, N-1]

7: tmp←tmp +A[i × N + j ] × cos(PI × (2×i + 1) × u/ (2×M)) × cos(PI × (2×j + 1) × v/ (2×N))

8: if(u=0) tmp←tmp × au0

9: else tmp←tmp × au1

10: if(v=0) tmp←tmp × av0

11: else tmp←tmp × av1

12: B[u × N+ v]←tmp

输入参数A[]为一维数组表示的图像数据,B[]存放DCT变换结果数据,M和N为图像的行列参数。分析该算法的可并行性,第4~12行完成一个位置的DCT计算,主要工作量集中在第7行的计算。由于各个图像数据的计算存在独立性,适合数据并行处理。第2、3行的循环语句控制图像数据的遍历,可通过对数据区域划分,为各个区域分配工作线程,实现并行化处理。

2TBB并行化设计

TBB通过算法模板来表达并行语义,支持各种常用的并行化模式的设计,如数据并行,流水并行等。数据并行可采用的算法模板有parallel_for,parallel_reduce,parallel_scan等,用于解决常规数据并行、数据规约并行和前缀扫描并行;流水线并行化的常用的模板如pipeline,用于定义各个工作阶段和串联执行线性系列处理。此外,TBB的任务调度器提供了更为灵活的并行控制机制,支持嵌套任务定义。基于算法模板的设计首先需要定义一个并行局部问题解决过程的工作类,然后用算法模板编写调用语句。对串行DCT算法的并行化问题,定义的工作类如下,

class DCT{ public:

int m_row, m_col; //图像坐标

unsigned char* m_input; //图像数据输入

double* m_output; //DCT输出

void operator()(const blocked_range2d< int, int >& range)const

{ double au0 = 1.0 / sqrt((double)m_row);

double av0 = 1.0 / sqrt((double)m_col);

double au1 = sqrt(2.0/m_row);

double av1 = sqrt(2.0/m_col);

for (int u=range.rows().begin(); u

for (int v=range.cols().begin(); v

{ double tmpa = 0.0;

for (int i=0; i

for (int j=0; j

tmpa + =m_input[i*m_col+j] * cos((2*i+1)*u *PI/ (2*m_row)) * cos((2*j+1)*v *PI/ (2*m_col));

if (u==0) tmpa *= au0;

else tmpa *= au1;

if (v==0) tmpa *= av0;

else tmpa *= av1;

m_output[u*m_col + v] = tmpa;

}

}

};

其中operator()方法内定义了并行处理需要完成的工作,与串行实现代码基本一致。

对于图像信息进行数据并行处理,采用parallel_for算法模板的调用程序片段如下,DCT dct; //声明并初始化dct实例。

dct.m_input = data_matix;

dct.m_output = dct_matrix;

dct.m_row = row; dct.m_col = col;

parallel_for(blocked_range2d(0, row, 0, col), dct, auto_partitioner());

parallel_for是个简单高效的算法模板,该模板提供了一个并行迭代处理的通用形式,其原型为parallel_for( range, body, partitioner),代表执行体body对数据区域range的并行处理,body是工作类的实例,用partitioner指定数据划分策略。多个工作线程条件下,parallel_for以非确定顺序执行各个迭代,由于图像区域中各部分的DCT计算顺序无关,parallel_for能保证结果正确性。在并行分配线程任务是,TBB对数据区range进行迭代均分,故工作空间复杂度为O(Plog(N)),其中P为工作线程数,N为数据区的尺寸。由于图像信息为二维空间数据,本例采用blocked_range2d数据区定义模板,可实现在横向和纵向的自动数据划分。算法模板隐藏了底层线程调度机制,降低了开发难度,因此能在保证并行性能的前提下有效提高开发效率。

3优化方法

原有DCT算法中包含四个循环操作,主要时间消耗在时间复杂度较高的余弦函数计算上。子块变换可大大降低DCT的复杂性,在实践中切实可行。通过分块处理,原来依整体坐标不同的余弦计算变成数量有限的依子块坐标不同的余弦计算,这样各个子块中的余弦计算将重复进行,可预先存储各余弦计算值,然后通过查询的方法在计算时获取对应值。

考虑采用8×8子块进行变换处理,BLOCK_WIDTH=8。首先定义余弦函数计算表,随机查表语句如#define COS(u,v) cos_table[u* BLOCK_WIDTH + v]。然后完成计算表初始化,对于8×8子块,计算cos((2*u+1) * v * PI / 16),0≦u,v≦7,总共只需计算64个值。优化的并行工作类定义如下,

class DCT_opt{ public:

... //成员变量与优化前的相同

void operator()(const blocked_range< int >& range)const

{ for (int blockNo=range.begin(); blockNo

{ blockStart = blockNo*BLOCK_WIDTH*BLOCKED_WIDTH;

for (int u=0; u

for (int v=0; v

{ double tmpa = 0.0;

for (int i=0; i

for (int j=0; j

tmpa + =m_input[blockStart + i*BLOCK

_WIDTH+j] * COS(i,u) * COS(j,v);

...

m_output[blockStart + u*BLOCK_WIDTH + v]

= tmpa;

}

...

}

}

工作类中的operator方法参数采用一维数据区定义模板blocked_range来表示块的个数范围,blockNo作为最外层循环控制变量,比原有的以图像坐标作为循环控制变量的方法获得更大粒度的划分。主要计算行tmpa求值采用了查表方式,有效消除了复杂的重复计算,大大提高算法效率。

并行模板调用的参数设定为按分块进行划分,程序片段如下,

class DCT_opt dct_opt;

int blockNum = row * col / (BLOCK_WIDTH * BLOCK_WIDTH);

parallel_for( blocked_range< int >(0, blockNum), dct_opt, auto_partitioner());

并行计算中任务粒度对并行性能有重要影响。粒度过小,将导致任务数量过多,任务的通信和线程切换开销过大;粒度过大,可能使得任务未能合理划分,局部线程空闲,不利于负载平衡。TBB中的粒度指以计算迭代次数作为任务划分的阀值,粒度取决于操作本身的复杂度和循环调用次数。在parallel_for模板中使用auto_partitioner进行自动分区,TBB将采用非优化的通用粒度值进行处理。通过指定优化的粒度大小,可获取更好的并行性能。然而粒度的优化值一般难以确定,需要通过多次测试获取经验值。采用的模板调用式如parallel_for( blocked_range< int >(0, blockNum, grainSize), dct_opt),其中grainSize设置为优化的粒度值。

4性能测试与分析

性能分析主要包括对优化设计前后的效率对比和对优化后的加速比进行考察。测试平台为配备AMD Athlon II X4 620 (2.60 Ghz) 4核CPU的PC和Windows XP系统,开发环境为Visual Studio 2005和TBB2.2,测试工具为YourKit Profiler for .NET 4.0性能分析工具[10]。测试对象是位深为8的经典的Lena灰度图序列。

YourKit性能分析工具可以方便观察CPU利用率、线程分配、内存使用等重要动态信息,并且能跟踪对应的执行代码,定位执行热点。图1显示了128×128图像在优化前进行DCT并行处理时CPU和线程工作状态。处理过程耗费10.28秒,期间CPU占用率接近100%。工作线程除了原有主线程外,再增加3个线程,共4个线程满负荷运行。

图2显示了优化后DCT并行处理时的情况,处理过程耗时仅0.02秒,期间CPU占用率则不足10%。可见优化计算大大提高了执行性能。

考察优化后的并行处理性能。选取分辨率分别为256×256,512×512,1024×1024和2048×2048的图像,测试不同线程数目n条件下的DCT执行时间Tn,根据执行时间测试加速比Sn=T1/Tn。图3中可见执行时间随着图像尺寸的增加而增长;而不同图像尺寸条件下的加速比曲线基本一致,随线程数目的增加呈线性增长,表明了具备较好的可扩展性。

5结束语

二维DCT在图像数据压缩中具有重要作用,出现各种适应特定执行环境的优化实现方法。并行化是提高程序性能的重要途径,鉴于多核计算环境的推广,本文给出了面向通用多核计算平台的DCT并行化方法和优化措施,并利用TBB平台实现。后续工作将继续挖掘TBB的设计潜能,在DCT的并行优化方面进行改进,以获得更好的执行性能和加速比。

参考文献

[1]余松煜,张文军,孙军.现代图像信息压缩技术[M].北京:科学出版社,1998.

[2]Miyazaki T,Nishitani T,Edahiro M etc.DCT/IDCT processor for HDTV developed with DSP silicon compiler[J].The Journal ofVLSI Signal Processing,1993(5):151-158.

[3]阮军,韩定定.基于CUDA的DCT快速变换实现方法[J].微电子学与计算机,2009,26(8):201-205.

[4]李跃新,张吉烈.二维DCT并行流水线算法及FPGA的实现[J].贵州大学学报(自然科学版),2009,26(4):82-83.

[5]王茂芝,徐文皙,佘春东等.基于数据分割的二维离散余弦变换并行算法及其在图像压缩中的应用[J].成都理工大学学报(自然科学版),2004,31(4):427-432.

[6]阿克特,罗伯茨.多核程序设计技术--通过软件多线程提升性能[M].北京:电子工业出版社,2007.

[7]仁达敬.Intel Threading Building Blocks编程指南[M].北京:机械工业出版社,2009.

[8]杨川,杨斌.基于TBB的傅里叶变换多核并行化实现[J].计算机工程,2010,36(16):288-290.

[9]陈荣鑫,陈维斌,廖湖声.分形计算的并行设计及TBB实现[J].计算机应用,2011,31(3):839-842.

[10]YourKit LLC.YourKit Profiler for.NET[CP/OL].[2011-05-20].http://www.yourkit.com/docs/net40/.

二维DCT 篇2

传统的加密技术[1],是把有意义的信息编码为伪随机性的乱码以保护信息的—门学科,经过加密的信息会变成混乱的数据.这样一来很容易引起攻击者的注意.信息隐藏提供了另外一种对秘密信息的保护方法,它通过将秘密信息嵌入到另外一幅有意义的并且不引人注意的图像中来隐藏和传送秘密信息.和加密技术相比,加密技术着重于保护秘密信息的内容,而信息隐藏着重于隐藏秘密信息的存在.

1 信息隐藏的可行性

信息隐藏[2]技术之所以能够实现是因为:

(1)多媒体信息本身存在很大的冗余性,从信息论的角度看,未压缩的多媒体信息的编码效率是很低的,所以将某些信息嵌入到多媒体信息中进行秘密传送是完全可行的,并不会影响多媒体信息本身的传送和使用.

(2)人的视觉和听觉本身具有某些特性为信息隐藏提供了条件,比如人眼的视觉惰性、暂留现象、阈值效应等,利用人的这些特点,可以很好的将有用信息隐藏而不被察觉. 目前的信息隐藏算法一般来讲可分2类:空间域的方法和变换域的方法[3],2种算法各有利弊,但都出于将消息嵌入载体冗余部分这一思想,信息发送流程如图1所示.

变换域技术,即把隐藏的信息嵌入到载体的一个变换空间(如频域)与空域方法相比,变换域方法的优点如下:

(1)在变换域中嵌入的信号能量可以分布到空域的所有像素上.

(2)在变换域中,人的感知系统的某些掩蔽特性可以更方便地结合到编码过程.

变换域方法可与数据压缩标准,如JPEG等兼容,常用的变换包括离散余弦(DCT)变换和小波变换.

2 信息隐藏的主要思想

信息隐藏的依据就是想方设法把信息隐藏到图像不敏感区域,或者说是视觉冗余空间,这样不会降低图像视觉质量引起人们的注意,同时也保证了信息传递的安全性[4].变换域的具体算法实现起来相对困难,下面给出一种基于DCT变换,由MATLAB为工具的图像隐藏方法.

2.1 DCT域的信息隐藏

二维DCT变换是目前使用的最著名的有损数字图像压缩系统——JPEG系统的核心.因此,在域中的信息隐藏,可以有效地抵抗JPEG有损压缩.DCT变换首先需要把图像分割成8×8的像素块,然后进行二维DCT变换,得到8×8的DCT系数,这些系数从低频到高频按照Zig-Zag次序排列,第一个值(左上角)为直流系数,其余为交流系数.DCT系数中,左上角部分为直流和低频系数,右下角部分为高频系数,中间区域为中频系数.低频代表图像像素之间慢变化,即图像框架部分,高频代表像素之间的快变化,即图像细节部分[5].因此,高频部分代表图像中的噪声部分,这些部分容易通过有损压缩或者滤波等处理被去掉.而中低频部分包含了图像的大部分能量,也可以说,对人的视觉最重要的信息部分,都集中在图像的中低频.一般图像的压缩和处理,为了保持图像的可视性,都保留了图像的中低频部分.而低频部分的改变有可能引起图像较大的变动,因此,为了将隐藏的信息与载体图像的视觉重要部分绑定,一般都将隐藏信息嵌入到载体的中高频部分,达到既不引起视觉变化,又不会被轻易破坏的目的.

给出实数列S的二维DCT变换公式

S(u,v)=2ΝC(u)C(v)x=0Ν-1y=0Ν-1s(x,y)cos(πu(2x+1)2Ν)cos(πv(2y+1)2Ν)(1)S(x,y)=2Νx=0Ν-1y=0Ν-1C(u)C(v)S(u,v)cos(πu(2x+1)2Ν)cos(πv(2y+1)2Ν)(2)

2.2 MATLAB实现步骤

通过MATLAB工具箱可以方便地实现信息隐藏的效果,需要注意的是在实现过程中各变量之间的转换,DCT变换后图像矩阵精度发生变化,在消除载体图像的高频分量后,经DCT变换后的信息图像矩阵叠加在载体图像矩阵的右下角即高频分量处,若矩阵的行列不规则,不能直接做加法处理,可以考虑将2幅图像的行列做补零的调整,使2幅图像可以直接相加,程序流程如图2.试验效果图如图3~图5.

3 实验分析

在信息隐藏技术中,峰值信噪比、均方根误差、图像特征相对误差是最重要的几个性能指标.下面对它们分别展开讨论:

(1)峰值信噪比PSNR常用来衡量嵌入隐藏信息后图像的质量,PSNR越高,表明信息嵌入后对原待嵌入信息的图像带来的噪声越小,也就是隐藏的效果越好.

PSNR定义如下

ΡSΝR=10log(255×255×Μ×Ν/i=0Μj=0Ν(f(i,j)-f(i,j)2))(3)

其中,f(i,j)是原来的待嵌入隐藏信息图像;f(i,j)′是嵌入信息后的图像;MN是图像的尺寸.

(2)均方根误差RMSE可以较好地反映嵌入隐藏信息前后2幅图像的误差.RMSE越小,表明2幅图像越相似.

RMSE定义如下

RΜSE=[1Μ×Νi=0Μ-1j=0Ν-1(c(i,j)-s(i,j)2)]12(4)

实验中以不同的图像作为待嵌入隐藏信息图像,实验结果如表1所示.

(3)图像特征相对误差.众所周知,像素灰度是图像各离散点量测幅度的样本值,是最原始、最基本的特征数据.均值表示图像包含的平均能量,标准差表示像素灰度分布的分散程度,该值越小说明像素灰度分布越集中,越大说明像素灰度越分散.

实验结果如表2所示.

通过对以上特征数值分析并在MATLAB实现DCT域的信息隐藏实验可以看出,图3作为载体图像和图6的信息隐藏完成图像相比,图像的框架基本无变化,变化较多的是图像的细节部分,但是调整后这种细节部分的变化可以控制在人眼能够忍受的范围内,从而不易发现图5这个有用信息,达到信息隐藏的目的,图4为原始图像经DCT变换后的能量分布图,经过对DCT变换的特征分析,选用了载体图像的特定区域,即DCT系数中高频部分N个最大的DCT系数作为待隐藏图像的DCT系数,减少了对原图像视觉的影响.实验表明,嵌入隐藏信息后的两幅图像在视觉上人眼无法分辨,算法具有良好的隐秘性和较强的鲁棒性,可以有效地抵抗随机噪声、位置变换、变形、剪切等操作.

4 结 束 语

目前所采用的变换域信息隐藏方法有多种,由于DCT变换是最常用的有损数字压缩系统JPEG的核心,采用这种方法不仅适用范围广,可以推广到视频压缩等领域,而且信息隐藏的鲁棒性较好.给出的这种方法简单易行,但效果欠佳,可以通过对图像分块后,各子块分别采用DCT变换后再进行隐藏过程,并且在对完成效果要求较低的情况下还可对完成图像进行滤波,从而减少杂波噪声对图像的影响,这些方法在以后的实验中进行.

摘要:提出了一种基于二维DCT变换的图像信息隐藏方法,经过二维DCT变换后的图像能量集中在低频部分,考虑到人眼的视觉特性,图像的高频部分可视为视觉冗余部分,可以把有用信息隐藏在变换载体图像的高频部分,即以牺牲图像高频信息来达到信息隐藏的效果,通过MATLAB实现这一思想,对隐藏后的图像质量做了特征分析,并对下一步实验做出了设想.

关键词:信息隐藏,DCT变换,视觉特性

参考文献

[1]汪小帆,戴跃伟,毛耀斌.信息隐藏技术方法与应用[M].北京:机械工业出版社,2001.

[2]徐常勇,平西建,张涛.视频信息伪装技术综述[J].计算机应用研究,2006:8-11.

[3]张立和,周继军,陈伟,等.透视信息隐藏[M].北京:国防工业出版社,2007.

[4]Fabien AP Petitcolas,Rosa J Anderson,Markus G Kuhn.Information Hiding;A Storey[C]//Pmc.of the IEEE,1999:1062-1078.

二维DCT 篇3

目前HDTV与多种成熟的压缩标准(JPEG,MPEG和H.26X等)都采用了基于DCT/IDCT的压缩编码[1]。在选取均方差准则下,Karbunen-Loeve变换(KLT)是信号处理中的最佳变换,但KLT没有快速算法,并且计算十分困难,所以不具有实用价值,但可以作为衡量其他变换的标准。在有快速算法的次最佳变换中,DCT基向量最接近KLT,其编码技术已趋成熟,发展很快[2],应用广泛。另外,由于DCT具有快速算法、可分离特性和中等的算法复杂度3个特点,十分适合于VLSI实现。DCT变换有两种实现方法:行列分解算法和直接法实现二维DCT变换[3]。

本文采用行列分解算法,提出5级流水线的高精度向量乘法器的二维DCT结构,采用多路选择器MUX8-1暂存数据,然后再分别与矩阵系数相乘,降低了占有硬件资源和功耗。在高精度方面采用移位方案,精确到小数点后5位,提高了精度。

1 二维DCT快速变换算法

对于一个N×N的像素块,若输入矩阵为X(i,j),0≤i,j

式中:,其他,x(i,j)表示图像的像素点阵,Z(u,v)表示二维DCT变换后的变换系数。如式(1)所示,DCT变换需要N4次乘法运算。由于乘法运算量大,运算时间长,消耗资源大,所以不能满足速度、面积和功耗的要求。利用二维DCT可分离的特性,寻找一种适用于硬件实现的快速算法。DCT是一种空间可分离的变换,可以表示为2个一维的DCT矩阵形式

式中:CC T=IN,C是由余弦函数值构成的N×N(N=8)矩阵,表示为

二维DCT变换采用图1的流水线结构,可以分为Y=CX T和Z=CY T两步计算。第一级的一维DCT对输入像素点按行扫描完成N(N=8)个乘法运算,每完成一行即8个像素点的DCT变换后,将结果暂存到流水寄存器中,再由流水寄存器将数据传给转置RAM。同时,第一级一维DCT对输入像素点的第二行进行DCT变换。转置RAM用于实现矩阵的转置运算,将经过一维DCT变换的数据按列输出给第二级一维DCT完成运算,最终输出经过二维DCT变换的像素点数值。

由式(3)可知,矩阵C偶数行偶对称,奇数行奇对称,因此,根据矩阵C的行对称性,通过分离偶数行、奇数行可得

由于M(N×N)×M(N×)1的矩阵向量乘法被2个M((N/2)×(N/2))×M((N/2)×1)的矩阵乘法代替,DCT的乘法计算量减少一半,而且它们可以并行计算,满足高速的设计要求。

2 二维DCT的VLSI架构优化

2.1 二维DCT结构

如图2所示,根据图1进一步细化2D-DCT的结构。DCT需要完成计算2个(4×4)×(4×1)的矩阵向量乘法。在矩阵向量乘法之前,DCT需要进行加/减法运算,并将结果并行输出给8选1的多路选择器,由8选1多路选择器选择输出给矩阵向量乘法单元,完成与矩阵系数的乘法,这些操作在预处理单元中完成。后处理单元将矩阵向量乘法单元的结果进行加/减法运算,并且实现流水寄存器的功能,将经过加/减法运算的结果暂存,串行的输出给转置RAM。

2.2 一维DCT VLSI架构

一维DCT的算法由式(2)和式(3)可知,矩阵C偶数行偶对称,奇数行奇对称,并通过分离偶数行、奇数行[6]得出式(4)和式(5),进一步分解得出

式中:ACC代表累加器,根据式(6)和式(7)提出一维改进的DCT结构如图3所示。

1)二维DCT架构优化

文献[4]的架构是对并行输出的偶数行X0+X7,X1+X6,X2+X5,X3+X4,奇数行X0-X7,X1-X6,X2-X5,X3-X4直接与矩阵系数A,B,C,D,E,F,G相乘,用22个28位的乘法器完成并行乘法运算,用8个累加器完成加法运算。由于乘法器所消耗的硬件资源大,成本高,运算量大,所以此结构并不很完善,无法真正应用到实际DCT算法模块的应用中。

本文所提出的架构对并行输出的偶数行X0+X7,X1+X6,X2+X5,X3+X4,奇数行X0-X7,X1-X6,X2-X5,X3-X4用多路选择器MUX8-1暂存,选择输出,按照算法要求分别输出X0+X7,X1+X6,X2+X5,X3+X4,X0-X7,X1-X6,X2-X5,X3-X4与相应的矩阵系数A,B,C,D,E,F,G相乘,再将结果送到8个累加器中完成加法运算。加入的多路选择器MUX8-1也起到了流水寄存器的作用,这样便把3级流水线架构改造为了5级流水线,进一步优化了性能。

2)高精度的向量乘法器单元优化

在矩阵系数乘法的乘法器设计中,用二进制来表示小数的乘法系数,并将二进制左移M精度位,放大2M倍,将小数乘法转化成整数乘法,对乘积结果右移M精度位,缩小2M倍,并对结果四舍五入,保证运算结果的高精度,本文精度取M=14位。

3 实验结果分析

3.1 优化后的性能对比

本文设计的2D-DCT模块速度高,功耗小,所耗硬件资源少。文献[4]的2D-DCT模块的主要瓶颈在于所用到的22个28位乘法器,虽然是并行乘法,理论上会很快,但乘法器运算量大,所耗硬件资源大,需门级电路多,会导致功耗大幅上升,不满足速度快、成本小、功耗低的工业要求。而改进后的2D-DCT模块用了7个28位乘法器,因此速度对乘法器的依赖大大减少,降低了功耗和所耗硬件资源。通过Modelsim仿真得知,文献[4]的2D-DCT经过92个时钟周期输出经过DCT变换后的数据,而改进后的2D-DCT要经过108个时钟周期。虽然对第一幅图像的处理时间上,改进后的2D-DCT要落后16个时钟周期,但是对于多幅图像的流水作业处理,改进后的2D-DCT是5级流水的,因此速度上要远远快于先前的3级流水线结构,并且由于时钟周期都是纳秒级的,所以第一幅图像所落后的16个时钟周期完全可以忽略不计。优化前后所耗资源如表1所示。

3.2 二维DCT算法综合和仿真

本文所设计的DCT仿真采用Verilog HDL描述,Synplify pro 8.1综合,Modelsim 6.2 SE,Matlab 6.5进行仿真验证,仿真对比波形如图4和图5所示。Modelsim仿真得出在第108个时钟周期,输出第一个经过二维DCT变换的值,由于采用流水线技术,第108个时钟周期之后,每个时钟周期都有一个值输出。

本文采用了高精度的向量乘法器单元,因此运算结果有较高的精度,对一组数据进行了验证。用Matlab的二维DCT变换函数(dct2(x))计算一个8×8的参考矩阵A,得出结果矩阵C,用本文所设计的DCT处理参考矩阵A,得出结果矩阵B,将矩阵B与矩阵C对比,可知所设计的DCT结构具有较高精确度,矩阵A,B,C分别为

4 结论

本文提出了一种基于流水线的高精度向量乘法器的二维DCT VLSI结构。采用一维DCT行处理,转置RAM存储器,一维DCT列处理的流水线结构,最终输出经过二维DCT变换的像素点数值提高了精度和运算速度,并且在一维DCT算法模块中,对于系数乘法,采用并行乘法的结构,数据先在多路选择器MUX8-1暂存,然后再与矩阵系数相乘,改进了硬件电路结构,进一步降低了硬件资源。最后对本文提出的二维DCT进行了综合和仿真,实验表明本文所采用的方法具有占用资源少、功耗低、速度快以及高精度的特点,满足工业要求。

摘要:提出了一种基于5级流水线的高精度向量乘法器的二维DCT VLSI结构。采用一维DCT行处理,转置RAM存储器,一维DCT列处理的流水线结构代替复用一维DCT算法以提高速度,并且在一维DCT算法模块中,对于系数乘法,采用并行乘法的结构,可以进一步提高运算速度。在高精度方面,采用移位的方案,精度精确到小数点后5位,满足高精度的需求。在FPGA平台上仿真结果表明,与传统的2D DCT设计相比,可以减少硬件资源,降低功耗,提高精度。

关键词:编解码,流水线,二维DCT,高精度,现场可编程门阵列

参考文献

[1]山洪刚,郑南宁,杨晓衡.实时视频编码的二维DCT/IDCT的实现[J].电视技术,2002,26(12):4-6.

[2]LIN Hengyao,LU Yinghong,LIU Binda,et al.Low power design ofH.264 CAVLC decoder[C]//Proc.IEEE International Symposium onCircuits and Systems.Island of Kos,Greece:IEEE Press,2006:21-24.

[3]司马苗,周源华.基于FPGA的二维DCT变换的实现[J].红外与激光工程,2003,32(4):436-439.

[4]刘峰,代国定,庄奕琪.一种基于高度并行结构的二维DCT/IDC处理器设计[J].电路与系统学报,2003,8(3):87-92.

[5]钟文荣,陈建发.二维DCT算法的高速芯片设计[J].厦门大学学报:自然科学版,2005(2):198-201.

上一篇:CIS类软件下一篇:古典诗歌教学的方法