[英]2D R2C FFT as 1D FFT using FFTW
由於各種原因,我需要對真實數據輸入進行2D FFT轉換(正向和反向)作為1D轉換。 我使用了出色的FFTW庫。
算法應該很簡單,首先我對每一行進行一維R2C轉換,然后對每一列進行一維轉換。 為此,我使用了FFTW的高級界面:
int N = ...; int M = ...; int M2 = M / 2 + 1;
r_array = ... // fftw_malloc'd as NxM array of doubles
c_array = ... // fftw_malloc'd as NxM2 array of fftw_complex
int rank = 1;
int nfr[] = {M}; int nfr2[] = {M2};
int howmany = N;
int idist = M; int odist = M2;
int istride = 1; int ostride = 1;
int *inembed = nfr, *onembed = nfr2;
plan_forward_row = fftw_plan_many_dft_r2c(rank, nfr, howmany, r_array, inembed, istride, idist, c_array, onembed, ostride, odist, FFTW_ESTIMATE);
fftw_execute(plan_forward_row);
//do something else...
int nfc[] = {N};
howmany = M2;
idist = 1; odist = 1;
istride = N, ostride = N;
inembed = nfc, onembed = nfc;
plan_forward_col = fftw_plan_many_dft(rank, nfc, howmany, c_array, inembed, istride, idist, c_array, onembed, ostride, odist, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(plan_forward_col);
//do something else...
//now inverse (backward)...
int nbc[] = {N};
howmany = M2;
idist = 1; odist = 1;
istride = N; ostride = N;
inembed = nbc; onembed = nbc;
plan_backward_col = fftw_plan_many_dft(rank, nbc, howmany, c_array, inembed, istride, idist, c_array, onembed, ostride, odist, FFTW_BACKWARD, FFTW_ESTIMATE);
fftw_execute(plan_backward_col);
//do something else...
int nbr[] = {M2}; int nbr2[] = {M};
howmany = Nx;
idist = M2; odist = M;
istride = 1, ostride = 1;
inembed = nbr, onembed = nbr2;
plan_backward_row = fftw_plan_many_dft_c2r(rank, nbr, howmany, c_array, inembed, istride, idist, r_array, onembed, ostride, odist, FFTW_ESTIMATE);
fftw_execute(plan_backward_row);
但是,結果不正確。 問題是否在於R2C輸出只是復數的非冗余數組,還是我在使用高級接口時犯了一個錯誤?
基本的FFT算法是complex-> complex。 使用此部分,您可以將2d FFT分為兩個1d FFT序列。
常用的FFT接口做了很多優化:
這是第(2)部分,您需要先調用行,然后再調用列。
為什么不直接調用FFTW的2D版本?
請參閱中的函數fftw_plan_dft_r2c_2d()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.