w[k + 3] = M * cos(2.0 * PI * (i + j) / n);
w[k + 2] = M * sin(2.0 * PI * (i + j) / n);
/*twiddle factor for the third output of first butterfly*/
w[k + 5] = -M * cos(4.0 * PI * (i ) / n);
w[k + 4] = -M * sin(4.0 * PI * (i ) / n);
/*twiddle factor for the third output of second butterfly*/
w[k + 7] = -M * cos(4.0 * PI * (i + j) / n);
w[k + 6] = -M * sin(4.0 * PI * (i + j) / n);
/*twiddle factor for the fourth output of first butterfly*/
w[k + 9] = M * cos(6.0 * PI * (i ) / n);
w[k + 8] = M * sin(6.0 * PI * (i ) / n);
/*twiddle factor for the fourth output of second butterfly*/
w[k + 11] = M * cos(6.0 * PI * (i + j) / n);
w[k + 10] = M * sin(6.0 * PI * (i + j) / n);
k += 12;
}
}
}
请注意,上面的代码里,为了 FFT乘法的方便,有些旋转因子的符号被调整。FFT实现在做复数乘法运算时都巧妙的补偿了这些调整的符号。其它FFT函数需要的旋转因子表可能略有不同,在 DSP库里面,每个 FFT函数都提供了一个对应的旋转因子生成函数。通常,旋转因子生成函数在软件初始化阶段调用,生成的旋转因子表被存到数组里。对于不同的FFT点数,要生成不同的旋转因子表。FFT函数则在运行的过程中反复调用,旋转因子表也被反复使用。同时也要注意,旋转因子和输入输出矩阵也一样,也是实部虚部交错存放的。
5.2 图像的预处理
在图像进行FFT之前,首先要满足长度和宽度都是2的整数次幂,但是视频来源往往有不满足这个条件的情况,例如,我所使用的红外视屏的分辨率是320*256的格式。所以,要想办法来解决这一问题。
传统的解决这一问题的方法是补零法,即在图像宽或高的一边补上零,直到宽和高都是2的整数次幂,但是在实际操作中证明,补上的零会成为整个图像相当于噪声的存在,所以,补零法是不可取的。经过思考和实践,可以使用图像的缩放来解决这个问题,例如将320*256的分辨率缩放为256*256的分辨率。常见的缩放算法有均值差值法,双线性差值法和三线性差值法。这里我们就采用双线性插值法来实现。
使用下面的公式算出转换后图像上的点对应于原图像上哪一点:
其中w1为原图像的宽度,w2为转换后图像的宽度;h1为原图像的高度,h2为转换后的图像的高度。那么可以算出这一点P(x,y)如下图:
x和y算下来都不是整数, 、 、 、 为离P点最近的4个整点,通过这四点能近似得算出P点对应的灰度值:
我使用的320*256的分辨率转化为了256*256的分辨率,具体代码如下:
void scaling(short *imin,short *imout)
{
int i,j,k1,k2;
float m,m1,m2;
for(j=1;j<255;j++)
{
m=j*1.25;
k1=m;
k2=k1+1; 基于DSP实现的移动场景的相位配准(8):http://www.751com.cn/wuli/lunwen_1614.html