我正在对图像使用以下快速傅立叶逆变换(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 enter image description here

and with Mathematica enter image description here

JS图像从左侧的白线开始,右侧变为黑色.

推荐答案

2D[逆]DFT是一个轴上的一维版本,所以你可以这样做,例如,

for (let i = 0; i < 2; i++) {
  for (let y = 0; y < HEIGHT; y++) {
    invFFT_radix2(out, y * WIDTH, ss, WIDTH, y * WIDTH, 1);
  }
  ss = out.slice();
  transpose(ss);
}

哪里

const WIDTH = 256;
const HEIGHT = 256;
const swap = (arr, i, j) => {
  const t = arr[i];
  arr[i] = arr[j];
  arr[j] = t;
};
const transpose = (ss) => {
  for (let i = 1; i < HEIGHT; i++) {
    for (let j = 0; j < i; j++) {
      swap(ss, i * WIDTH + j, j * WIDTH + i);
    }
  }
};

Javascript相关问答推荐

用户单击仅在JavaScript中传递一次以及其他行为

禁用从vue.js 2中的循环创建的表的最后td的按钮

确定MutationRecord中removedNodes的索引

如何在表格上拥有水平滚动条,在正文页面上拥有垂直滚动条,同时还对html表格的标题使用位置粘性?

如何在使用fast-xml-parser构建ML时包括属性值?

如何才能拥有在jQuery终端中执行命令的链接?

类型自定义lazy Promise. all

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

如何为我的astro页面中的相同组件自动创建不同的内容?

Regex结果包含额外的match/group,只带一个返回

Websocket错误—有一个或多个保留位开启:reserved1 = 1,reserved2 = 0,reserved3 = 0

这个值总是返回未定义的-Reaction

用JS从平面文件构建树形 struct 的JSON

使用js构造一个html<;ath&>元素并不能使其正确呈现

如何在Node.js中排除导出的JS文件

如何在HTMX提示符中设置默认值?

删除加载页面时不存在的元素(JavaScript)

在不扭曲纹理的情况下在顶点着色器中旋转UV

判断函数参数的类型

ComponentWillReceiveProps仍在React 18.2.0中工作