FFTW: 正向fft的反向fft结果不等于原始函数

3

我正在尝试使用FFTW计算快速求和,但遇到了一个问题:

int numFreq3 = numFreq*numFreq*numFreq;

FFTW_complex* dummy_sq_fft = (FFTW_complex*)FFTW_malloc( sizeof(FFTW_complex)*numFreq3 );

FFTW_complex* dummy_sq = (FFTW_complex*)FFTW_malloc( sizeof(FFTW_complex)*numFreq3 );

FFTW_complex* orig = (FFTW_complex*)FFTW_malloc( sizeof(FFTW_complex)*numFreq3 );

FFTW_plan dummyPlan = FFTW_plan_dft_3d( numFreq, numFreq, numFreq,
                  orig, dummy_sq_fft,
                  FFTW_FORWARD, FFTW_MEASURE );

FFTW_plan dummyInvPlan = FFTW_plan_dft_3d( numFreq, numFreq, numFreq,
                      dummy_sq_fft, dummy_sq,
                      FFTW_BACKWARD, FFTW_MEASURE );

for(int i= 0; i < numFreq3; i++) {
  orig[ i ][ 0 ] = sparseProfile02[ 0 ][ i ][ 0 ];
  //img. part == 0
  orig[ i ][ 1 ]  = sparseProfile02[ 0 ][ i ] [ 1 ];
}

FFTW_execute(dummyPlan);
FFTW_execute(dummyInvPlan);

int count = 0; 
for(int i=0; i<numFreq3; i++) {
  double factor = dummy_sq[ i ][ 0 ]/sparseProfile02[ 0 ][ i ][ 0 ];

  if(factor < 0) {
    count++;
  }
}

std::cout<<"Count "<<count<<"\n";

FFTW_free(dummy_sq_fft);
FFTW_free(dummy_sq);
FFTW_destroy_plan(dummyPlan);
FFTW_destroy_plan(dummyInvPlan);

这里的 sparseProfile02[0] 是 FFTW_complex* 类型,仅包含正实数数据。

由于我们有 dummy_sq = IFFT(FFT(sparseProfile02[ 0 ])),因此我们必须有 dummy_sq = n^3*sparseProfile02。但这只在某些情况下成立;事实上,当 sparseProfile02 网格上的相应值为零时(但反之不成立),dummy_sq 网格上的值是负数。有人知道这是为什么吗?


请注意引用格式(使用“>”)和代码格式(使用四个空格缩进)之间的区别。请参阅http://stackoverflow.com/editing-help。 - dmckee --- ex-moderator kitten
可能是fftw3反向变换无法工作的重复问题。 - Alexander Vogt
2个回答

2

冒着涉及死灵术的风险,您应该注意在fftw文档(此处)中明确指出fftw不进行归一化,因此先前变换的信号的反向变换结果将是原始信号乘以'n'或信号长度。

这可能是问题所在。


1

快速傅里叶变换(正向和反向)存在舍入误差,我认为这可能是问题所在。一般来说,您不应该期望零通过您的过程保持完全为零(尽管它可能对于简单的测试用例为零)。在您的测试循环中,是

fabs(dummy_sq[i][0] - numFreq*numFreq*numFreq*sparseProfile02[0][i][0])

相对于您的数据规模而言,是否很大?

以下是一个非常简单(病态)的例子,仅使用大小为2的1D FFT和实数值:

ifft(fft([1e20, 1.0])) != [2e20, 2.0]

在双精度FFT中,1.0已经在1e20中丢失。

当您在sparseProfile02中除以零采样时,可能会得到一些NaN因子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接