毕业论文

打赏
当前位置: 毕业论文 > 物理论文 >

基于DSP实现的移动场景的相位配准(10)

时间:2016-12-27 21:27来源:毕业论文
以宽度为例,若峰值点(x,y)的x值在0到width/2之间,则判断为正向的移动,移动距离为x;若x值在width/2到width之间,则判断为逆向移动,移动距离为(x


以宽度为例,若峰值点(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
------分隔线----------------------------
推荐内容