我正在对图像使用以下快速傅立叶逆变换(FFT)的实现,其中大小为N x N的图像被存储在长度为N x N(其中N是平方数)的向量中.当我给这个实现提供一个零的矩阵时,除了两个1,一个在中心上方几行,在中心对称下方,反转正确地是一个具有垂直频带的图像,其频率与1的位置相匹配.
然而,当1在中心的左侧和右侧时,我得到的是水平条带,但它们并不完全是水平的.他们有一个非常小的坡度.当我在MATHEMICA中使用内置的InverseFourier
函数执行完全相同的操作时,条带非常精确地水平排列.
下面的JavaScript实现中有什么错误吗?相关代码如下所示;完整的MWE可在this JSFiddle下载
function invFFT_radix2(out, start, input, N, offset, s ) {
if (N === 1) {
out[start] = input[offset];
} else {
invFFT_radix2(out, start, input, N/2, offset, 2*s);
invFFT_radix2(out, start+N/2, input, N/2, offset+s, 2*s);
for (var k = 0; k < N/2; k++) {
var twiddle = cisExp(2*Math.PI*k/N);
var t = out[start+k];
out[start+k] = t.plus ( twiddle.times(out[start+k+N/2]) );
out[start+k+N/2] = t.minus( twiddle.times(out[start+k+N/2]) );
}
}
}
使用调用
invFFT_radix2(out, 0, input, input.length, 0, 1 )
其中input
是输入向量,out
包含结果.所有条目都是Complex
个数字(按照this response),并且函数cisExp
被定义为
function cisExp(x) { // e^ix = cos x + i*sin x
return new Complex(Math.cos(x), Math.sin(x));
}
As a comparision, this is the magnified top of the image with the JSFiddle
JS图像从左侧的白线开始,右侧变为黑色.