[edit 1] Menambahkan gambar untuk menampilkan data asli dan data yang diperoleh
[edit 2] Saya menemukan kesalahan saya, saya menggunakan fftw_measure alih-alih fftw_estimate dalam panggilan dfftw_plan_many_dft
[edit 3] memperbaiki kesalahan ketik pada kode (ganti u dengan u2d di dfftw_execute_dft_r2c )
Saya mencoba melakukan fft 2D dari sebuah array menggunakan beberapa fft 1D daripada menggunakan fungsi fft 2D yang sudah ada di perpustakaan fftw. Dan selanjutnya, saya perlu melakukan fft 2D terbalik. Alasan untuk melakukan itu adalah (di masa depan) array saya akan terlalu besar untuk dimuat sekaligus untuk melakukan fft 2D.
Draf pertama kode saya terlihat kurang lebih seperti ini saat ini:
double precision u2d(nx,ny),u2d2(nx,ny)
double complex qhat2d(nx/2+1,ny),qhat2d2(nx/2+1,ny)
integer N(1)
integer howmany, idist, odist, istride, ostride
integer inembed(2), onembed(2)
integer rank
! some function to read the data into u2d
! perform x-fft
N(1) = NX
howmany = NY
inembed(1) = NX
inembed(2) = NY
istride = 1
idist = NX
ostride = 1
odist = (NX/2+1)
onembed(1) = (NX/2+1)
onembed(2) = NY
rank = 1
write(*,*) 'u', u2d(1,1)
CALL dfftw_plan_many_dft_r2c(PLAN,rank,N(1),howmany,
& u2d,inembed,
& istride,idist,
& qhat2d,onembed,
& ostride,odist,FFTW_ESTIMATE) !
CALL dfftw_execute_dft_r2c(PLAN,u2d,qhat2d) ! x-fft
CALL dfftw_destroy_plan(PLAN)
! perform y-fft
N(1) = NY
howmany = (NX/2+1)
inembed(1) = (NX/2+1)
inembed(2) = NY
istride = (NX/2+1)
idist = 1
ostride = (NX/2+1)
odist = 1
onembed(1) = (NX/2+1)
onembed(2) = NY
rank = 1
CALL dfftw_plan_many_dft(PLAN,rank,N(1),howmany,
& qhat2d,inembed,
& istride,idist,
& qhat2d2,onembed,
& ostride,odist,FFTW_FORWARD,
& FFTW_MEASURE) !
CALL dfftw_execute_dft(PLAN,qhat2d,qhat2d2) ! y-fft
CALL dfftw_destroy_plan(PLAN)
! normally here, perform some filtering operation
! but at the moment, I do nothing
! perform inv-y-fft
N(1) = NY
howmany = (NX/2+1)
inembed(1) = (NX/2+1)
inembed(2) = NY
istride = (NX/2+1)
idist = 1
ostride = (NX/2+1)
odist = 1
onembed(1) = (NX/2+1)
onembed(2) = NY
rank = 1
CALL dfftw_plan_many_dft(PLAN,rank,N(1),howmany,
& qhat2d2,inembed,
& istride,idist,
& qhat2d,onembed,
& ostride,odist,FFTW_BACKWARD,
& FFTW_MEASURE) !
CALL dfftw_execute_dft(PLAN,qhat2d2,qhat2d) ! inv-y-fft
CALL dfftw_destroy_plan(PLAN)
! perform inv-x-fft
N(1) = NX ! I'm not too sure about this value here
howmany = NY
inembed(1) = (NX/2+1)
inembed(2) = NY
istride = 1
idist = (NX/2+1)
ostride = 1
odist = NX
onembed(1) = NX
onembed(2) = NY
rank = 1
CALL dfftw_plan_many_dft_c2r(PLAN,rank,N(1),howmany,
& qhat2d,inembed,
& istride,idist,
& u2d2,onembed,
& ostride,odist,FFTW_ESTIMATE) !
CALL dfftw_execute_dft_c2r(PLAN,qhat2d,u2d2) ! x-fft
CALL dfftw_destroy_plan(PLAN)
write(*,*) 'u2d2', u2d2(1,1)
do i=1,nx
do j=1,ny
u2d2(i,j) = u2d2(i,j) / (nx*ny)
enddo
enddo
write(*,*) 'u2d2', u2d2(1,1) ! here the values u2d2(1,1) is different from u2d(1,1)
! some action to write u2d2 to file
end
Saya mengharapkan u2d dan u2d2 sama tetapi saya mendapatkan nilai yang relatif berbeda. Apakah saya melakukan kesalahan di suatu tempat?
Asli dan hasilnya ditampilkan di bawah ini. Bentuknya terlihat serupa tetapi nilainya relatif berbeda (misalnya minimum dan maksimum).
_r2c
) bernilai nyata pada data kompleks? - person Alexander Vogt   schedule 23.05.2016