【DM642学习笔记十】DSP优化记录

处理的数据先EDMA到片内,以YUV2RGB为例:
#pragma DATA_SECTION(onchipBuf0_y,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf0_y,128);
#pragma DATA_SECTION(onchipBuf1_y,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf1_y,128);
#pragma DATA_SECTION(onchipBuf0_u,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf0_u,128);
#pragma DATA_SECTION(onchipBuf1_u,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf1_u,128);
#pragma DATA_SECTION(onchipBuf0_v,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf0_v,128);
#pragma DATA_SECTION(onchipBuf1_v,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf1_v,128);

#pragma DATA_SECTION(onchipBuf0_r,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf0_r,128);
#pragma DATA_SECTION(onchipBuf1_r,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf1_r,128);
#pragma DATA_SECTION(onchipBuf0_g,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf0_g,128);
#pragma DATA_SECTION(onchipBuf1_g,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf1_g,128);
#pragma DATA_SECTION(onchipBuf0_b,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf0_b,128);
#pragma DATA_SECTION(onchipBuf1_b,".INTPROCBUFF");
#pragmaDATA_ALIGN(onchipBuf1_b,128);
//片上缓冲区
unsigned charonchipBuf0_y[PROC_WIDTH];
unsigned charonchipBuf1_y[PROC_WIDTH];
unsigned charonchipBuf0_u[PROC_WIDTH_2];
unsigned charonchipBuf1_u[PROC_WIDTH_2];
unsigned charonchipBuf0_v[PROC_WIDTH_2];
unsigned charonchipBuf1_v[PROC_WIDTH_2];
unsigned charonchipBuf0_r[PROC_WIDTH];
unsigned charonchipBuf1_r[PROC_WIDTH];
unsigned charonchipBuf0_g[PROC_WIDTH];
unsigned charonchipBuf1_g[PROC_WIDTH];
unsigned charonchipBuf0_b[PROC_WIDTH];
unsigned charonchipBuf1_b[PROC_WIDTH];
//原始图像 YUV
extern unsigned charsrc_Y[IMGWIDTH*IMGHEIGHT];//720*576
extern unsigned charsrc_U[IMGWIDTH_2*IMGHEIGHT];
extern unsigned charsrc_V[IMGWIDTH_2*IMGHEIGHT];
//RGB图像
extern unsigned charsrc_R[PROC_WIDTH*PROC_HEIGHT];//352*288
extern unsigned charsrc_G[PROC_WIDTH*PROC_HEIGHT];
extern unsigned charsrc_B[PROC_WIDTH*PROC_HEIGHT];

void yuv2rgb888()
{

int i=0,j=0;
int y,u,v,r,g,b;
int v359,v183,u88,u454;
   unsigned char *py,*pu,*pv,*pr,*pg,*pb;
// const int dif=0x8080;// 128128
for ( i = 0; i <288; i ++ ) 
   {
       //copy一行到片上  144-432行,180列~180+352列
      DAT_copy(src_Y+(i+144)*IMGWIDTH+180, onchipBuf0_y, PROC_WIDTH);
      DAT_copy(src_U+(i+144)*(IMGWIDTH>>1)+90, onchipBuf0_u,PROC_WIDTH_2);
      DAT_copy(src_V+(i+144)*(IMGWIDTH>>1)+90,   onchipBuf0_v, PROC_WIDTH_2);
py=onchipBuf0_y;
pu=onchipBuf0_u;
pv=onchipBuf0_v;
pr=onchipBuf0_r;
pg=onchipBuf0_g;
pb=onchipBuf0_b;
#pragmaMUST_ITERATE(0,176, 8);
for(j=0;j
{

y=(*py);//u-=128; v-=128;//y-=16;y不减16
u=(*pu)-128; 
v=(*pv)-128; 
v359=359*v>>8;
u88=88*u>>8;
v183=183*v>>8;
u454=454*u>>8;
r= y+v359;       // r=y+1.402*v;
r&=~(r>>31);  
r = (r |((255-r)>>31) ) & 0xFF;
g= y-u88-v183;    //g=y-0.34414*u-0.71414*v;
g&=~(g>>31);
g = (g |((255-g)>>31) ) & 0xFF;
b= y+u454;          //b=y+1.772*u;
b&=~(b>>31);
b = (b |((255-b)>>31) ) & 0xFF;
*pr++=r; 
*pg++=g;
*pb++=b;
//
py++; y=(*py);  //y-=16; y减了16之后比原来灰度暗了16左右。∴不减。
r= y+v359;           //r=y+1.402*v;
r&=~(r>>31);  
r = (r |((255-r)>>31) ) & 0xFF;
g= y-u88-v183;    //g=y-0.34414*u-0.71414*v;
g&=~(g>>31);
g = (g |((255-g)>>31) ) & 0xFF;
b= y+u454;       // b=y+1.772*u;
b&=~(b>>31);
b = (b |((255-b)>>31) ) & 0xFF;
*pr++=r;
*pg++=g;
*pb++=b;
py++; pu++;pv++;
}   
      //处理完后,copy给片外r、g、b[352*288]
       DAT_copy(onchipBuf0_r,src_R+i*PROC_WIDTH, PROC_WIDTH);
       DAT_copy(onchipBuf0_g,src_G+i*PROC_WIDTH, PROC_WIDTH); 
       DAT_copy(onchipBuf0_b,src_B+i*PROC_WIDTH, PROC_WIDTH); 
   }
}


clock对比:
放在片外:1888 3080 clocks!
先EDMA到片上:197 7300clocks!约10倍。


【另外】其中, 0~255 的限定使用:(0)

                r&=~(r>>31);  
                    r = (r | ((255-r)>>31) ) & 0xFF;
                    g &=~(g>>31);
                    g = (g | ((255-g)>>31) ) & 0xFF;
                    b &=~(b>>31);
                    b = (b | ((255-b)>>31) ) & 0xFF;  

  

代替:(1)

      if ( r>255)    r=255;          elseif ( r<0 )  r=0;
          if ( g>255 )    g=255;          else if ( g<0 )  g=0;
          if ( b>255 )   b=255;          else if ( b<0 ) b=0;


:(1)不能软件流水,如图~(都在片内处理的情况下)t1=14634366 clocks 10*t0!!!    

【DM642】DSP优化记录【DM642】DSP优化记录  

=>


【DM642】DSP优化记录

  【DM642】DSP优化记录



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值