여러 가지 이유로 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 출력이 복소수의 중복되지 않은 배열 일 뿐이라는 사실에 문제가 있습니까? 아니면 고급 인터페이스를 잘못 사용 했습니까?
의 기능
fftw_plan_dft_r2c_2d()
를 참조하십시오. 또한 모든 nembed 매개 변수는 NULL 일 수 있으므로이 예제에서는 사용할 필요가 없습니다. – user3452579나는 감동했다 : 당신의 제목은 문자 그대로 75 % 약어이다. –