2D R2C FFTW:傅立叶系数的阶数

问题描述 投票:0回答:2

我已经多次使用 1D c2c 变换,没有任何问题。 N 个网格点变换的傅里叶系数的顺序为:f_0, f_1, f_2, ..., f_N/2, f_-N/2+1, ...., f_-1。

我只是无法弄清楚 2D R2C FFTW 的系数顺序。 我正在使用以下代码。使用 2D_r2c,标准化然后使用 2D_c2r 会产生原始输入,因此应该不会有错误。

void mFFTW2D(double INPUT[][STEPS], fftw_complex OUTPUT[][STEPS]){
    fftw_plan my_PLAN = fftw_plan_dft_r2c_2d(STEPS, 
                        STEPS,
                        *INPUT,
                        *OUTPUT,
                        FFTW_ESTIMATE);
    fftw_execute(my_PLAN);
    fftw_destroy_plan(my_PLAN);
}

void mIFFTW2D(fftw_complex INPUT[][STEPS], double OUTPUT[][STEPS]){
    fftw_plan my_PLAN = fftw_plan_dft_c2r_2d(STEPS,
                        STEPS,
                        *INPUT,
                        *OUTPUT,
                        FFTW_ESTIMATE);
    fftw_execute(my_PLAN);
    fftw_destroy_plan(my_PLAN);
    D2Norm(OUTPUT); //properly normalized: STEPS^-2
}

double INN[STEPS][STEPS];
fftw_complex OUTT[STEPS][STEPS];

// read in signal in INN
mFFTW2D(INN, OUTT);
// what is the order of the fourier coefficients in OUTT?
mIFFTW2D(OUTT, INN);

我使用 f(x,y)=sin(ax)*sin(ay) 作为测试输入信号。 “a”的选择方式是,信号将是正弦一个周期的整数倍(无泄漏效应)。我特别惊讶的是 x 和 y 的傅里叶系数没有对称性。

c 2d fftw coefficients
2个回答
0
投票

fftw_plan_dft_r2c_2d
的输出不是由
STEP
组成的
STEP
双精度数组。由于输入是实数,在傅里叶空间中,相反的频率是共轭的 $X_{N-k} = X_k^*$。 (http://en.wikipedia.org/wiki/Fast_Fourier_transform)

fftw_c2r
fftw_r2c
考虑到这一点。仅存储一半频率,减少计算量。

http://www.fftw.org/fftw3_doc/Real_002ddata-DFT-Array-Format.html#Real_002ddata-DFT-Array-Format

因此,你可能宁愿使用这样的东西(如果它有效的话):

mFFTW2D(double INPUT[][STEPS], fftw_complex OUTPUT[][STEPS/2+1])

观察数组的大小

OUTT
:你也可以减少它并获得内存!

fftw_complex OUTT[STEPS][STEPS/2+1];

0
投票

OUT 数组在逆变换例程中使用时会被修改,因此您必须在执行此操作之前对其进行检查。波数作为当时的文档。

© www.soinside.com 2019 - 2024. All rights reserved.