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的分辨率。常见的缩放算法有均值差值法,双线性差值法和三线性差值法。这里我们就采用双线性插值法来实现。
使用下面的公式算出转换后图像上的点对应于原图像上哪一点: