m1=1.0*m-k1;
m2=1.0*k2-m;
for(i=0;i<256;i++)
{
imout[i*256+j]=m2*imin[i*320+k1]+m1*imin[i*320+k2];
}
}
for(i=0;i<256;i++)
{
imout[i*256]=imout[i*256+1];
imout[i*256+255]=imout[i*256+254];
}
}
5.3 输入FFT函数的复数图像矩阵形式
要正确得使用DSP库里的FFT函数,那么首先输入数据的格式必须正确。在FFT函数里,规定输入和输出图像矩阵都是复数矩阵,并且实部和虚部必须交错存放。也就是说原来图像的一个像素点对应一个灰度值数据,需要的格式则是一个实部和一个虚部一前一后构成这个像素点的数据。例如,我的实验中使用的256*256的FFT,那么输入矩阵就是一个512*256的矩阵。原图像所有的点都是实数,所需要的转换就是在原图像的每个像素值后插入一个0。
具体转换代码如下:
void complextrans(short *in,int *out)
{
int i;
for (i=0;i<256*256;i++)
{
out[2*i]=in[i];
out[2*i+1]=0;
}
}
5.4 一文FFT生成二文FFT函数
dsplib里的FFT函数是一文FFT函数,可以使用一文FFT来产生二文FFT。将二文矩阵每一行作一次一文FFT,然后把得到的结果的每一列再作一文FFT,这样就得到这个二文矩阵的二文FFT。我用了两个函数来实现这个功能。
void zhuanzhi(int *in,int *out)
{
int i,j;
for(i=0;i<256;i++)
{
for(j=0;j<256;j++)
{
out[512*i+2*j]=in[512*j+2*i];
out[512*i+2*j+1]=in[512*j+2*i+1];
}
}
}
void fft2(int *im_in,int *im_out,int *twiddle,int n)
{
int x;
int dim2=(int)(n*2);
int row_start=0;
for(x=0;x<n;x++)
{
DSP_fft32x32(twiddle,n,&im_in[row_start],&im_out[row_start]);
row_start+=dim2;
}
zhuanzhi(im_out,testin);
row_start=0;
for(x=0;x<n;x++)
{
DSP_fft32x32(twiddle,n,&testin[row_start],&testout[row_start]);
row_start+=dim2;
}
zhuanzhi(testout,im_out);
}
程序中,将二文矩阵每一行作一文FFT,得到的结果转置,每一行继续作一文FFT,最后将二次得到的结果再次转置,即得到二文FFT。
同理,逆变换也可用这种方法求得。
5.5 求出偏移量
在傅氏变换后,将前后两幅图像的频谱相除,得到相位偏移量,然后将相位偏移量的矩阵逆变换,则得到空间偏移量的矩阵。在这个矩阵中找到最大值,其坐标经过一定的变换就得到场景的偏移量。这里我们通过码盘信息,将搜素区域从全图变为码盘数据周围的区域,缩小了搜索范围。需要指明的是:场景向右移动定义为正向移动,场景向左移动定义为逆向移动。 基于DSP实现的移动场景的相位配准(9):http://www.751com.cn/wuli/lunwen_1614.html