基于DSP实现的移动场景的相位配准(10)
时间:2016-12-27 21:27 来源:毕业论文 作者:毕业论文 点击:次
以宽度为例,若峰值点(x,y)的x值在0到width/2之间,则判断为正向的移动,移动距离为x;若x值在width/2到width之间,则判断为逆向移动,移动距离为(x-width)。 在搜索配准点前,必须先把非相关峰(即(0,0)处)赋值为0,否则会影响正确的判断。当峰值小于一定值时(暂定0.002),我们认为找到的峰不是相关峰,而是噪声产生的峰,而此时相关峰和非相关峰重叠,在(0,0)处,场景偏移量判断为(0,0)。 void FindShift(float f,float g,int *shiftifft,int *xshift,int *yshift) { int xl,xh,yl,yh; int i,j; int iidx,jidx; int max=0; xl=f-15; xh=f+15; yl=g-15; yh=g+15; if(xl<0) { xl=0; xh=30; } else if(xh>255) { xl=225; xh=255; } if(yl<0) { yl=0; yh=30; } else if(yh>255) { yl=225; yh=255; } for(i=yl;i<yh;i++) { for(j=xl;j<xh;j++) { if(shiftifft[512*i+2*j]>max) { max=shiftifft[512*i+2*j]; jidx=j; iidx=i; } } } if(jidx>128) { jidx=jidx-256; jidx=(int)(1.25*jidx-0.5); } else jidx=(int)(1.25*jidx+0.5); if(iidx>128) iidx=iidx-256; *xshift=jidx; *yshift=iidx; } 5.6 代码的优化 (1)简单的C代码调整 这一点和普通的C语言优化一样,调整你的代码达到以下效果: -尽量减少不必要的变量 -尽量使用静态和全局变量 -尽量减少循环中的重复运算,将能重复利用的值在循环外部计算。 -不需要在代码中做的运算尽量拿掉,如x*5/4可调整为x*1.25 (2)使用内联函数 C6000编译器提供了许多内联函数,它们直接对应着汇编指令,可快速优化C代码。这些内联函数不易用C/C++语言实现其功能。内联函数用前下划线(_)特别标示,其方法与调用函数一样。例如: float _rcpsp(float src) 计算浮点数的近似倒数; float _rsqrsp(float src) 计算浮点数的近似平方根倒数; (3)restrict关键字 为了帮助编译器确存储器的相关性,可以使用关键字restrict来限定指针、引用或数组。关键字restrict是对指针、引用或数组的一种限定。使用restrict关键字是为了确保其限定的指针在声明的范围内,是指向一个特定对象的惟一指针,即这个指针不会和其他指针指向存储器的同一地址。如果这个保证被违反,程序的执行结果将是未知的,这使编译器更容易确定是否有别名信息,从而更好得优化代码。 (责任编辑:qin) |