版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
量化(Quantisation)的硬件实现预测模武帧内预泌反量化反变换预测残差■ %爛编码爛编码预测模武帧内预泌反量化反变换预测残差■ %爛编码爛编码变换宏块>量化图一帧内编码框图帧内预测的目的是生成对当前宏块的预测值,一个宏块由一个16x16的luma分量和两个8x8的chroma分量构成。luma块有Intra_16x16和Intra_4x4这两类帧内预测方式,而两个chroma分量则采用相同的预测方式。Intra_16x16是对整个16x16大小的luma进行预测,一般用于图像比较平坦的区域。共有4种预测方式,而Intra_4x4方式是将16x16大小的luma划分为16个4x4大小的亮度块,然后对每个4x4大小的块进行预测,共有9种预测方式。对于chroma分量Cr和Cb预测是对整个8x8块进行的,共4种预测方式。将图像的当前值与帧内预测生成的预测值相减,形成预测残差。残差中仍然含有空间冗余,为了消除这种冗余,通常采用变换编码,即变换-量化-熵编码三步。变换并不压缩数据,它只是消除数据中的相关性,或者说将数据中的冗余或相关性以一种便于随后进行熵编码的方式表现出来。压缩是在熵编码步骤中完成的。此外,为了进一步减少数据量,编码器还对变换后的系数进行量化,它的实质是减少数据的取值范围以减少每一个符号的熵,它会造成信息的损失,是有损编码的一个重要步骤它也是控制图像率失真R-D特性的一个主要手段。在H.264中,变换与量化两个步骤紧密相连。
图二H264编码器变换与量化过程图像编码中最常用的变换编码方式是DCT(离散余弦变换),在图二中,输入值是预测残差,输出值是为准备进行熵编码的数据。为了更大程度地利用空间冗余,对于Intra_16x16帧内预测模式,H.264在对16x16的luma分量的16个4x4块进行DCT变换后,将每个4x4块的DC系数(还没有经过量化)提取出来,组成一个4x4的lumaDC块,对其再进行4x4的哈达玛(Hadamard)变换,同样,对8x8chroma分量的4个4x4块进行DCT变换后,也将每个4x4块的DC系数提取出来,组成一个2x2的chromaDC块,对其进行2x2的Hadamard变换。一变换过程:变换的标准:变换后的数据应该是无相关性,并且是紧凑的(大部分的信息(能量)集中在一小部分值中)。变换应该是可逆的。变换应该是可实施的(所需容量,计算复杂度)。P1 1 1>211v(a~abjla1ab/l'21-1-2X11-1-2cib/2方V4ah/2,/41-1-111-1-12crab/2a2ab/2J-2 2 -1丿,1-21-1;_F/4血/2,/幻公式一DCT的整数变换公式这里的“点乘”是借用Matlab里的概念,含义为两个矩阵对应元素相乘,用符号表示。矩阵乘法满足结合律,所以变换是可分离的。那么对于2-D变换就
可以用1-D变换来实现。所谓可分离的变换,是指变换可以分做两步完成。先对需要做变换的矩阵的每一列做1-D变换,再对其结果的每一行做1-D变换。这个次序也可以反过来,先行后列,在具体实现的时候为了减少运算量,每一步可以采用蝶型算法,这种矩阵运算算法构造非常巧妙,利用构造的矩阵的整数性质和对称性,可完全将乘法运算转化为加法运算。以公式一的第一步对X的第一列进行1-D变换为例,其运算过程如下式所示:公式二公式二对应的蝶形算法如下图所示:X020£图三蝶形算法实现X020£图三蝶形算法实现公式二中需要进行12次加法,4次乘法,而蝶形算法仅需8次加法2次乘法,它利用了运算中的冗余,降低了运算量,其代价是需要额外的存储空间存放中间变量。变换过程在JM中代码实现如下://Horizontaltransform水平变换,其实就是左乘Cf,for(j=0;j<BLOCK_SIZE&&!lossless_qpprime;j++){for(i=0;i<2;i++){i1=3-i;m5[i]=img->m7[i][j]+img->m7[i1][j];}img->m7[0][j]=(m5[0]+m5[1]);img->m7[2][j]=(m5[0]-m5[1]);img->m7[1][j]=m5[3]*2+m5[2];img->m7[3][j]=m5[3]-m5[2]*2;}//Verticaltransform垂直变换,其实就是右乘CfTfor(i=0;i<BLOCK_SIZE&&!lossless_qpprime;i++){for(j=0;j<2;j++){j1=3-j;m5[j]=img->m7[i][j]+img->m7[i][j1];m5[j1]=img->m7[i][j]-img->m7[i][j1];}img->m7[i][0]=(m5[0]+m5[1]);img->m7[i][2]=(m5[0]-m5[1]);img->m7[i][1]=m5[3]*2+m5[2];img->m7[i][3]=m5[3]-m5[2]*2;}二量化过程:对于变换和量化过程的变化发展过程如下:(a)XYDCT(b)XCfst(c)XCfSf2(d)XCf2»roundfVQstep)列rourjdfl/Qstep)(a)XYDCT(b)XCfst(c)XCfSf2(d)XCf2»roundfVQstep)列rourjdfl/Qstep)Qstep我们在量化所要做的就是得到这个Mf。在H264中52个量化步长,用量化参数索引来表示,量化步长与量化参数索引之间的关系如下表:QP〜Qst已p5=0)〜Qst巳p(n= 1)~Qstep(D=2)00.6250.6250,642310.68750.70310,691720.81250.78120.790630.8750.89840.839441.00,97660,988251.1251.13281.1364847694185.05.05.138748160160164.438451224230227.6840图五量化步长与量化参数索引之间的关系在这个图中我们可以看出,当QP大于6时,量化参数索引QP每增加6,量化步长就加一倍。在QP小于6时,QP每加1,则步长加12.5%。(至于QP值的选定,编码器根据图像值实际的动态范围自动改变QP值,在编码长度和图像精度之间折中,以达到整体最佳效果。在码流控制模块中设定)。结果量化公式可以变为:|Zij|=(|Wij|*MF+f)>>qbitsqbits=15+floor(QP/6)公式三公式三Mf的值在程序中定义为三位数组:constintquant_coef[6][4][4]={//quant_coef量化系数quantitycoefficient{{13107,8066,13107,8066},{8066,5243,8066,5243},{13107,8066,13107,8066},{8066,5243,8066,5243}},{{11916,7490,11916,7490},{7490,4660,7490,4660},{11916,7490,11916,7490},{7490,4660,7490,4660}},{{10082,6554,10082,6554},{6554,4194,6554,4194},{10082,6554,10082,6554},{6554,4194,6554,4194}},{{9362,5825,9362,5825},{5825,3647,5825,3647},{9362,5825,9362,5825},{5825,3647,5825,3647}},{{8192,5243,8192,5243},{5243,3355,5243,3355},{8192,5243,8192,5243},{5243,3355,5243,3355}},{{7282,4559,7282,4559},{4559,2893,4559,2893},{7282,4559,7282,4559},{4559,2893,4559,2893}}};以上量化过程在代码中实现为:for(coeff_ctr=0;coeff_ctr<16;coeff_ctr++){if(img->field_picture||(img->MbaffFrameFlag&&currMB->mb_field))//选择扫描方式{//Alternatescanforfieldcodingi=FIELD_SCAN[coeff_ctr][0];j=FIELD_SCAN[coeff_ctr][1];}else{i=SNGL_SCAN[coeff_ctr][0];j=SNGL_SCAN[coeff_ctr][1];}run++;ilev=0;level=(abs(img->m7[i][j])*quant_coef[qp_rem][i][j]+qp_const)>>q_bits;//量化关键部分三量化(Quantisation)的硬件实现通过上面的分析,我们知道,量化主要是实现除法的功能。硬件模块一共分为七个部分,分别为:div、div_su、div_us、div_uu、jpeg_qnr、ud_cnt和ro_cnt以下是部分模块的代码:1、顶层模块div.vmodulediv(clk,ena,z,d,q,s);////parameters//parameterz_width=16;parameterd_width=z_width/2;////inputs&outputs//inputclk; //systemclockinputena; //clockenableinput[z_width-1:0]z;//dividentinput[d_width-1:0]d;//divisoroutput[z_width-1:0]q;//quotientoutput[z_width-1:0]s;//remainder////functions//functionsc;input[z_width:0]si;input[d_width:0]di;beginsc=si[z_width]〜人di[d_width];endendfunctionfunction[z_width:0]gen_q;input[z_width:0]q;input q0;begingen_q={(q<<1),q0};endendfunctionfunction[z_width:0]gen_s;input[z_width:0]si;input[z_width:0]di;input sel;beginif(sel)gen_s={si[z_width-1:0],1'b0}-di;elsegen_s={si[z_width-1:0],1'b0}+di;endendfunction////variables//reg[z_width:0]q_pipe[z_width:0];reg[z_width:0]s_pipe[z_width:0];reg[z_width:0]d_pipe[z_width:0];reg[z_width:0]qb_pipe;////performparameterchecks////synopsystranslate_offinitialbeginif(d_width>z_width)$display("div.vparametererror(d_width>z_width).Divisorwidthlargerthandividentwidth.");end//synopsystranslate_onintegern;//generatedivisor(d)pipealways@(d)d_pipe[0]<={d[d_width-1],d,{(z_width-d_width){1'b0}}};always@(posedgeclk)if(ena)for(n=1;n<z_width;n=n+1)d_pipe[n]<=#1d_pipe[n-1];//generatesigncomparatorpipealwaysbegin#1;for(n=0;n<z_width;n=n+1)qb_pipe[n]<=sc(s_pipe[n],d_pipe[n]);end//generateinternalremainderpipealways@(z)s_pipe[0]<={z[z_width-1],z};always@(posedgeclk)if(ena)for(n=1;n<z_width;n=n+1)s_pipe[n]<=#1gen_s(s_pipe[n-1],d_pipe[n-1],qb_pipe[n-1]);//generatequotientpipealways@(qb_pipe[0])q_pipe[0]<=#1{{(z_width){1'b0}},qb_pipe[0]};always@(posedgeclk)if(ena)for(n=1;n<z_width;n=n+1)q_pipe[n]<=#1{q_pipe[n-1],qb_pipe[n]};wire[z_width:0]last_q;assignlast_q=q_pipe[z_width-1];always@(posedgeclk)if(ena)q_pipe[z_width]<=#1{!last_q[z_width-1],last_q[z_width-2:0],1'b1};//assignoutputsassignq=q_pipe[z_width];assigns=s_pipe[z_width];endmodule2、子模块div_su.vmodulediv_su(clk,ena,z,d,q,s,div0,ovf);////parameters//parameterz_width=16;parameterd_width=z_width/2;////inputs&outputs//inputclk; //systemclockinputena; //clockenableinput[z_width-1:0]z;//dividentinput[d_width-1:0]d;//divisoroutput[d_width:0]q;//quotientreg[d_width:0]q;output[d_width-1:0]s;//remainderreg[d_width:0]s;outputdiv0;regdiv0;outputovf;regovf;////variables//reg[z_width-1:0]iz;reg[d_width-1:0]id;reg[d_width+1:0]spipe;wire[d_width-1:0]iq,is;wire idiv0,iovf;////modulebody////delaydalways@(posedgeclk)if(ena)id<=#1d;//checkz,takeabsvaluealways@(posedgeclk)if(ena)if(z[z_width-1])iz<=#1~z+1'h1;elseiz<=#1z;//generatespipe(signbitpipe)integern;always@(posedgeclk)if(ena)beginspipe[0]<=#1z[z_width-1];for(n=1;n<=d_width+1;n=n+1)spipe[n]<=#1spipe[n-1];end//hookupnon-restoringdividerdiv_uu#(z_width,d_width)divider(.clk(clk),.ena(ena),.z(iz),.d(id),.q(iq),.s(is),.div0(idiv0),.ovf(iovf));//correctdividerresultsif'd'wasnegativealways@(posedgeclk)if(ena)if(spipe[d_width+1])beginq<=#1(~iq)+1'h1;s<=#1(~is)+1'h1;endelsebeginq<=#1{1'b0,iq};s<=#1{1'b0,is};end//delayflagssameasresultsalways@(posedgeclk)if(ena)begindiv0<=#1idiv0;ovf<=#1iovf;endendmodule3、计数模块ro_cnt.vmodulero_cnt(clk,nReset,rst,cnt_en,go,done,d,q);//parameterdeclarationparameterSIZE=8;parameterUD=1'b0; //defaultcountdownparameterID={SIZE{1'b0}};//initialdataafterreset//inputs&outputsinputclk;//masterclockinputnReset;//asynchronousactivelowresetinputrst;//synchronousactivehighresetinputcnt_en;//countenableinputgo;//loadcounterandstartsequenceoutputdone;//donecountinginput[SIZE-1:0]d;//loadcountervalueoutput[SIZE-1:0]q;//currentcountervalue//variabledeclarationsregrci;wirenld,rco;////modulebody//always@(posedgeclkornegedgenReset)if(~nReset)rci<=#11'b0;elseif(rst)rci<=#11'b0;elseif(cnt_en)rci<=#1go|(rci&!rco);assignnld=!go;//hookupcounterud_cnt#(SIZE,ID)cnt(.clk(clk),.nReset(nReset),.rst(rst),.cnt_en(cnt_en),.ud(UD),.nld(nld),.d(d),.q(q),.rci(rci),.rco(rco));//assignout
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冶金应急预案咨询价格(3篇)
- 人员遣散n应急预案(3篇)
- 东风轻型货车营销方案(3篇)
- pta粉尘爆炸应急预案(3篇)
- 1小时活动策划方案(3篇)
- 1-1-4-1-Terphenyl-2-3-3-5-5-5-hexacarboxylic-acid-3-2-3-5-5-5-Terphenylhexacarboxylic-acid-生命科学试剂-MCE
- 南京强化地板施工方案(3篇)
- 发光冲孔板施工方案(3篇)
- 园区道路组织施工方案(3篇)
- 地表隧道施工方案范本(3篇)
- DG-TJ08-2329-2026 民用建筑可再生能源综合利用核算标准
- 风机盘管常见故障维修手册
- 髌骨骨折的护理查房
- 2026青海省交通工程咨询有限公司校园引才总笔试历年参考题库附带答案详解
- 牛场绩效考核制度
- 产品研发与质量控制规范(标准版)
- 2026年电气制造公司样机试制管控管理制度
- 人与自然关系课件
- 高中数学建模竞赛试题及答案
- 2025北京语言大学出版社有限公司招聘5人笔试历年典型考点题库附带答案详解3套试卷
- 2024-2025学年安徽省合肥市第五十中学天鹅湖校区上学期期中考试七年级数学试卷
评论
0/150
提交评论