以宽度为例,若峰值点(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关键字是为了确保其限定的指针在声明的范围内,是指向一个特定对象的惟一指针,即这个指针不会和其他指针指向存储器的同一地址。如果这个保证被违反,程序的执行结果将是未知的,这使编译器更容易确定是否有别名信息,从而更好得优化代码。 基于DSP实现的移动场景的相位配准(10):http://www.751com.cn/wuli/lunwen_1614.html