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
相关产品推荐
相关产品推荐

