File: fft842.f

package info (click to toggle)
scilab 2.2-4
  • links: PTS
  • area: non-free
  • in suites: hamm
  • size: 31,472 kB
  • ctags: 21,963
  • sloc: fortran: 110,983; ansic: 89,717; makefile: 3,016; sh: 1,892; csh: 150; cpp: 101
file content (118 lines) | stat: -rw-r--r-- 2,985 bytes parent folder | download | duplicates (4)
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
      subroutine fft842(in, n, x, y,err)
c          programe de transformee de fourier rapide pour n=2**m
c             -  algorithme de cooley-tukey   -
c!entrees
c
c  ce logiciel traite des entrees complexes sous forme de deux tableaux
c
c -1] tableau representant les coefficients reels      :x(i)
c -1] tableau representant les coefficients complexes  :y(i)
c
c options :
c           directe  ----> code=0
c           indirecte----> code=1
c
c          si la dimension (suite de nombres complexes n'est pas de
c          dimension 2**n tel que  0<n<15 )err est positionne a 1 .
c
c
      integer ij,ji,m,nt,n2pow,fn,n8pow,nxtlt,lengt
      integer err
      double precision pi2,p7
      double precision pi,r,fi
      double precision x(*), y(*)
      dimension l(15)
      equivalence(l15,l(1)),(l14,l(2)),(l13,l(3)),(l12,l(4)),
     & (l11,l(5)),(l10,l(6)),(l9,l(7)),(l8,l(8)),(l7,l(9)),
     & (l6,l(10)),(l5,l(11)),(l4,l(12)),(l3,l(13)),(l2,l(14)),
     & (l1,l(15))
c
      pi2=8.0d+0*atan(1.0d+0)
      pi=acos(-1.0d+0)
      p7=1.0d+0/sqrt(2.0d+0)
      do 10 i=1,15
      m=i
      nt=2**i
      if(n.eq.nt)goto 20
10    continue
c
c          erreur puissance de 2 non respecte)==> err=1
c
      err=1
      return
c         aucune erreur===> err=0
20    err=0
      n2pow=m
      nthpo=n
      fn=nthpo
      if(in.eq.1)goto 40
      do 30 i=1,nthpo
      y(i)=-y(i)
30    continue
40    n8pow=n2pow/3
      if(n8pow.eq.0)goto 60
c
c developement de l'algoritme en base 8 si ...
c
      do 50 ipass=1,n8pow
      nxtlt=2**(n2pow-3*ipass)
      lengt=8*nxtlt
      call r8tx(nxtlt, nthpo, lengt, x(1), x(nxtlt+1), x(2*nxtlt+1),
     & x(3*nxtlt+1), x(4*nxtlt+1), x(5*nxtlt+1), x(6*nxtlt+1),
     & x(7*nxtlt+1), y(1), y(nxtlt+1), y(2*nxtlt+1), y(3*nxtlt+1),
     & y(4*nxtlt+1), y(5*nxtlt+1), y(6*nxtlt+1), y(7*nxtlt+1))
50    continue
c
c is there a four factor left
c
60    if(n2pow-3*n8pow-1)90, 70, 80
c
c iteration de l'algoritme en base 2
c
70    call r2tx(nthpo, x(1), x(2), y(1), y(2))
      goto 90
c
c iteration de l'algoritme en base 4
c
80    call r4tx(nthpo, x(1), x(2), x(3), x(4), y(1), y(2), y(3), y(4))
c
90    do 110 j=1,15
      l(j)=1.0d+0
      if(j-n2pow)100, 100, 110
100   l(j)=2.0d+0**(n2pow+1-j)
110   continue
      ij=1
      do 130 j1=1,l1
      do 130 j2=j1,l2,l1
      do 130 j3=j2,l3,l2
      do 130 j4=j3,l4,l3
      do 130 j5=j4,l5,l4
      do 130 j6=j5,l6,l5
      do 130 j7=j6,l7,l6
      do 130 j8=j7,l8,l7
      do 130 j9=j8,l9,l8
      do 130 j10=j9,l10,l9
      do 130 j11=j10,l11,l10
      do 130 j12=j11,l12,l11
      do 130 j13=j12,l13,l12
      do 130 j14=j13,l14,l13
      do 130 ji=j14,l15,l14
      if(ij-ji)120, 130, 130
120   r=x(ij)
      x(ij)=x(ji)
      x(ji)=r
      fi=y(ij)
      y(ij)=y(ji)
      y(ji)=fi
130   ij=ij+1
      if(in.eq.1)goto 150
      do 140 i=1,nthpo
      y(i)=-y(i)
140   continue
      goto 170
150   do 160 i=1,nthpo
      x(i)=x(i)/fn
      y(i)=y(i)/fn
160   continue
170   return
      end