You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFTW库原地2D R2C FFT实现结果异常问题求助

问题分析与修复方案

你遇到的原地R2C变换结果异常问题,根源在于输入数据的内存布局错误,以及结果匹配逻辑的条件判断错误。以下是具体问题和修复方法:

1. 输入数据的内存布局错误

FFTW的原地R2C 2D变换要求输入实数据存储在具有特定 stride(行跨度)的内存中:

  • 你为in3分配了N_x * 2 * (N_y/2 +1)大小的内存(正确,对应每个行存储2*(N_y/2+1)个double)
  • 但复制输入数据时,使用了i*N_y +j作为索引,这意味着每行的跨度是N_y(20),而FFTW期望的行跨度是2*N_y_complex(22)

修复代码:
将原地R2C部分的输入复制循环修改为:

// Assign values for the real function to be transformed
for(int i = 0; i < N_x; i++){
    for(int j = 0; j < N_y; j++){
        // 使用正确的行跨度:2*N_y_complex
        in3[i * 2 * N_y_complex + j] = in[i * N_y + j];
    }
}

2. 结果匹配逻辑的条件判断错误

在对比结果时,你使用了&&逻辑运算符,这意味着只有当实部和虚部的误差同时超过容差时才判定为不匹配。但实际上,只要任意一个分量误差超过容差,就应该判定为不匹配。

修复代码:
将两处结果对比的条件中的&&改为||:

原地C2C对比部分

if(abs(out[i * N_y_complex + j][0] - in2[i * N_y_complex + j][0]) > tol || abs(out[i * N_y_complex + j][1] - in2[i * N_y_complex + j][1]) > tol){
    success = false;
    goto skiploop;
}

原地R2C对比部分

if(abs(out[i * N_y_complex + j][0] - ((fftw_complex*)in3)[i * N_y_complex + j][0]) > tol || abs(out[i * N_y_complex + j][1] - ((fftw_complex*)in3)[i * N_y_complex + j][1]) > tol){
    success = false;
    goto skiploop2;
}

修复后的效果

完成上述修改后,原地R2C变换的结果将与非原地R2C、原地C2C变换的结果一致,调试打印的首个实部值会变为正确的25。

内容的提问来源于stack exchange,提问作者Felipe_SC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:42:31