簡體   English   中英

使用FFTW的2D R2C FFT作為1D FFT

[英]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接口做了很多優化:

  1. 將實際輸入打包到復雜的數組中
  2. 做復雜->復雜FFT
  3. 卸下多余的零件

這是第(2)部分,您需要先調用行,然后再調用列。

為什么不直接調用FFTW的2D版本?

請參閱中的函數fftw_plan_dft_r2c_2d()

http://www.fftw.org/fftw3_doc/Multi_002dDimensional-DFTs-of-Real-Data.html#Multi_002dDimensional-DFTs-of-Real-Data

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM