1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| program fft2
implicit none
integer, parameter :: N=10,M=10,S=1
integer :: i,j
complex, dimension(n1,n2) :: A
do i=1,M
do j=1,N
A(i,j)=1.
end do
end do
call ft2d(N,M,A,S)
subroutine ft2d(n1,n2,cp,isig)
implicit none
integer :: n1,n2,isig,i1,i2
complex :: cp(n1,n2),cw(n2)
external fork
do i2= 1,n2
call fork(n1,cp(1,i2),isig)
end do
do i1= 1,n1
do i2= 1,n2
cw(i2)= cp(i1,i2)
end do
call fork(n2,cw,isig)
do i2= 1,n2
cp(i1,i2)= cw(i2)
end do
end do
return
end subroutine ft2d
subroutine fork(lx,cx,isig)
implicit none
integer :: lx,isig,i,j,l,m,istep
complex :: cx(lx),carg,cexp,cw,ctemp
real :: pii,sc
pii= 4.*atan(1.)
j= 1
sc= sqrt(1./lx)
do i= 1,lx
if(i <= j) then
ctemp= cx(j)*sc
cx(j)= cx(i)*sc
cx(i)= ctemp
end if
m= lx/2
do while (m >= 1 .and. j > m)
j= j-m
m= m/2
end do
j= j+m
end do
l= 1
do while (l < lx)
istep= 2*l
do m= 1,l
carg= cmplx(0.,1.)*(pii*isig*(m-1))/l
cw= cexp(carg)
do i= m,lx,istep
ctemp= cw*cx(i+l)
cx(i+l)= cx(i)-ctemp
cx(i)= cx(i)+ctemp
end do
end do
l= istep
end do
return
end subroutine fork
end program fft2 |
Partager