2015-02-03 3 views
2

여러 가지 이유로 1D 변환과 같은 실제 데이터 입력의 2D FFT 변환 (정방향 및 역방향 모두)이 필요합니다. 나는 우수한 FFTW 라이브러리를 사용합니다.FFTW를 사용한 1 차원 FFT와 같은 2D R2C FFT

알고리즘은 간단해야합니다. 먼저 모든 행과 모든 결과 열의 1D 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 출력이 복소수의 중복되지 않은 배열 일 뿐이라는 사실에 문제가 있습니까? 아니면 고급 인터페이스를 잘못 사용 했습니까?

+0

의 기능 fftw_plan_dft_r2c_2d()를 참조하십시오. 또한 모든 nembed 매개 변수는 NULL 일 수 있으므로이 예제에서는 사용할 필요가 없습니다. – user3452579

+0

나는 감동했다 : 당신의 제목은 문자 그대로 75 % 약어이다. –

답변

0

기본 FFT 알고리즘은 복잡합니다. 이 부분을 사용하면 두 개의 1 차원 FFT 시퀀스에서 2 차원 FFT를 나눌 수 있습니다.

일반적인 FFT 인터페이스

최적화를 많이 수행> 복잡한 FFT에게 컴플렉스을 복잡한 배열
  • 제거 중복 부분을

    1. 팩 실제 입력을

    그것을 행 (column)을 호출해야하는 부분 (2)입니다.

  • +0

    그것은 더 느리고 R2C 변환의 모든 목적을 이깁니다. – user3452579

    0

    FFTW의 2D 버전을 직접 호출하는 이유는 무엇입니까?

    내가 마지막에`nbr`의 값은 단지`M`가 아닌`M2`해야한다, 변환 오류를 발견

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

    +0

    2d는 내가 필요로하는 방식으로 작동하지만, 말했듯이 2x1d로 필요했습니다. 어쨌든, 나는 오래 전에 문제를 해결했다. 문제는 고급 인터페이스의 매개 변수 중 하나 였고, 나는이 예에서 기억하지 못한다. – user3452579