hp41programs

Spectral Analysis

Spectral Analysis for the HP-41


Overview
 

 1°) One Dimensional Problems - Real Arguments

   1-a)  The Discrete Fourier Transform  ( program#1 )
   1-b)  The Discrete Fourier Transform  ( program#2 )
   1-c)  Filon's Formula
   1-d)  More Accurate Filon-Type Formulae

    1-d-1)  n = multiple of 4
    1-d-2)  n = multiple of 6

 2°) One Dimensional Problems - Complex Arguments

   2-a)  The Discrete Fourier Transform
   2-b)  The Fast Fourier Transform

 3°) Two Dimensional Problems - Real Arguments

   3-a)  The Discrete Fourier Transform  ( program#1 )
   3-b)  The Discrete Fourier Transform  ( program#2 )

 4°)  Two Dimensional Problems - Complex Arguments

 5°)  Three Dimensional Problems - Real Arguments

 6°)  Three Dimensional Problems - Complex Arguments
 
 

1°) One-dimensional Problems - Real Arguments
 

         a) The Discrete Fourier Transform ( Program#1 )
 

-Given an array of n real numbers  [ a1 , .......... , an ] ,  "DFT" computes the complex components zk = xk + i yk
 of the Discrete Fourier Transform   [ z1 , .......... , zn ]

-We have  zk = Sum j=1,2,...,n   aj exp( -2i(pi) (j-1).(k-1)/n )             i = sqrt(-1)
 

Data Registers:         •  R00 = n                                           ( Registers R00 thru Rnn are to be initialized before executing "DFT" )

                                    •   R01 = a1   •   R02 = a2  ................  •   Rnn = an
Flags: /
Subroutines:  /
 
 

 01  LBL "DFT"
 02  DEG
 03  STO O
 04  360
 05  ST* Y
 06  -
 07  RCL 00
 08  STO M
 09  /
 10  STO N
 11  CLST
 12  LBL 01
 13  RCL M
 14  RCL N
 15  ST* Y
 16  -
 17  RCL IND M
 18  P-R
 19  ST+ T
 20  RDN
 21  -
 22  DSE M
 23  GTO 01
 24  RCL O
 25  SIGN
 26  X<> Z
 27  CLA
 28  END

 
( 51 bytes / SIZE nnn+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            yk
           X             k            xk
           L             /            k

 
Example:    Calculate  DFT  [ 6  3  2  1 ]

 n = 4  STO 00            6  STO 01    3  STO 02    2  STO 03    1  STO 04

      1  XEQ "DFT"  >>>>   x1 = 12   X<>Y   y1 =  0
      2       R/S          >>>>   x2 =  4    X<>Y   y2 = -2
      3       R/S          >>>>   x3 =  4    X<>Y   y3 =  0
      4       R/S          >>>>   x4 =  4    X<>Y   y4 =  2

-So,   DFT [ 6  3  2  1 ]  =  [ 12  4-2.i  4  4+2.i ]

Notes:

-For n = 100 , execution time = 85 seconds / component
-The discrete inverse Fourier transform may be computed by an almost identical program:
 
 

01  LBL "IDFT" 
02  DEG
03  STO O
04  360
05  ST* Y
06  -
07  RCL 00
08  STO M       
09  /
10  STO N
11  CLST
12  LBL 01
13  RCL M
14  RCL N
15  ST* Y
16  -
17  RCL IND M
18  P-R
19  ST+ T
20  RDN
21  +  
22  DSE M
23  GTO 01       
24  RCL 00
25  ST/ Z
26  /
27  RCL O
28  SIGN
29  X<> Z       
30  CLA
31  END
 

 
   ( 56 bytes / SIZE nnn+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            yk
           X             k            xk
           L             /            k

 
Example:    Calculate  IDFT  [ 6  3  2  1 ]

 n = 4  STO 00            6  STO 01    3  STO 02    2  STO 03    1  STO 04

      1  XEQ "IDFT"  >>>>   x1 =  3    X<>Y   y1 =   0
      2       R/S           >>>>   x2 =  1    X<>Y   y2 =  0.5
      3       R/S           >>>>   x3 =  1    X<>Y   y3 =   0
      4       R/S           >>>>   x4 =  1    X<>Y   y4 = -0.5

-So,   IDFT [ 6  3  2  1 ]  =  [ 3  1+i/2  1  1-i/2 ]

Note:

-I've used the formulae that produce the same results as the FFT & IFFT of the HP-48
-Some authors use another sign for the exponential.
 

         b) The Discrete Fourier Transform ( Program#2 )
 

-A periodic function y may be written     y(x) = a0 + a1.cos ( 360° x / n ) + b1.sin ( 360° x / n ) + .... +  ak.cos ( 360° k.x / n ) + bk.sin ( 360° k.x / n ) + ....
  ( n = period:  y(x+n) = y(x)  for all x )

-"SPA" computes the coefficients  a0 , a1 , b1 , ..... , ak , bk  ( 0 <= k <= n/2 )  using the Discrete Fourier Transform.
 

Data Registers:          •  R00 = n                                                 ( Registers R00 thru Rnn are to be initialized before executing "SPA" )

                                     •   R01 = y(1)   •   R02 = y(2)  ................  •   Rnn = y(n) = y(0)
Flags: /
Subroutines:  /
 
 

01  LBL "SPA" 
02  DEG
03  STO O
04  360
05  *
06  RCL 00
07  STO M
08  /
09  STO N
10  CLST
11  LBL 01
12  RCL N
13  RCL M
14  *
15  RCL IND L
16  P-R
17  ST+ T
18  RDN
19  +
20  DSE M      
21  GTO 01
22  RCL O
23  ST+ X
24  RCL 00
25  MOD
26  X#0?
27  SIGN
28  1
29  +
30  RCL 00      
31  /
32  ST* Z
33  *
34  RCL O      
35  SIGN
36  X<> Z
37  CLA
38  END

 
    ( 62 bytes / SIZE nnn+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            bk
           X             k            ak
           L             /            k

 ( 0 <= k <= n/2 )

Example:      y  is a periodic function ( period = 4 ) and we have the samples:

 
      x       1       2       3       4
    y(x)       6       3       2       1

-We store these data into registers R00 thru R04       4  STO 00    6 STO 01    3  STO 02   2  STO 03   1  STO 04
-Then,

    0 XEQ "SPA"  >>>      3
    1      R/S          >>>     -1   X<>Y  2
    2      R/S          >>>     -1   X<>Y  0

-Thus    y(x)  ~  3 - cos(90°x) + 2 sin(90°x) - cos(180°x)
 

         c) Filon's formula ( assuming n is even )
 

-The Discrete Fourier Transform provides a trigonometric sum which does collocate with the function y at the given data points.
-However, the true Fourier coefficients are equal to integrals of the form:     § y(x) cos(kx) dx   or   § y(x) sin(kx) dx   and the DFT is only an approximation:
  it's almost equivalent to compute these integrals by the trapezoidal rule.
-One may think, for instance, to use Simpson's rule to obtain a better accurracy: it's often true for small k-values, but in the neighborhood of n/2 it doesn't work!
-Filon has developed special formulae for such integrals. The following program uses simplified versions of this method
  and we assume that f is continuous over [ 0 n ] ( not only over [ 0 n [ )
 

Data Registers:                •  R00 = n                                                 ( Registers R00 thru Rnn are to be initialized before executing "FIL" )

                                           •   R01 = y(1)   •   R02 = y(2)  ................  •   Rnn = y(n) = y(0)
Flag:  F10
Subroutines:  /

-Synthetic registers M N O P a   are used by this program and may be replaced by any unused data registers.
-Since synthetic register a   is used, "FIL" must not be called as more than a first level subroutine.
 
 

01  LBL "FIL"   
02  DEG
03  STO a
04  360
05  *
06  RCL 00
07  STO M
08  /
09  STO N
10  X=0?
11  GTO 00
12  COS
13  CHS
14  STO Y
15  LASTX
16  SIN
17  LASTX       
18  D-R
19  /
20  ST+ T
21  ST+ X
22  +
23  *
24  1
25  +
26  RCL N
27  D-R
28  2
29  ST/ Z
30  /
31  X^2
32  ST/ Z
33  /
34  GTO 01       
35  LBL 00
36  3
37  1/X
38  ENTER^
39  ST+ Y
40  LBL 01
41  STO P
42  X<>Y
43  STO O
44  CLST
45  LBL 02
46  RCL O
47  X<> P
48  STO O
49  RCL IND M
50  *
51  SIGN
52  CLX
53  RCL M
54  RCL N
55  ST* Y
56  X<> L
57  P-R
58  ST+ T
59  RDN
60  +
61  DSE M
62  GTO 02       
63  RCL 00
64  2
65  /
66  ST/ Z
67  /
68  RCL a
69  SIGN
70  X<> Z
71  CLA
72  END

 
   ( 110 bytes / SIZE nnn+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            bk
           X             k            ak
           L            /            k

 
Example:      Suppose y is defined as   y(x) = ( 10-x ) ln ( 1+x )   over [ 0,10 ]  with a period 10

  n = 10  STO 00   and we store the exact values  y(1) into R01 , y(2) into R02 , ........... , y(10) into R10

                                                  Filon's formula ( FIL )            Exact results ( rounded to 4D )        Discrete Fourier Transform ( SPA )
and,
             0  XEQ "FIL"  >>>     6.5005                                              6.5073                                                6.4066
             1     R/S          >>>    -3.2200   X<>Y   2.1912                 -3.1971     2.1834                               -3.4022       2.1780
             2     R/S          >>>    -1.1338   X<>Y   0.5145                 -1.0982     0.5133                               -1.3152       0.5015
             3     R/S          >>>    -0.5979   X<>Y   0.1855                 -0.5562     0.2012                               -0.7953       0.1809
             4     R/S          >>>    -0.3706   X<>Y   0.0612                 -0.3353     0.0993                               -0.6120       0.0658
             5     R/S          >>>    -0.2285   X<>Y   0                          -0.2238     0.0561                               -0.2818       0

-Thus    y(x)  ~  6.5005  - 3.2200 cos(36°x) + 2.1912  sin(36°x) - 1.1338 cos(72°x) +  0.5145 sin(72°x) - ......................

Note:

-"FIL" gives exact values when y is a polynomial of degree < 3.
 

         d)  More Accurate Filon-Type Formulae
 

             d-1)  n = multiple of 4
 

-In order to compute integrals of the form    § y(x) cos(µ.x) dx   or   § y(x) sin(µ.x) dx  , we seek a formula that produces perfect accuracy
 when y(x) is a polynomial p(x) with deg p < 5

-Successive integrations by parts give:

                 §ab y(x) cos(µ.x) dx = B cos µ.b - A cos µ.a + D sin µ.b - C sin µ.a

                 §ab y(x) sin(µ.x) dx  = -D cos µ.b + C cos µ.a + B sin µ.b - A sin µ.a

                 A = y'(a)/µ2 - y'''(a)/µ4 + ......              C = y(a)/µ - y''(a)/µ3 + y'''''(a)/µ5 - ..........
 with
                 B = y'(b)/µ2 - y'''(b)/µ4 + ......              D = y(b)/µ - y''(b)/µ3 + y'''''(b)/µ5 - ..........
 

-So, we can use numerical differentiation to evaluate  A , B , C , D , namely:

   y'(a) = [ -25 y(a) + 48 y(a+h) - 36 y(a+2h) + 16 y(a+3h) - 3 y(a+4h) ] / (12h)

   y''(a) = [ 35 y(a) - 104 y(a+h) + 114 y(a+2h) -56 y(a+3h) + 11 y(a+4h) ] / (12h2)               and similar expressions for y'(b)  y''(b)  y'''(b)

   y'''(a) = [ -5 y(a) + 18 y(a+h) - 24 y(a+2h) +14 y(a+3h) - 3 y(a+4h) ] / (2h3)

   y''''(a) = [ y(a) - 4 y(a+h) + 6 y(a+2h) - 4 y(a+3h) + y(a+4h) ] / h4 = y''''(b)

-These formulas are applied with  h = 1 and  b = a+4  over the intervals [0,4]  [4,8]  , ............. , [n-4,n]    So n must be a multiple of 4
-They are exact if y(x) is a polynomial p(x) with deg p < 5

-Bode's rule is used to compute the first coefficient a0 = the mean of y(x) over the interval [0,n]
-This integration formula also gives perfect accuracy if deg p = 5
 

Data Registers:            •  R00 = n = mulptiple of 4              ( Registers R00 & R10 thru Rnn+10 are to be initialized before executing "FIL4" )

                                       •   R10 = y(0+)   •   R11 = y(1)  ................  •   Rnn+10 = y(n-)          R01 to R09: temp   R08 = 360 k/n
Flags:  /
Subroutines:  /

-Lines 40-117 are three-byte  GTOs
 
 

  01  LBL "FIL4" 
  02  DEG
  03  360
  04  *
  05  RCL 00
  06  STO 09
  07  /
  08  STO 08
  09  D-R
  10  X^2
  11  STO 07
  12  10.009
  13  ST+ 09
  14  CLA
  15  GTO 01
  16  LBL 00
  17  RCL 01
  18  RCL 05
  19  +
  20  7
  21  *
  22  RCL 02
  23  RCL 04
  24  +
  25  32
  26  *
  27  +
  28  RCL 03
  29  12
  30  *
  31  +
  32  45
  33  /
  34  ST+ M
  35  LBL 01
  36  RCL IND 09
  37  STO 05
  38  DSE 09
  39  FS? 30
  40  GTO 04 
  41  RCL IND 09
  42  STO 04
  43  DSE 09
  44  RCL IND 09
  45  STO 03
  46  DSE 09
  47  RCL IND 09
  48  STO 02
  49  DSE 09
  50  RCL IND 09
  51  STO 01
  52  RCL 08
  53  X=0?
  54  GTO 00
  55  XEQ 02
  56  RCL 09
  57  INT
  58  10
  59  -
  60  RCL 08
  61  *
  62  STO 06
  63  X<>Y
  64  P-R
  65  ST- M
  66  X<>Y
  67  ST- N
  68  RCL 01
  69  RCL 02
  70  RCL 04
  71  +
  72  4
  73  *
  74  -
  75  RCL 03       
  76  6
  77  *
  78  +
  79  RCL 05
  80  +
  81  RCL 07
  82  /
  83  STO O
  84  XEQ 03
  85  RCL 06
  86  X<>Y
  87  P-R
  88  ST+ N
  89  X<>Y
  90  ST- M
  91  RCL 01
  92  X<> 05
  93  STO 01
  94  RCL 02
  95  X<> 04
  96  STO 02
  97  RCL O
  98  XEQ 03
  99  RCL 08
100  4
101  *
102  RCL 06
103  +
104  STO 06
105  X<>Y
106  P-R
107  ST- N
108  X<>Y
109  ST+ M
110  XEQ 02       
111  RCL 06
112  X<>Y
113  P-R
114  ST- M
115  X<>Y
116  ST- N
117  GTO 01
118  LBL 02
119  RCL 01
120  5
121  *
122  RCL 02
123  18
124  *
125  -
126  RCL 03
127  24
128  *
129  +
130  RCL 04
131  14
132  *
133  -
134  RCL 05
135  3
136  *
137  +
138  RCL 07
139  ST+ X
140  /
141  RCL 01
142  25
143  *
144  RCL 02       
145  48
146  *
147  -
148  RCL 03
149  36
150  *
151  +
152  RCL 04
153  16
154  *
155  -
156  RCL 05
157  3
158  *
159  +
160  12
161  /
162  -
163  RCL 07
164  /
165  RTN
166  LBL 03
167  RCL 01
168  35
169  *
170  RCL 02
171  104
172  *
173  -
174  RCL 03
175  114
176  *
177  +
178  RCL 04        
179  56
180  *
181  -
182  RCL 05
183  11
184  *
185  +
186  12
187  /
188  -
189  RCL 07
190  /
191  RCL 01
192  +
193  RCL 08
194  D-R
195  /
196  RTN
197  LBL 04
198  RCL N
199  RCL M
200  RCL 00
201  2
202  /
203  ST/ Z
204  /
205  CLA
206  END

 
    ( 284 bytes / SIZE nn+11 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            bk
           X             k            ak

 
Example:          y(x) is periodic ( period = 12 )

 

   x   0+    1    2    3    4    5    6    7    8    9   10   11  12-
   y    1    2    4    7   10   12   12    8    6    7   10   14   20

 
  n = 12   STO 00   and store these 13 y-values into  R10  R11  ..................  R22

  0  XEQ "FIL4"  >>>>   a0 =   8.455556                                                                  --- execution time =  6s  ---
  1        R/S         >>>>    a1 = -1.049462   X<>Y   b1 =  -1.073589                         --- execution time = 37s ---
  2        R/S         >>>>    a2 =  1.838711   X<>Y   b2 =  -4.050732                                        idem
   .....................................................................................................

  6        R/S         >>>>    a6 =  0.157933   X<>Y   b6 =  -0.975730             Unlike "ASP" & "FIL",
  7        R/S         >>>>    a7 =  0.118962   X<>Y   b7 =  -0.861560             "FIL4"  may produce a better approximation than  bn/2 = 0
   ......................................................................................................
 

Notes:

-The integrals are computed over the intervals [0,4] , [4,8] , ...etc...
  so, this method works even if the derivatives have discontinuities for x = 0 , 4 , 8 , ...etc...
-However, the formulas involve numerical differentiation which may produce inaccurate results, especially if µ = 2(pi)k/n  is small.
-So, we can re-write these formulae in order to reduce roundoff errors, but we assume hereunder that the function y(x) is continuous for x = 0

-After some trigonometry, it yields:
 

     §0n y(x) cos µ.x dx = Sum i=0,4,8,.....,n-4  y(i) A0 cos µ.i + y(i+1) [ A1 cos (µ.i+µ) + B1 sin (µ.i+µ) ] + y(i+2) A2 cos (µ.i+2µ)
                                                                                        + y(i+3) [ A1 cos (µ.i+3µ) - B1 sin (µ.i+3µ) ]

     §0n y(x) sin µ.x dx = Sum i=0,4,8,.....,n-4  y(i) A0 sin µ.i + y(i+1) [ A1 sin (µ.i+µ) - B1 cos (µ.i+µ) ] + y(i+2) A2 sin (µ.i+2µ)
                                                                                     + y(i+3) [ A1 sin (µ.i+3µ) + B1 cos (µ.i+3µ) ]
   with

     A0 = (1/2µ2-3/µ4) cos 4µ + (25/6µ2-5/µ4) + (-11/6µ3+2/µ5) sin 4µ
     A1 = (-4/3µ2+7/µ4) cos 3µ + (-4/µ2+9/µ4) cos µ + (14/3µ3-4/µ5) sin 3µ + (26/3µ3-4/µ5) sin µ
     A2 = (6/µ2-24/µ4) cos 2µ + (-19/µ3+12/µ5) sin 2µ

   and     B1 = (4/3µ2-7/µ4) sin 3µ + (-4/µ2+9/µ4) sin µ + (14/3µ3-4/µ5) cos 3µ + (-26/3µ3+4/µ5) cos µ

-Thus, these coefficients may be computed in the beginning and the program will be faster for large n-values.
-However, the formulas again produce important roundoff-errors when µ is small - by cancellation of leading digits -
  but we can use Taylor series in this case, namely:

            A0 = 28/45 + 16µ2/63 - 128µ4/405 + 13568µ6/93555 - .............
            A1 = 64/45 - 32µ2/63 + 712µ4/2835 - 1124µ6/18711 + .............
            A2 =  8/15 + 16µ2/21 - 176µ4/945 + 544µ6/31185 - .............

            B1 = 64µ3/189 - 1888µ5/14175 + 2152µ7/93555 - .............

-In the following routine, the Taylor series are used for | µ | < 1/6  ( lines 30-31 ) and the terms of orders above µ5 are neglected
-If µ > 1/6 , the trigonometric expressions are employed.

-So, these coefficients are correct to 5D or 6D at least.
-Change the threshold and add more terms in the Taylor series if you need a better accuracy.
 
 

Data Registers:          •  R00 = n = mulptiple of 4              ( Registers R00 & R11 thru Rnn+10 are to be initialized before executing "FIL4+" )

                                     •   R11 = y(1)  ................  •   Rnn+10 = y(n) = y(0)         R01 to R09: temp      R10 is unused

                >>>> When the program stops,   R01 = ak ,  R02 = bk

Flags:  /
Subroutines:  /

-Lines 28-92 are three-byte  GTOs
 
 

  01  LBL "FIL4+"
  02  DEG
  03  360
  04  *
  05  RCL 00
  06  /
  07  STO 03
  08  D-R
  09  STO 04
  10  X^2
  11  STO 05
  12  14
  13  STO 06
  14  32
  15  STO 07
  16  12
  17  STO 08
  18  CLX
  19  STO 01
  20  STO 02
  21  STO 09
  22  45
  23  ST/ 06
  24  ST/ 07
  25  ST/ 08
  26  RCL 04
  27  X=0?
  28  GTO 01
  29  ABS
  30  6
  31  1/X
  32  X<Y?
  33  GTO 00
  34  RCL 05
  35  RCL 05
  36  128
  37  *
  38  CHS
  39  405
  40  /
  41  16
  42  63
  43  /
  44  STO 09
  45  +
  46  *
  47  RCL 06
  48  ST+ X
  49  +
  50  STO 06       
  51  CLX
  52  712
  53  *
  54  2835
  55  /
  56  RCL 09
  57  ST+ X
  58  -
  59  *
  60  RCL 07
  61  ST+ X
  62  +
  63  STO 07
  64  CLX
  65  176
  66  *
  67  CHS
  68  945
  69  /
  70  16
  71  21
  72  /
  73  +
  74  *
  75  RCL 08
  76  ST+ X
  77  +
  78  STO 08
  79  CLX
  80  1888
  81  *
  82  14175
  83  /
  84  64
  85  189
  86  /
  87  -
  88  *
  89  RCL 04
  90  *
  91  STO 09
  92  GTO 01
  93  LBL 00
  94  5
  95  RCL 05
  96  /
  97  CHS
  98  .24
  99  1/X
100  +
101  3
102  RCL 05       
103  /
104  .5
105  -
106  RCL 03
107  4
108  *
109  STO 09
110  COS
111  *
112  -
113  2
114  RCL 05
115  /
116  11
117  6
118  /
119  -
120  RCL 04
121  /
122  RCL 09
123  SIN
124  *
125  +
126  STO 06
127  RCL 03
128  3
129  *
130  STO 08
131  7
132  RCL 05
133  /
134  .75
135  1/X
136  -
137  P-R
138  STO 07
139  X<>Y
140  STO 09
141  RCL 08
142  4
143  RCL 05
144  /
145  14
146  3
147  /
148  -
149  RCL 04       
150  /
151  P-R
152  ST+ 09
153  X<>Y
154  ST- 07
155  RCL 03
156  9
157  RCL 05
158  /
159  4
160  -
161  P-R
162  ST+ 07
163  X<>Y
164  ST- 09
165  RCL 03
166  4
167  RCL 05
168  /
169  26
170  3
171  /
172  -
173  RCL 04
174  /
175  P-R
176  ST- 09
177  X<>Y
178  ST- 07
179  6
180  24
181  RCL 05
182  /
183  -
184  RCL 03
185  ST+ X
186  COS
187  *
188  12
189  RCL 05
190  /
191  19
192  -
193  RCL 04
194  /
195  RCL 03
196  ST+ X
197  SIN
198  *
199  +
200  RCL 05       
201  ST/ 06
202  ST/ 07
203  ST/ 09
204  /
205  STO 08
206  LBL 01
207  10
208  RCL 00
209  STO 04
210  +
211  STO 05
212  LBL 02
213  RCL 03
214  RCL 04
215  *
216  RCL IND 05
217  RCL 06
218  *
219  P-R
220  ST+ 01
221  X<>Y
222  ST+ 02
223  DSE 04
224  DSE 05
225  RCL 03
226  RCL 04
227  *
228  RCL IND 05
229  P-R
230  RCL X
231  RCL 07
232  *
233  ST+ 01
234  CLX
235  RCL 09
236  *
237  ST- 02
238  X<> L
239  *
240  ST+ 01
241  CLX
242  RCL 07
243  *
244  ST+ 02
245  DSE 04
246  DSE 05
247  RCL 03
248  RCL 04
249  *
250  RCL IND 05
251  RCL 08
252  *
253  P-R
254  ST+ 01
255  X<>Y
256  ST+ 02
257  DSE 04
258  DSE 05
259  RCL 03
260  RCL 04
261  *
262  RCL IND 05
263  P-R
264  RCL X
265  RCL 07
266  *
267  ST+ 01
268  CLX
269  RCL 09
270  *
271  ST+ 02
272  X<> L
273  *
274  ST- 01
275  CLX
276  RCL 07
277  *
278  ST+ 02
279  DSE 05
280  DSE 04
281  GTO 02
282  RCL 00
283  2
284  /
285  ST/ 01
286  ST/ 02
287  RCL 02
288  RCL 01
289  END

 
   ( 405 bytes / SIZE nnn+11 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            bk
           X             k            ak

 
Example1:         y(x) is periodic ( period = 12 )    y(0) = y(12) = 1
 
 

   x    1    2    3    4    5    6    7    8    9   10   11   12
   y    2    4    7   10   12   12    8    5    1   -2   -2    1

 
  n = 12   STO 00   and store these 12 y-values into   R11  ..................  R22

  0  XEQ "FIL4+"  >>>>    a0 =   4.770370                                                                  --- execution time = 12s  ---
  1        R/S            >>>>    a1 = -5.802627   X<>Y   b1 =  3.282884                          --- execution time = 23s ---
  2        R/S            >>>>    a2 =  1.060168   X<>Y   b2 =  0.111899                                        idem
   .....................................................................................................
 

Example2:      y(x)  periodic ( period = 48 )  and  y(x) = (x/10) Ln(49-x)  over  [0,48]

-To store y(n) in the proper registers, load for instance this short routine:

     LBL 01     RCL Y      *              /                           DSE X                         and key in    48  XEQ 01
     STO Y      -               10            STO IND Y         GTO 01
     49             LN           ST+ Z       R^

-Then  n = 48  STO 00

      0  XEQ "FIL4+"  >>>>    a0 =   6.083282                                                                  --- execution time = 45s  ---
      1        R/S            >>>>    a1 = -2.250492   X<>Y   b1 =  -2.782105                         --- execution time = 64s  ---  ( 147s with "FIL4" )
      2        R/S            >>>>    a2 = -0.940576   X<>Y   b2 =  -0.907591                                       ..........
        .....................................................................................................                                          ..........

-In this example, the coefficients for  a1 & b1  are computed via the Taylor series ( 2.PI/48 < 1/6 )
 whereas those for  a2 & b2  use the trigonometric expressions.
 

             d-2)  n = multiple of 6
 

-To compute the integrals of the form    § y(x) cos(µ.x) dx   or   § y(x) sin(µ.x) dx  , we now seek a formula that produces perfect accuracy
  when y(x) is a polynomial p(x) with deg p < 7

-More successive integrations by parts give:

                 §ab y(x) cos(µ.x) dx = B cos µ.b - A cos µ.a + D sin µ.b - C sin µ.a

                 §ab y(x) sin(µ.x) dx  = -D cos µ.b + C cos µ.a + B sin µ.b - A sin µ.a

                 A = y'(a)/µ2 - y'''(a)/µ4 + y'''''(a)/µ6 - ......              C = y(a)/µ - y''(a)/µ3 + y'''''(a)/µ5 - y''''''(a)/µ7  + ..........
 with
                 B = y'(b)/µ2 - y'''(b)/µ4 + y'''''(b)/µ6  - ......             D = y(b)/µ - y''(b)/µ3 + y'''''(b)/µ5 - y''''''(b)/µ4 + ..........
 

-And we can use numerical differentiation to evaluate  A , B , C , D , namely:

   y'(a) = [ -(49/20) y(a) + 6 y(a+h) - (15/2) y(a+2h) + (20/3) y(a+3h) - (15/4) y(a+4h) + (6/5) y(a+5h) - (1/6) y(a+6h) ] / h

   y''(a) = [ (203/45) y(a) - (87/5) y(a+h) + (117/4) y(a+2h) - (254/9) y(a+3h) + (33/2) y(a+4h) - (27/5) y(a+5h) + (137/180) y(a+6h) ] / h2

   y'''(a) = [ -(49/8) y(a) + 29 y(a+h) - (461/8) y(a+2h) +62 y(a+3h) - (307/8) y(a+4h) + 13 y(a+5h) - (15/8) y(a+6h) ] / h3

   y''''(a) = [ (35/6) y(a) - 31 y(a+h) + (137/2) y(a+2h) - (242/3) y(a+3h) + (107/2) y(a+4h) - 19 y(a+5h) + (17/6) y(a+6h) ] / h4

   y'''''(a) = [ -(7/2) y(a) + 20 y(a+h) - (95/2) y(a+2h) + 60 y(a+3h) - (85/2) y(a+4h) + 16 y(a+5h) - (5/2) y(a+6h) ] / h5

  y''''''(a) = [  y(a) - 6 y(a+h) + 15 y(a+2h) - 20 y(a+3h) + 15 y(a+4h) - 6 y(a+5h) + y(a+6h) ] / h6 = y''''''(b)
 

         and similar expressions for y'(b)  y''(b)  y'''(b)  y''''(b)  y'''''(b)
 

-Newton-Cote 7-point formula is used to compute the first coefficient a0 = the mean of y(x) over the interval [0,n]
-This integration formula also gives a perfect accuracy if deg p = 7
 
 

Data Registers:         •  R00 = n = mulptiple of 6              ( Registers R00 & R12 thru Rnn+12 are to be initialized before executing "FIL6" )

                                    •   R12 = y(0+)   •   R13 = y(1)  ................  •   Rnn+12 = y(n-)          R01 to R11: temp   R08 = 360 k/n
Flags:  /
Subroutines:  /

-Lines 46-138 are three-byte  GTOs
 
 

  01  LBL "FIL6"
  02  DEG
  03  360
  04  *
  05  RCL 00
  06  STO 11
  07  /
  08  STO 08
  09  D-R
  10  X^2
  11  STO 09
  12  12.011
  13  ST+ 11
  14  CLA
  15  GTO 01
  16  LBL 00
  17  RCL 01
  18  RCL 07
  19  +
  20  41
  21  *
  22  RCL 02
  23  RCL 06
  24  +
  25  216
  26  *
  27  +
  28  RCL 03
  29  RCL 05
  30  +
  31  27
  32  *
  33  +
  34  RCL 04
  35  272
  36  *
  37  +
  38  280
  39  /
  40  ST+ M
  41  LBL 01
  42  RCL IND 11
  43  STO 07
  44  DSE 11
  45  FS? 30
  46  GTO 04  
  47  RCL IND 11
  48  STO 06
  49  DSE 11
  50  RCL IND 11
  51  STO 05
  52  DSE 11
  53  RCL IND 11
  54  STO 04
  55  DSE 11
  56  RCL IND 11
  57  STO 03
  58  DSE 11
  59  RCL IND 11
  60  STO 02
  61  DSE 11
  62  RCL IND 11
  63  STO 01
  64  RCL 08
  65  X=0?
  66  GTO 00
  67  XEQ 02
  68  RCL 11
  69  INT
  70  12
  71  -
  72  RCL 08
  73  *
  74  STO 10
  75  X<>Y
  76  P-R
  77  ST- M
  78  X<>Y
  79  ST- N
  80  RCL 02
  81  RCL 06
  82  +
  83  6
  84  *
  85  RCL 01
  86  -
  87  RCL 03
  88  RCL 05
  89  +
  90  15
  91  *
  92  -
  93  RCL 04
  94  20
  95  *
  96  +
  97  RCL 07
  98  -
  99  RCL 09
100  /
101  STO O
102  XEQ 03
103  RCL 10
104  X<>Y
105  P-R
106  ST+ N
107  X<>Y
108  ST- M
109  RCL 01
110  X<> 07
111  STO 01
112  RCL 02
113  X<> 06
114  STO 02
115  RCL 03
116  X<> 05
117  STO 03
118  RCL O
119  XEQ 03
120  RCL 08
121  6
122  *
123  RCL 10
124  +
125  STO 10
126  X<>Y
127  P-R
128  ST- N
129  X<>Y
130  ST+ M
131  XEQ 02
132  RCL 10
133  X<>Y
134  P-R
135  ST- M
136  X<>Y
137  ST- N
138  GTO 01
139  LBL 02
140  RCL 02
141  40
142  *
143  RCL 01
144  7
145  *
146  -
147  RCL 03
148  95
149  *
150  -
151  RCL 04
152  120
153  *
154  +
155  RCL 05
156  85
157  *
158  -
159  RCL 06       
160  32
161  *
162  +
163  RCL 07
164  5
165  *
166  -
167  RCL 09
168  ST+ X
169  /
170  RCL 01
171  49
172  *
173  RCL 02
174  232
175  *
176  -
177  RCL 03
178  461
179  *
180  +
181  RCL 04
182  496
183  *
184  -
185  RCL 05
186  307
187  *
188  +
189  RCL 06
190  104
191  *
192  -
193  RCL 07
194  15
195  *
196  +
197  8
198  /
199  +
200  RCL 09
201  /
202  RCL 02
203  360
204  *
205  RCL 01
206  147
207  *
208  -
209  RCL 03       
210  450
211  *
212  -
213  RCL 04
214  400
215  *
216  +
217  RCL 05
218  225
219  *
220  -
221  RCL 06
222  72
223  *
224  +
225  RCL 07
226  10
227  *
228  -
229  60
230  /
231  +
232  RCL 09
233  /
234  RTN
235  LBL 03
236  RCL 01
237  35
238  *
239  RCL 02
240  186
241  *
242  -
243  RCL 03
244  411
245  *
246  +
247  RCL 04
248  484
249  *
250  -
251  RCL 05
252  321
253  *
254  +
255  RCL 06
256  114
257  *
258  -
259  RCL 07       
260  17
261  *
262  +
263  6
264  /
265  +
266  RCL 09
267  /
268  RCL 01
269  812
270  *
271  RCL 02
272  3132
273  *
274  -
275  RCL 03
276  5265
277  *
278  +
279  RCL 04
280  5080
281  *
282  -
283  RCL 05
284  2970
285  *
286  +
287  RCL 06
288  972
289  *
290  -
291  RCL 07
292  137
293  *
294  +
295  PI
296  R-D
297  /
298  -
299  RCL 09       
300  /
301  RCL 01
302  +
303  RCL 08
304  D-R
305  /
306  RTN
307  LBL 04
308  RCL N
309  RCL M
310  RCL 00
311  2
312  /
313  ST/ Z
314  /
315  CLA
316  END

 
   ( 451 bytes / SIZE nnn+13 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            bk
           X             k            ak

 
Example:             y(x) is periodic ( period = 12 )

 

   x   0+    1    2    3    4    5    6    7    8    9   10   11  12-
   y    1    2    4    7   10   12   12    8    6    7   10   14   20

 
  n = 12   STO 00   and store these 13 y-values into  R12  R13  ..................  R24

  0  XEQ "FIL6"  >>>>   a0 =   8.475595                                                                  --- execution time =  6s  ---
  1        R/S         >>>>    a1 = -1.059182   X<>Y   b1 =  -1.090833                         --- execution time = 46s ---
  2        R/S         >>>>    a2 =  1.776544   X<>Y   b2 =  -4.029470                                        ........
   .....................................................................................................

  6        R/S        >>>>    a6 =  0.171103   X<>Y   b6 =  -0.979868
  7        R/S         >>>>    a7 =  0.048603   X<>Y   b7 =  -0.834744
   ......................................................................................................
 

Notes:

-The results are accurate when the y-values are small integers, but otherwise, unfortunately, roundoff-errors may be huge if µ = 2.k.PI/n is small.
  and one can find examples where the 3rd decimal is already wrong!
-So, another approach is usually preferable:

-We assume hereunder that y(x) is also continuous for x = 0 , then the formulae may be re-written:
 

 §0n y(x) cos µ.x dx = Sum i=0,6,12,.....,n-6          y(i) A0 cos µ.i       + y(i+1) [ A1 cos (µ.i+µ) + B1 sin (µ.i+µ) ]    + y(i+2) [ A2 cos (µ.i+2µ) + B2 sin (µ.i+2µ) ]

                                                             + y(i+3) A3 cos (µ.i+3µ) + y(i+4) [ A2 cos (µ.i+4µ) - B2 sin (µ.i+4µ) ] + y(i+5) [ A1 cos (µ.i+5µ) - B1 sin (µ.i+5µ) ]

 §0n y(x) sin µ.x dx = Sum i=0,6,12,.....,n-6          y(i) A0 sin µ.i       + y(i+1) [ A1 sin (µ.i+µ) - B1 cos (µ.i+µ) ]      + y(i+2) [ A2 sin (µ.i+2µ) - B2 cos (µ.i+2µ) ]

                                                            + y(i+3) A3 sin (µ.i+3µ) + y(i+4) [ A2 sin (µ.i+4µ) + B2 cos (µ.i+4µ) ] + y(i+5) [ A1 sin (µ.i+5µ) + B1 cos (µ.i+5µ) ]
 with

      A0 = (1/3µ2-15/4µ4+5/µ6) cos 6µ + (49/10µ2-49/4µ4+7/µ6) + (-137/90µ3+17/3µ5-2/µ7) sin 6µ
      A1 = (-6/5µ2+13/µ4-16/µ6) cos 5µ - (6/µ2-29/µ4+20/µ6) cos µ + (27/5µ3-19/µ5+6/µ7) sin 5µ + (87/5µ3-31/µ5+6/µ7) sin µ
      A2 = (15/4µ2-307/8µ4+85/2µ6) cos 4µ - (-15/2µ2+461/8µ4-95/2µ6) cos 2µ + (-33/2µ3+107/2µ5-15/µ7) sin 4µ + (-117/4µ3+137/2µ5-15/µ7) sin 2µ
      A3 =  2(-20/3µ2+62/µ4-60/µ6) cos 3µ + 2(254/9µ3-242/3µ5+20/µ7) sin 3µ

   and

      B1 = -(-6/5µ2+13/µ4-16/µ6) sin 5µ - (6/µ2-29/µ4+20/µ6) sin µ + (27/5µ3-19/µ5+6/µ7) cos 5µ - (87/5µ3-31/µ5+6/µ7) cos µ
      B2 = -(15/4µ2-307/8µ4+85/2µ6) sin 4µ - (-15/2µ2+461/8µ4-95/2µ6) sin 2µ + (-33/2µ3+107/2µ5-15/µ7) cos 4µ - (-117/4µ3+137/2µ5-15/µ7) cos 2µ
 

-When µ is small, we must use Taylor series to reduce roundoff-errors, namely:
 

            A0 = 41/70 + 9µ2/25 - 567µ4/550 + 28053µ6/25025 - 16281µ8/25025 + 498636µ10/2127125 - 0.057560072125µ12 + 0.010259175386µ14 - .............

            A1 = 54/35 - 27µ2/25 + 1917µ4/1100 - 256947µ6/200200 + 809283µ8/1601600 - 33654633µ10/272272000 + 0.020638591235µ12
                    - 0.0025064271605µ14 +  .............

            A2 =  27/140 + 27µ2/10 - 513µ4/220 + 9903µ6/10010 - 11859µ8/50050 + 76134µ10/2127125 - 0.0037150884891µ12
                    + 0.000281765004581µ14 - .............

            A3 = 68/35 - 18µ2/5 + 243µ4/110 - 2133µ6/4004 + 55161µ8/800800 - 763263µ10/136136000 + 0.000315589112894µ12
                    - 0.0000130645273645µ14 +  .............

            B1 = 36µ3/25 - 18µ5/11 + 1508589µ7/1751750 - 5137µ9/19500 + 0.052739990401µ11 - 0.0074605626534µ13 +  .............

            B2 = -9µ3/5 + 414µ5/275 - 88758µ7/175175 + 290µ9/3003 - 0.0120217037863µ11 + 0.00106051813438µ13 +  .............
 

-The coefficients in decimal form are only approximate values: the last decimals are not guaranteed...

-Taylor's series are used if µ < 0.43 ( line 33 ) so that Ai and Bj have at least 5 or 6 exact decimals.
-Choose another threshold and add more terms in the Taylor series if you need a better accuracy.
 
 

Data Registers:          •  R00 = n = mulptiple of 6              ( Registers R00 & R11 thru Rnn are to be initialized before executing "FIL6+" )

                                     •   R11 = y(1)  ................  •   Rnn+10 = y(n) = y(0)         R01 to R09: temp      R10 is unused

Flags:  /
Subroutines:  /

-Lines 31-35-157-500 are three-byte  GTOs
 
 

  01  LBL "FIL6+"
  02  DEG
  03  CLA
  04  360
  05  *
  06  RCL 00
  07  /
  08  STO 07
  09  D-R
  10  STO 08
  11  X^2
  12  STO 09
  13  82
  14  STO 01
  15  216
  16  STO 02
  17  27
  18  STO 03
  19  272
  20  STO 04
  21  CLX
  22  STO 05
  23  STO 06
  24  280
  25  ST/ 01
  26  ST/ 02
  27  ST/ 03
  28  ST/ 04
  29  RCL 08
  30  X=0?
  31  GTO 01 
  32  ABS
  33  .43
  34  X<Y?
  35  GTO 00 
  36  RCL 09
  37  RCL 09
  38  RCL 09
  39  17
  40  /
  41  CHS
  42  .2344
  43  +
  44  *
  45  .6506
  46  -
  47  *
  48  1.121
  49  +
  50  *
  51  567
  52  550
  53  /
  54  -
  55  *
  56  .36
  57  +
  58  *
  59  RCL 01
  60  +
  61  ST+ 01
  62  CLX
  63  .1236
  64  *
  65  CHS
  66  .5053
  67  +
  68  *
  69  1.28345
  70  -
  71  *
  72  19.17
  73  11
  74  /
  75  +
  76  *
  77  1.08
  78  -
  79  *
  80  RCL 02
  81  +
  82  ST+ 02
  83  CLX
  84  27.94
  85  /
  86  .2369
  87  -
  88  *
  89  .9893
  90  +
  91  *
  92  513
  93  220
  94  /
  95  -
  96  *
  97  2.7
  98  +
  99  *
100  RCL 03
101  +
102  ST+ 03
103  CLX
104  14.52
105  /
106  .5327
107  -
108  *
109  243
110  110
111  /
112  +
113  *
114  3.6
115  -
116  *
117  RCL 04
118  +
119  ST+ 04
120  CLX
121  19
122  /
123  .2634
124  -
125  *
126  .8612
127  +
128  *
129  18
130  11
131  /
132  -
133  *
134  1.44
135  +
136  *
137  RCL 08
138  *
139  STO 05
140  CLX
141  10.36
142  /
143  .5067
144  -
145  *
146  414
147  275
148  /
149  +
150  *
151  1.8
152  -
153  *
154  RCL 08
155  *
156  STO 06
157  GTO 01
158  LBL 00
159  RCL 09
160  1/X
161  1.75
162  -
163  RCL 09
164  /
165  .7
166  +
167  7
168  *
169  5
170  RCL 09       
171  /
172  3.75
173  -
174  RCL 09
175  /
176  3
177  1/X
178  +
179  RCL 07
180  6
181  *
182  STO 01
183  COS
184  *
185  +
186  2
187  RCL 09
188  /
189  17
190  3
191  /
192  -
193  RCL 09
194  /
195  137
196  90
197  /
198  +
199  RCL 08
200  /
201  RCL 01
202  SIN
203  *
204  -
205  STO 01
206  RCL 07
207  5
208  *
209  STO 06
210  16
211  RCL 09
212  /
213  13
214  -
215  RCL 09
216  /
217  1.2
218  +
219  P-R
220  CHS
221  STO 02
222  X<>Y
223  STO 05
224  RCL 07
225  20
226  RCL 09
227  /
228  29
229  -
230  RCL 09
231  /
232  6
233  +
234  P-R
235  ST- 02
236  X<>Y
237  ST- 05
238  RCL 06
239  6
240  RCL 09
241  /
242  19
243  -
244  RCL 09
245  /
246  5.4
247  +
248  RCL 08
249  /
250  P-R
251  ST+ 05
252  X<>Y
253  ST+ 02
254  RCL 07       
255  6
256  RCL 09
257  /
258  31
259  -
260  RCL 09
261  /
262  17.4
263  +
264  RCL 08
265  /
266  P-R
267  ST- 05
268  X<>Y
269  ST+ 02
270  RCL 07
271  4
272  *
273  STO 04
274  42.5
275  RCL 09
276  /
277  38.375
278  -
279  RCL 09
280  /
281  3.75
282  +
283  P-R
284  STO 03
285  X<>Y
286  CHS
287  STO 06
288  RCL 04
289  15
290  RCL 09
291  /
292  53.5
293  -
294  RCL 09
295  /
296  16.5
297  +
298  RCL 08
299  /
300  P-R
301  ST- 06
302  X<>Y
303  ST- 03
304  RCL 07
305  ST+ X
306  STO 04
307  47.5
308  RCL 09
309  /
310  57.625
311  -
312  RCL 09
313  /
314  7.5
315  +
316  P-R
317  ST+ 03
318  X<>Y
319  ST+ 06
320  RCL 04
321  15
322  RCL 09
323  /
324  68.5
325  -
326  RCL 09
327  /
328  29.25
329  +
330  RCL 08
331  /
332  P-R
333  ST+ 06
334  X<>Y
335  ST- 03
336  20
337  RCL 09       
338  /
339  242
340  3
341  /
342  -
343  RCL 09
344  /
345  254
346  9
347  /
348  +
349  RCL 08
350  /
351  RCL 07
352  3
353  *
354  STO 04
355  SIN
356  *
357  60
358  RCL 09
359  /
360  62
361  -
362  RCL 09
363  /
364  20
365  3
366  /
367  +
368  RCL 04
369  COS
370  *
371  -
372  ST+ X
373  RCL 09
374  ST/ 01
375  ST/ 02
376  ST/ 03
377  ST/ 05
378  ST/ 06
379  /
380  STO 04
381  LBL 01
382  10
383  RCL 00
384  STO 08
385  +
386  STO 09
387  LBL 02
388  RCL 07
389  RCL 08
390  *
391  RCL IND 09
392  RCL 01
393  *
394  P-R
395  ST+ M
396  X<>Y
397  ST+ N
398  DSE 08
399  DSE 09
400  RCL 07
401  RCL 08
402  *
403  RCL IND 09
404  P-R
405  RCL X
406  RCL 02
407  *
408  ST+ M
409  CLX
410  RCL 05
411  *
412  ST+ N
413  X<> L
414  *
415  ST- M
416  CLX
417  RCL 02
418  *
419  ST+ N
420  DSE 08
421  DSE 09
422  RCL 07
423  RCL 08
424  *
425  RCL IND 09
426  P-R
427  RCL X
428  RCL 03
429  *
430  ST+ M
431  CLX
432  RCL 06
433  *
434  ST+ N
435  X<> L
436  *
437  ST- M
438  CLX
439  RCL 03
440  *
441  ST+ N
442  DSE 08
443  DSE 09
444  RCL 07
445  RCL 08
446  *
447  RCL IND 09
448  RCL 04
449  *
450  P-R
451  ST+ M
452  X<>Y
453  ST+ N
454  DSE 08
455  DSE 09
456  RCL 07
457  RCL 08
458  *
459  RCL IND 09
460  P-R
461  RCL X
462  RCL 03
463  *
464  ST+ M
465  CLX
466  RCL 06
467  *
468  ST- N
469  X<> L
470  *
471  ST+ M
472  CLX
473  RCL 03
474  *
475  ST+ N
476  DSE 08
477  DSE 09
478  RCL 07
479  RCL 08
480  *
481  RCL IND 09
482  P-R
483  RCL X
484  RCL 02
485  *
486  ST+ M
487  CLX
488  RCL 05
489  *
490  ST- N
491  X<> L
492  *
493  ST+ M
494  CLX
495  RCL 02
496  *
497  ST+ N
498  DSE 09
499  DSE 08
500  GTO 02
501  RCL N
502  RCL M
503  RCL 00
504  2
505  /
506  ST/ Z
507  /
508  CLA
509  END

 
    ( 796 bytes / SIZE nnn+11 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            bk
           X             k            ak

 
Example:      y(x)  periodic ( period = 48 )  and  y(x) = (x/10) Ln(49-x)  over  [0,48]

-To store y(n) in the proper registers, load the same routine:

     LBL 01     RCL Y      *              /                           DSE X                         and key in    48  XEQ 01
     STO Y      -               10            STO IND Y         GTO 01
     49             LN           ST+ Z       R^

-Then  n = 48  STO 00

      0  XEQ "FIL6+"  >>>>    a0 =   6.083399                                                                  --- execution time = 48s  ---
      1        R/S            >>>>    a1 = -2.250254   X<>Y   b1 =  -2.782055                         --- execution time = 71s  ---
      2        R/S            >>>>    a2 = -0.940317   X<>Y   b2 =  -0.907481                                       ..........
        .....................................................................................................                                          ..........

      7         R/S           >>>>    a7 = -0.158130   X<>Y   b7 =  -0.086882                                       ..........

Notes:

-If we use "FIL6" instead of "FIL6+", a0 is correctly computed but "FIL6" gives  a1 = -2.243751  &  b1 = -2.784534 ,  a2 = -0.940469  &  b2 =  -0.907335
-However, a7 & b7 are accurately calculated ... but in 3mn07s.
-If you don't want to use synthetic registers, replace registers M & N by R10 & R11
 delete line 508, replace line 382 by 11 ( instead of 10 ), add  STO 10   STO 11  after line 23, and delete line 03.
-And store  y(1) , ..... , y(n)  into  R12 , ........... , Rnn+11

A few Comparisons:
 
 

      ASP       FIL      FIL4+      FIL6+   exact(6D)
        a0   6.074830   6.083005   6.083282   6.083399   6.083605
        a1  -2.267371  -2.251065  -2.250492  -2.250254  -2.249808
        b1  -2.781891  -2.782237  -2.782105  -2.782055  -2.781991
        a2  -0.957391  -0.941185  -0.940576  -0.940317  -0.939786
        b2  -0.907200  -0.907842  -0.907590  -0.907481  -0.907391
        a7  -0.175917  -0.160233  -0.158926  -0.158130  -0.157669
        b7  -0.086422  -0.087694  -0.086800  -0.086882  -0.087134

 

2°) One-dimensional Problems - Complex Arguments
 

         a) The Discrete Fourier Transform
 

-Given an array of n complex numbers  [ a1 , .......... , an ]  where  ak = bk + i ck ,
 "DFTZ" computes the complex components zk = xk + i yk  of the Discrete Fourier Transform   [ z1 , .......... , zn ]
 

Data Registers:         •  R00 = n                                            ( Registers R00 thru R2n are to be initialized before executing "DFTZ" )

                                    •   R01 = b1   •   R03 = b2  ................  •   R2n-1 = bn
                                    •   R02 = c1   •   R04 = c2  ................   •   R2n = cn
Flags: /
Subroutines:  /
 
 

01  LBL "DFTZ" 
02  DEG
03  CLA
04  STO O
05  PI
06  R-D
07  ST* Y
08  -
09  RCL 00       
10  STO M
11  ST+ M
12  /
13  STO N
14  CLX
15  LBL 01
16  RCL M
17  RCL N
18  ST* Y
19  ST+ X
20  -
21  RCL IND M
22  DSE M
23  RCL IND M
24  R-P
25  RDN
26  -
27  R^
28  P-R
29  ST+ P
30  RDN
31  -
32  DSE M       
33  GTO 01
34  RCL O        
35  SIGN
36  X<> P
37  CLA
38  END

 
   ( 64 bytes / SIZE 2n+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            yk
           X             k            xk
           L             /            k

 
Example:    Calculate  DFT  [ 1+2i  3+4i  5+6i  7+8i ]

    n = 4  STO 00

       1  STO 01    3  STO 03    5  STO 05    7  STO 07
       2  STO 02    4  STO 04    6  STO 06    8  STO 08

      1  XEQ "DFTZ"  >>>>   x1 = 16   X<>Y   y1 =  20
      2       R/S            >>>>   x2 = -8    X<>Y   y2 =   0
      3       R/S            >>>>   x3 = -4    X<>Y   y3 =  -4
      4       R/S            >>>>   x4 =  0    X<>Y   y4 =  -8

-So,   DFT [ 1+2i  3+4i  5+6i  7+8i ]  =  [ 16+20.i  -8  -4-4.i   -8.i ]

-The discrete inverse Fourier transform may be obtained by the following routine:
 
 

01  LBL "IDFTZ"
02  DEG
03  CLA
04  STO O
05  PI
06  R-D
07  ST* Y
08  -
09  RCL 00        
10  STO M
11  ST+ M
12  /
13  STO N
14  CLX
15  LBL 01
16  RCL M        
17  RCL N
18  ST* Y
19  ST+ X
20  -
21  RCL IND M
22  DSE M
23  RCL IND M
24  R-P
25  RDN
26  +
27  R^
28  P-R
29  ST+ P
30  RDN
31  +
32  DSE M        
33  GTO 01
34  RCL 00
35  ST/ P
36  /
37  RCL O        
38  SIGN
39  X<> P
40  CLA
41  END

 
   ( 69 bytes / SIZE 2n+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /            yk
           X             k            xk
           L             /            k

 
Example:   Calculate  IDFT [ 16+20.i  -8  -4-4.i   -8.i ]

    n = 4  STO 00

    16  STO 01    -8  STO 03    -4  STO 05     0  STO 07
    20  STO 02     0  STO 04    -4  STO 06    -8  STO 08

      1  XEQ "IDFTZ"   >>>>   x1 = 1   X<>Y   y1 =  2
      2       R/S              >>>>   x2 = 3    X<>Y   y2 =  4
      3       R/S              >>>>   x3 = 5    X<>Y   y3 =  6
      4       R/S              >>>>   x4 = 7    X<>Y   y4 =  8

-So,   IDFT  [ 16+20.i  -8  -4-4.i   -8.i ] = [ 1+2i  3+4i  5+6i  7+8i ]    which is quite logical!
 

         b) The Fast Fourier Transform  ( X-Functions Module required )
 

-"FFT" computes the Discrete Fourier Transform   [ z1 , .......... , zn ]       zk = xk + i yk
            of  an array of n complex numbers  [ a1 , .......... , an ]      ak = bk + i ck

>>>   n must be an integer power of 2 , n > 1
 

Data Registers:         •  R00 = n = 2j > 1                              ( Registers R00 thru R2n are to be initialized before executing "FFT" )

      Inputs:                  •   R01 = b1   •   R03 = b2  ................  •   R2n-1 = bn
                                    •   R02 = c1   •   R04 = c2  ................   •   R2n = cn                   R2n+1 to R4n:   temp

      Outputs:               •   R01 = x1   •   R03 = x2  ................   •   R2n-1 = xn
                                    •   R02 = y1   •   R04 = y2  ................   •   R2n = yn
Flags: /
Subroutines:  /
 
 

  01  LBL "FFT" 
  02  DEG
  03  RCL 00
  04  STO M
  05  1
  06  +
  07  LOG
  08  2
  09  LOG
  10  /
  11  INT
  12  STO N
  13  LBL 01
  14  RCL N
  15  STO O
  16  0
  17  RCL M
  18  DSE X
  19  LBL 02
  20  RCL X
  21  2
  22  ST* T
  23  MOD
  24  ST+ Z
  25  X<> L
  26  /
  27  INT
  28  DSE O
  29  GTO 02
  30  SIGN
  31  +
  32  RCL 00
  33  +
  34  ST+ X
  35  RCL M
  36  ST+ X
  37  RCL IND X
  38  STO IND Z
  39  CLX
  40  SIGN
  41  ST- Z
  42  -
  43  RCL IND X
  44  STO IND Z
  45  DSE M
  46  GTO 01
  47  360
  48  STO O
  49  SIGN
  50  STO M
  51  GTO 04
  52  LBL 03
  53  RCL 00
  54  ST+ X
  55  .1
  56  STO Z
  57  %
  58  ISG X
  59  +
  60  %
  61  1
  62  +
  63  REGMOVE
  64  LBL 04
  65  2
  66  ST/ O
  67  RCL 00
  68  STO P
  69  LBL 05
  70  RCL P
  71  RCL X
  72  RCL O
  73  STO Q
  74  SIGN
  75  -
  76  ENTER^
  77  ST* Q
  78  RCL M
  79  ST+ X
  80  MOD
  81  ST- Z
  82  CLX
  83  RCL M
  84  MOD
  85  +
  86  RCL 00
  87  +
  88  ST+ X
  89  RCL X
  90  RCL M
  91  ST+ X
  92  ST+ Z
  93  X<> Q
  94  RCL IND Z
  95  DSE T
  96  RCL IND T
  97  R-P
  98  X<> Z
  99  -
100  X<>Y
101  P-R
102  DSE T
103  RCL IND T
104  +
105  X<>Y
106  RCL IND Z
107  +
108  RCL P
109  ST+ X
110  RDN
111  STO IND T
112  DSE T
113  X<>Y
114  STO IND T
115  DSE P
116  GTO 05
117  RCL M
118  ST+ M
119  DSE N
120  GTO 03
121  CLA
122  END

 
   ( 197 bytes / SIZE 4n+1 )
 
 

      STACK        INPUT      OUTPUT
           X            /             /

 
Example:    Calculate  DFT [ 1+2i  3+4i  5+6i  7+8i ]

  n = 4  STO 00

     1  STO 01    3  STO 03    5  STO 05    7  STO 07
     2  STO 02    4  STO 04    6  STO 06    8  STO 08

  XEQ "FFT"   and 27 seconds later, we have in registers R01 thru R08

    16   20    -8   0    -4   -4    0   -8       thus,   DFT [ 1+2i  3+4i  5+6i  7+8i ]  =  [ 16+20.i  -8  -4-4.i   -8.i ]

-In fact, I've rounded these values, for example  R04 = 0.000000006 instead of exactly 0. Roundoff errors are unavoidable...

Execution time:

 

      n       2       4       8      16      32      64
      t      8s     28s   1m14s  3m11s  7m57s  18m54s

 
-It's of course not so fast as the built-in  FFT on the HP-48, but it's faster than  n x "DFTZ"
- t is approximately proportional to  n Log n
 

Notes:

-This program doesn't work if n = 1, but in this case,  DFT [z] = [z]
-n must be an integer power of 2.
-Since there are at most 319 registers, nmax = 64

-If you want to calculate the inverse Fourier transform IFFT,

   replace line 99 by  +  ( instead of - )   and divide the registers R01 thru R2n by n:  for instance,  add

   RCL 00  ENTER^  ST+ Y  LBL 06  ST/ IND Y  DSE Y  GTO 06   after line 120
 

3°) Two-dimensional Problems - Real Arguments
 

         a) The Discrete Fourier Transform ( Program#1 )
 

-The DFT may be generalized to  nxm matrices  [ ai,j ]  ( 1 <= i <= n , 1 <= j <= m ). The result is a complex  nxm matrix  [ zi,j ]

  where  zi,j =  SUMq=1,2,...,n  ; r=1,2,....,m   aq,r  exp { -2i(pi).[ (q-1)(i-1)/n+(r-1)(j-1)/m ] }
 

Data Registers:     •  R00 = n.mmm  =  n + m/1000                  ( Registers R00 thru Rnm are to be initialized before executing "DFT2" )

                                •  R01 = a1,1      •  Rn+1 = a1,2   .......................................   •  Rnm-n+1 = a1,m
                                •  R02 = a2,1      •  Rn+2 = a2,2   .......................................   •  Rnm-n+2 = a2,m
                                       ..........................................................................................................
                                •  Rnn = an,1      •  R2n  =  an,2   ........................................   •  Rnm = an,m
Flags: /
Subroutines: /
 
 

01  LBL "DFT2"
02  DEG
03  360
04  ST* Y
05  ST* Z
06  ST- Z
07  -
08  RCL 00
09  INT
10  STO M
11  /
12  STO N       
13  CLX
14  RCL 00
15  FRC
16   E3
17  *
18  ST* M
19  /
20  STO O
21  CLX
22  STO P
23  LBL 01       
24  RCL N
25  RCL M
26  ENTER^
27  SIGN
28  -
29  ST* Y
30  RCL 00
31  INT
32  /
33  INT
34  RCL O
35  *
36  +
37  RCL IND M
38  P-R
39  ST+ P
40  RDN
41  -
42  DSE M
43  GTO 01       
44  RCL P
45  CLA
46  END
 

 
   ( 75 bytes / SIZE n.m+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             j            yi,j
           X            i            xi,j

  with   zi,j = xi,j + i yi,j

 Example:

            [ [  1  3  4  10  ]
     A =   [  4  5  7  14  ]
              [  2  9  6  11  ] ]

-Calculate   z2,3

 We have 3 rows and 4 columns , therefore  3.004  STO 00  and we store the 12 elements in registers  R01 thru R12  in column order:

  1  STO 01    4  STO 02   2  STO 03  ..........   14  STO 11   11 STO 12

-Then

   3  ENTER^
   2  XEQ "DFT2"  >>>>      2                                                                                       ( in 14 seconds )
                             X<>Y    -3.464101617       So  z2,3 =  2 - 3.464101617 i
-Likewise,

                         [ [         76                -10+18 i                       -28                     -10-18 i         ]
     DFT (A) =     [   -11-1.7321 i     6.5622+0.6340 i        2-3.4641 i       -5.5622-2.3660 i   ]        ( rounded to 4 decimals )
                           [  -11+1.7321 i    -5.5622+2.3660 i       2+3.4641 i       6.5622-0.6340 i   ] ]

Note:

-To compute the Inverse Fourier Transform:

   add   RCL a    ST/ Z   /     after line 44
   replace line 41 by +
   add   RCL M   STO a      after line 20     ( 51 lines / 85 bytes )

-However, since status register a is used, this routine cannot be called as more than a first-level subroutine.
-If you want to avoid register a, use the following variant:
 
 

01  LBL "IDFT2"
02  DEG
03  360
04  ST* Y
05  ST* Z
06  ST- Z
07  -
08  RCL 00
09  INT
10  STO M
11  /
12  STO N
13  CLX
14  RCL 00       
15  FRC
16   E3
17  *
18  ST* M
19  /
20  STO O
21  RCL M
22  STO P
23  CLST
24  LBL 01
25  RCL M
26  ENTER^
27  SIGN
28  -
29  STO Q       
30  RCL N
31  *
32  X<> Q
33  RCL 00
34  INT
35  /
36  INT
37  RCL O
38  *
39  RCL Q
40  +
41  RCL IND M
42  P-R
43  ST+ T
44  RDN
45  +
46  DSE M
47  GTO 01       
48  X<>Y
49  RCL P
50  ST/ Z
51  /
52  CLA
53  END

 
   ( 87 bytes / SIZE n.m+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             j            yi,j
           X             i            xi,j

  with   zi,j = xi,j + i yi,j

-The instructions are identical.
 

         b) The Discrete Fourier Transform ( Program#2 )
 

-We assume  z(x,y)  is a doubly periodic function:

     z(x+n;y) = z(x;y)   for all  x;y
     z(x;y+m) = z(x;y)  for all  x;y           n and m  being integers.

-We have   z(x;y) = SUMi;j  [ ai;j cos ( 360 ( ix/n+jy/m ) )  + bi;j sin ( 360 ( ix/n+jy/m ) )  ]

    ( 0 <= i <= n/2 ; 0 <= j <= m/2 and  0 < i < n/2  ;  -m/2 < j < 0 )
 

Data Registers:          •  R00 = n.mmm  =  n + m/1000                ( Registers  R00 thru Rnm   are to be initialized before executing "SPA2" )

              •  R01 = z(1;1)     •  Rn+1 = z(1;2)    ..................................................     •  Rnm-n+1 = z(1;m)
              •  R02 = z(2;1)     •  Rn+2 = z(2;2)    ..................................................     •  Rnm-n+2 = z(2;m)

                ...............................................................................................................................................

              •  Rnn = z(n;1)      •  R2n  = z(n;2)     ..................................................     •     Rnm      = z(n;m)

Flag:  F10
Subroutines:  /

-Synthetic registers M N O P a   are used by this program and may be replaced by any unused data registers.
-Since synthetic register a   is used, "SPA2" must not be called as more than a first level subroutine.
 
 

01  LBL "SPA2"
02  DEG
03  SF 10
04  PI
05  R-D
06  STO N
07  STO O
08  CLX
09  2
10  ST* Z
11  *
12  ST* N
13  RCL 00
14  INT
15  ST/ N
16  MOD
17  X<>Y
18  ST* O
19  RCL 00       
20  FRC
21   E3
22  *
23  ST/ O
24  MOD
25  LASTX
26  RCL 00
27  INT
28  *
29  STO M
30  STO a
31  RDN
32  +
33  X=0?
34  CF 10
35  CLX
36  STO P 
37  LBL 01
38  RCL N       
39  RCL M
40  ST* Y
41  ENTER^
42  SIGN
43  -
44  RCL 00
45  INT
46  /
47  INT
48  RCL O
49  ST* Y
50  +
51  +
52  RCL IND M
53  P-R
54  ST+ P
55  RDN
56  +
57  DSE M
58  GTO 01
59  RCL P       
60  R-P
61  RCL a
62  /
63  FS?C 10
64  ST+ X
65  P-R
66  CLA
67  END

 
   ( 102 bytes / SIZE n.m+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             j           bi,j
           X             i           ai,j

      ( 0 <= i <= n/2 ;  0 <= j <= m/2
          0 < i < n/2    ;   -m/2 < j < 0 )

Example:        z(x;y)  is doubly periodic  with    n = 3   ;   m = 4    and takes the following values:

    z(1;1) = 1   z(1;2) = 3  z(1;3) = 7  z(1;4) = 10
    z(2;1) = 4   z(2;2) = 5  z(2;3) = 8  z(2;4) = 14
    z(3;1) = 2   z(3;2) = 9  z(3;3) = 6  z(3;4) = 11

   3.004   STO 00    and we store the 12 numbers:

       1   3   7   10            R01   R04   R07   R10
       4   5   8   14    in     R02   R05   R08   R11      respectively
       2   9   6   11           R03   R06   R09   R12

-There are seven (i;j) pairs satisfying the required properties  ( 0 <= i <= 1.5 ; 0 <= j <= 2   and  0 < i < 1.5 ; -2 < j < 0 )
  namely:     (0;0) (0;1) (0;2) ,  (1;0) (1;1) (1;2)  and  (1;-1)

      0  ENTER^    XEQ "SPA2"    >>>   a0,0 =   6.6667
      1  ENTER^       0    R/S           >>>   a0;1 =      3         X<>Y   b0;1 = -2.3333
      2  ENTER^       0    R/S           >>>   a0;2 =      2         X<>Y   b0;2 =      0
      0  ENTER^       1    R/S           >>>   a1;0 =   0.3333   X<>Y    b1;0 = -1.4434
      1  ENTER^             R/S           >>>   a1;1 =  -0.7113   X<>Y    b1;1 = -0.1220
      2  ENTER^       1    R/S           >>>   a1;2 =      1          X<>Y   b1;2 = -0.2887
     -1  ENTER^      1    R/S           >>>   a1;-1 = -1.2887    X<>Y   b1;-1 = -0.4553

-Actually,

     z(x;y) =    20/3   +  3 cos ( 90y ) - 7/3 sin ( 90y )    +  2 cos ( 180y )
     + 1/3 cos ( 120x ) - 5/r sin ( 120x )   +  ( -1 + 1/r ) cos ( 120x + 90y ) + ( 1/6 - 1/r ) sin ( 120x + 90y )  +   cos ( 120x + 180y ) - 1/r sin ( 120x + 180y )
     + ( -1 - 1/r ) cos ( 120x - 90y ) + ( -1/6 - 1/r ) sin ( 120x - 90y )

         where  r is the square root of 12
 

4°) Two-dimensional Problems - Complex Arguments
 

-"DFTZ2"  calculates the components  zi,j = xi,j + i yi,j   of  DFT [ ai,j ]   with ai,j = bi,j + i ci,j   ( 1 <= i <= n , 1 <= j <= m ).
 

Data Registers:     •  R00 = n.mmm  =  n + m/1000             ( Registers R00 thru R2nm are to be initialized before executing "DFTZ2" )

                                •  R01 = b1,1      •  R2n+1 = b1,2   .......................................   •  R2nm-2n+1 = b1,m
                                •  R02 = c1,1      •  R2n+2 = c1,2   .......................................   •  R2nm-2n+2 = c1,m

                                •  R03 = b2,1      •  R2n+3 = b2,2   .......................................   •  R2nm-2n+3 = b2,m
                                •  R04 = c2,1      •  R2n+4 = c2,2   .......................................   •  R2nm-2n+4 = c2,m
                                       ..........................................................................................................
                                       ..........................................................................................................

                                •  R2n-1 = bn,1  •  R4n-1  =  bn,2   .......................................  •  R2nm-1 = bn,m
                                •  R2n  = cn,1     •  R4n    =  cn,2   .......................................    •  R2nm   = cn,m
Flags: /
Subroutines: /
 
 

01  LBL "DFTZ2"
02  DEG
03  360
04  ST* Y
05  ST* Z
06  ST- Z
07  -
08  RCL 00
09  INT
10  ST+ X
11  STO M
12  /
13  STO N        
14  CLX
15  RCL 00
16  FRC
17   E3
18  *
19  ST* M
20  /
21  STO O
22  CLX
23  STO P
24  LBL 01        
25  RCL N
26  RCL M
27  ENTER^
28  SIGN
29  ST+ X
30  -
31  ST* Y
32  RCL 00
33  INT
34  ST+ X
35  /
36  INT
37  RCL O
38  *
39  +
40  RCL IND M
41  DSE M
42  RCL IND M
43  R-P
44  RDN
45  -
46  R^
47  P-R
48  ST+ P
49  RDN
50  -
51  DSE M
52  GTO 01        
53  RCL P
54  CLA
55  END

 
   ( 90 bytes / SIZE 2n.m+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             j            yi,j
           X             i            xi,j

  with   zi,j = xi,j + i yi,j

 Example:

           [ [  1+2.i  3+4.i  4+5.i  6+7.i  ]
    A =   [  4+6.i  5+7.i  7+8.i  3+4.i  ]
             [  2+3.i  9+7.i  6+5.i  1+4.i  ] ]

-Calculate   z2,3

 We have 3 rows and 4 columns , therefore  3.004  STO 00

                 1  2    3  4    4  5    6  7              R01 R02   R07 R08   R13 R14   R19 R20
    Store:    4  6    5  7    7  8    3  4     in      R03 R04   R09 R10   R15 R16   R21 R22      respectively
                 2  3    9  7    6  5    1  4              R05 R06   R11 R12   R17 R18   R23 R24

  3  ENTER^
  2  XEQ "DFTZ2"  >>>>>    0.696152398            --- execution time = 24s ---
                               X<>Y    -8.330126900

-So    z2,3 = 0.696152398 - 8.330126900 i

-Likewise,

                     [ [         51+62 i                  -7-14 i                   -3-4.i                      -13              ]
   DFT [A] =   [  0.6962-4.8660 i   -0.3038+6.1340 i    0.6962-8.3301 i     1.3038-9.8660 i  ]       rounded to 4 decimals
                       [-9.6962-3.1340 i  -10.6962+7.8660 i  -9.6962+0.3301 i  11.6962-8.1340 i  ] ]

Note:

-To calculate the inverse Fourier transform:

  add   RCL a    ST/ Z   /     after line 53
  replace lines 45 and 50 by  +  ( instead of - )
  add   ST* a   after line 19
  and add   STO a   after line 09
 

5°) Three-dimensional Problems - Real Arguments
 

-Similar programs can be used to compute the DFT of a real hypermatrix  [ ai,j,k ]    ( 1 <= i <= n , 1 <= j <= m , 1 <= k <= p ).
-The result is a complex hypermatrix  [ zi,j,k ]   with  zi,j,k = xi,j,k + i yi,j,k

       zi,j,k  = SUMq=1,2,...,n  ; r=1,2,....,m ; s=1,2,.....,p   aq,r,s  exp { -2i(pi).[ (q-1)(i-1)/n+(r-1)(j-1)/m+(s-1)(k-1)/p ] }
 

Data Registers:     •  R00 = n.mmmppp  =  n + m/1000 + p/1000000       ( Registers R00 thru Rnmp are to be initialized before executing "DFT3" )

                                •  R01 = a1,1,1      •  Rn+1 = a1,2,1   .......................................   •  Rnm-n+1 = a1,m,1
                                •  R02 = a2,1,1      •  Rn+2 = a2,2,1   .......................................   •  Rnm-n+2 = a2,m,1
                                       ..................................................................................................................
                                •  Rn = an,1,1        •  R2n  =  an,2,1   ........................................  •  Rnm = an,m,1

                                          •  Rnm+1 = a1,1,2      •  Rnm+n+1 = a1,2,2   .......................................   •  R2nm-n+1 = a1,m,2
                                          •  Rnm+2 = a2,1,2      •  Rnm+n+2 = a2,2,2   .......................................   •  R2nm-n+2 = a2,m,2
                                              ..................................................................................................................................
                                          •  Rnm+n = an,1,2      •  Rnm+2n  =  an,2,2   ........................................  •  R2nm = an,m,2

                                                ..........................................................................................................
                                                    ..........................................................................................................
                                                        ..........................................................................................................

                                                    •  Rnm(p-1)+1 = a1,1,p      •  Rnm(p-1)+n+1 = a1,2,p   .......................................   •  Rnmp-n+1 = a1,m,p
                                                    •  Rnm(p-1)+2 = a2,1,p      •  Rnm(p-1)+n+2 = a2,2,p   .......................................   •  Rnmp-n+2 = a2,m,p
                                                       ....................................................................................................................................................
                                                    •  Rnm(p-1)+n = an,1,p      •  Rnm(p-1)+2n  =  an,2,p   ........................................  •  Rnmp = an,m,p
Flags: /
Subroutines:  /
 
 

01  LBL "DFT3"
02  DEG
03  360
04  ST* Y
05  ST* Z
06  ST* T
07  ST- T
08  ST- Z
09  -
10  RCL 00
11  INT
12  STO M
13  STO a
14  /
15  STO N
16  CLX
17  RCL 00       
18  FRC
19   E3
20  *
21  INT
22  ST* M
23  ST* a
24  /
25  STO O
26  CLX
27  RCL 00
28   E6
29  ST* Y
30  SQRT
31  MOD
32  ST* M
33  /
34  STO P
35  CLST
36  LBL 01       
37  RCL M
38  ENTER^
39  SIGN
40  -
41  STO Q
42  RCL a
43  /
44  INT
45  RCL P
46  *
47  RCL N
48  X<> Q
49  ST* Q
50  X<> Q
51  +
52  X<> Q
53  RCL 00       
54  INT
55  /
56  INT
57  RCL O
58  *
59  RCL Q
60  +
61  RCL IND M
62  P-R
63  ST+ T
64  RDN
65  -
66  DSE M
67  GTO 01
68  X<>Y
69  CLA
70  END

 
    ( 112 bytes / SIZE nmp+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Z             k             /
           Y             j           yi,j,k
           X             i           xi,j,k

  with   zi,j,k = xi,j,k + i yi,j,k

 ( 1 <= i <= n , 1 <= j <= m , 1 <= k <= p )
 

Example:

    A =  [ [ [   1  25  40   5    2  ]                        To store these 60 coefficients into the proper registers, you can key in    60   XEQ 01
                [   4  36  18  32  37 ]                         after loading this short routine:
                [   9   8   39  20  33 ]
                [ 16  23  21  10  31 ] ]                       LBL 01   ENTER^   X^2   41   MOD   STO IND Y   X<>Y   DSE X   GTO 01
                   [ [  31  10  21  23  16 ]
                     [  33  20  39   8    9  ]
                     [  37  32  18  36   4  ]
                     [   2    5   40  25   1  ] ]
                        [ [   0  16  23  21  10 ]
                          [   1  25  40   5    2  ]
                          [   4  36  18  32  37 ]
                          [   9   8   39  20  33 ] ] ]

-Evaluate   z2,4,3

-We have a   4x5x3  hypermatrix  therefore:   4.005003   STO 00

-Then,

    3  ENTER^
    4  ENTER^
    2  XEQ "DFT3"  >>>>>   38.01062796                              --- Execution time = 84 seconds ---
                               X<>Y    10.96762920

-Thus,     z2,4,3 =  38.01062796 + 10.96762920 i

Note:

-To compute the inverse Fourier transform:

   replace line 65  by   +
   and add   RCL 00    E6    ST* Y    SQRT    MOD    RCL a     *     ST/ Z     /      after line 68
 

6°) Three-dimensional Problems - Complex Arguments
 

-"DFTZ3"  computes the DFT of a complex hypermatrix  [ ai,j,k ]  with ai,j,k = bi,j,k + i ci,j,k    ( 1 <= i <= n , 1 <= j <= m , 1 <= k <= p ).
-The result is also a complex hypermatrix  [ zi,j,k ]   with  zi,j,k = xi,j,k + i yi,j,k
 

Data Registers:     •  R00 = n.mmmppp  =  n+m/1000+p/1000000       ( Registers R00 thru R2nmp are to be initialized before executing "DFTZ3" )

                                •  R01 = b1,1,1      ...................................................................   •  R2nm-2n+1 = b1,m,1
                                •  R02 = c1,1,1      ...................................................................   •  R2nm-2n+2 = c1,m,1
                                       ..........................................................................................................
                                       ..........................................................................................................

                                •  R2n-1 = bn,1     ....................................................................  •  R2nm-1 = bn,m
                                •  R2n  = cn,1        ..................................................................    •  R2nm   = cn,m
 

                                              .......................................................................................................................
                                              .......................................................................................................................
 

                                                               ...................................................................................................................
                                                               ...................................................................................................................
 

                                                         •  R2nm(p-1)+1 = b1,1,p    .....................................................................   •  R2nmp-2n+1 = b1,m,p
                                                         •  R2nm(p-1)+2 = c1,1,p    .....................................................................   •  R2nmp-2n+2 = c1,m,p
                                                                          ..........................................................................................................
                                                                          ..........................................................................................................

                                                         •  R2nm(p-1)+2n-1 = bn,1,p  ....................................................................  •  R2nmp-1 = bn,m,p
                                                         •  R2nm(p-1)+2n  = cn,1,p     ....................................................................  •  R2nmp   = cn,m,p
Flags: /
Subroutines: /
 
 

01  LBL "DFTZ3"
02  DEG
03  360
04  ST* Y
05  ST* Z
06  ST* T
07  ST- T
08  ST- Z
09  -
10  RCL 00
11  INT
12  ST+ X
13  STO M
14  /
15  STO N
16  CLX
17  RCL 00
18  FRC
19   E3
20  *
21  INT
22  ST* M
23  /
24  STO O
25  CLX
26  RCL 00       
27   E6
28  ST* Y
29  SQRT
30  MOD
31  ST* M
32  /
33  STO P
34  CLX
35  STO a
36  LBL 01
37  RCL M
38  ENTER^
39  SIGN
40  ST+ X
41  -
42  STO Q
43  RCL 00       
44  FRC
45  PI
46  INT
47  10^X
48  *
49  INT
50  RCL 00
51  INT
52  *
53  ST+ X
54  /
55  INT
56  RCL P
57  *
58  RCL Q
59  RCL N
60  *
61  +
62  RCL Q
63  RCL 00
64  INT
65  ST+ X
66  /
67  INT
68  RCL O
69  *
70  +
71  RCL IND M
72  DSE M
73  RCL IND M
74  R-P
75  RDN
76  -
77  R^
78  P-R
79  ST+ a
80  RDN
81  -
82  DSE M
83  GTO 01
84  RCL a
85  CLA
86  END
 

 
   ( 131 bytes / SIZE 2nmp+1 )
 
 

      STACK        INPUTS      OUTPUTS
           Z             k             /
           Y             j           yi,j,k
           X             i           xi,j,k

  with   zi,j,k = xi,j,k + i yi,j,k

 ( 1 <= i <= n , 1 <= j <= m , 1 <= k <= p )
 

Example:

    A =  [ [ [   1+4.i   40+18.i   2+37.i   10+20.i   23+8.i  ]
                 [  9+16.i  39+21.i  33+31.i   32+5.i   36+25.i ]
                 [ 25+36.i  5+32.i   31+33.i   21+39.i  16+9.i  ]
                 [  8+23.i  20+10.i   37+2.i    18+40.i    4+i     ] ]
                       [ [      i       23+40.i    10+2.i     2+10.i   40+23.i  ]
                         [   4+9.i   18+39.i   37+33.i   20+32.i   8+36.i   ]
                         [ 16+25.i  21+5.i    31+31.i    5+21.i   25+16.i  ]
                         [  36+8.i  32+20.i   33+37.i   39+18.i    9+4.i    ] ]
                              [ [      1        8+23.i    20+10.i    37+2.i   18+40.i  ]
                                [   1+4.i    40+18.i    2+37.i    10+20.i   23+8.i   ]
                                [  9+16.i   39+21.i   33+31.i    32+5.i   36+25.i  ]
                                [ 25+36.i   5+32.i    31+33.i   21+39.i   16+9.i   ]
 

-To store the 60 complex coefficients of this 4x5x3 hypermatrix into the proper registers, you can use the routine ( SIZE 121 ):

   LBL 01       41                     X<>Y                     Then key in   120  XEQ 01   in RUN mode
   ENTER^    MOD                DSE X
   X^2           STO IND Y      GTO 01

-Evaluate    z2,4,3

 n.mmmppp = 4.005003   STO 00

   3   ENTER^
   4   ENTER^
   2   XEQ "DFTZ3"  >>>>    20.47040998                    --- Execution time = 2mn31s ---
                                X<>Y   -159.3203501

-Thus,     z2,4,3 =  20.47040998 - 159.3203501 i

Note:

-To compute the inverse Fourier transform:

   replace lines  76 and 81  by   +
   and add   RCL 00    FRC    E3    *    INT   ST- L    E3    ST* L    X<> L    *    RCL 00    INT     *     ST/ Z     /      after line 84
 

References:

[1]  Abramowitz & Stegun - "Handbook of Mathematical Functions" - Dover Publications - ISBN 0-486-61272-4
[2]  Ronald N. Bracewell - "The Fourier Transform and its Applications" - McGraw-Hill - ISBN 0-07-116043-4
[3]  F.Scheid - "Numerical Analysis" - Mc Graw Hill - ISBN  07-055197-9