xref: /aosp_15_r20/external/pffft/fftpack.h (revision 3f1979aa0d7ad34fcf3763de7b7b8f8cd67e5bdd)
1*3f1979aaSAndroid Build Coastguard Worker /*
2*3f1979aaSAndroid Build Coastguard Worker   Interface for the f2c translation of fftpack as found on http://www.netlib.org/fftpack/
3*3f1979aaSAndroid Build Coastguard Worker 
4*3f1979aaSAndroid Build Coastguard Worker    FFTPACK license:
5*3f1979aaSAndroid Build Coastguard Worker 
6*3f1979aaSAndroid Build Coastguard Worker    http://www.cisl.ucar.edu/css/software/fftpack5/ftpk.html
7*3f1979aaSAndroid Build Coastguard Worker 
8*3f1979aaSAndroid Build Coastguard Worker    Copyright (c) 2004 the University Corporation for Atmospheric
9*3f1979aaSAndroid Build Coastguard Worker    Research ("UCAR"). All rights reserved. Developed by NCAR's
10*3f1979aaSAndroid Build Coastguard Worker    Computational and Information Systems Laboratory, UCAR,
11*3f1979aaSAndroid Build Coastguard Worker    www.cisl.ucar.edu.
12*3f1979aaSAndroid Build Coastguard Worker 
13*3f1979aaSAndroid Build Coastguard Worker    Redistribution and use of the Software in source and binary forms,
14*3f1979aaSAndroid Build Coastguard Worker    with or without modification, is permitted provided that the
15*3f1979aaSAndroid Build Coastguard Worker    following conditions are met:
16*3f1979aaSAndroid Build Coastguard Worker 
17*3f1979aaSAndroid Build Coastguard Worker    - Neither the names of NCAR's Computational and Information Systems
18*3f1979aaSAndroid Build Coastguard Worker    Laboratory, the University Corporation for Atmospheric Research,
19*3f1979aaSAndroid Build Coastguard Worker    nor the names of its sponsors or contributors may be used to
20*3f1979aaSAndroid Build Coastguard Worker    endorse or promote products derived from this Software without
21*3f1979aaSAndroid Build Coastguard Worker    specific prior written permission.
22*3f1979aaSAndroid Build Coastguard Worker 
23*3f1979aaSAndroid Build Coastguard Worker    - Redistributions of source code must retain the above copyright
24*3f1979aaSAndroid Build Coastguard Worker    notices, this list of conditions, and the disclaimer below.
25*3f1979aaSAndroid Build Coastguard Worker 
26*3f1979aaSAndroid Build Coastguard Worker    - Redistributions in binary form must reproduce the above copyright
27*3f1979aaSAndroid Build Coastguard Worker    notice, this list of conditions, and the disclaimer below in the
28*3f1979aaSAndroid Build Coastguard Worker    documentation and/or other materials provided with the
29*3f1979aaSAndroid Build Coastguard Worker    distribution.
30*3f1979aaSAndroid Build Coastguard Worker 
31*3f1979aaSAndroid Build Coastguard Worker    THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32*3f1979aaSAndroid Build Coastguard Worker    EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF
33*3f1979aaSAndroid Build Coastguard Worker    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34*3f1979aaSAndroid Build Coastguard Worker    NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
35*3f1979aaSAndroid Build Coastguard Worker    HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,
36*3f1979aaSAndroid Build Coastguard Worker    EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN
37*3f1979aaSAndroid Build Coastguard Worker    ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
38*3f1979aaSAndroid Build Coastguard Worker    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
39*3f1979aaSAndroid Build Coastguard Worker    SOFTWARE.
40*3f1979aaSAndroid Build Coastguard Worker 
41*3f1979aaSAndroid Build Coastguard Worker    ChangeLog:
42*3f1979aaSAndroid Build Coastguard Worker    2011/10/02: this is my first release of this file.
43*3f1979aaSAndroid Build Coastguard Worker */
44*3f1979aaSAndroid Build Coastguard Worker 
45*3f1979aaSAndroid Build Coastguard Worker #ifndef FFTPACK_H
46*3f1979aaSAndroid Build Coastguard Worker #define FFTPACK_H
47*3f1979aaSAndroid Build Coastguard Worker 
48*3f1979aaSAndroid Build Coastguard Worker #ifdef __cplusplus
49*3f1979aaSAndroid Build Coastguard Worker extern "C" {
50*3f1979aaSAndroid Build Coastguard Worker #endif
51*3f1979aaSAndroid Build Coastguard Worker 
52*3f1979aaSAndroid Build Coastguard Worker /* just define FFTPACK_DOUBLE_PRECISION if you want to build it as a double precision fft */
53*3f1979aaSAndroid Build Coastguard Worker 
54*3f1979aaSAndroid Build Coastguard Worker #ifndef FFTPACK_DOUBLE_PRECISION
55*3f1979aaSAndroid Build Coastguard Worker   typedef float fftpack_real;
56*3f1979aaSAndroid Build Coastguard Worker   typedef int   fftpack_int;
57*3f1979aaSAndroid Build Coastguard Worker #else
58*3f1979aaSAndroid Build Coastguard Worker   typedef double fftpack_real;
59*3f1979aaSAndroid Build Coastguard Worker   typedef int    fftpack_int;
60*3f1979aaSAndroid Build Coastguard Worker #endif
61*3f1979aaSAndroid Build Coastguard Worker 
62*3f1979aaSAndroid Build Coastguard Worker   void cffti(fftpack_int n, fftpack_real *wsave);
63*3f1979aaSAndroid Build Coastguard Worker 
64*3f1979aaSAndroid Build Coastguard Worker   void cfftf(fftpack_int n, fftpack_real *c, fftpack_real *wsave);
65*3f1979aaSAndroid Build Coastguard Worker 
66*3f1979aaSAndroid Build Coastguard Worker   void cfftb(fftpack_int n, fftpack_real *c, fftpack_real *wsave);
67*3f1979aaSAndroid Build Coastguard Worker 
68*3f1979aaSAndroid Build Coastguard Worker   void rffti(fftpack_int n, fftpack_real *wsave);
69*3f1979aaSAndroid Build Coastguard Worker   void rfftf(fftpack_int n, fftpack_real *r, fftpack_real *wsave);
70*3f1979aaSAndroid Build Coastguard Worker   void rfftb(fftpack_int n, fftpack_real *r, fftpack_real *wsave);
71*3f1979aaSAndroid Build Coastguard Worker 
72*3f1979aaSAndroid Build Coastguard Worker   void cosqi(fftpack_int n, fftpack_real *wsave);
73*3f1979aaSAndroid Build Coastguard Worker   void cosqf(fftpack_int n, fftpack_real *x, fftpack_real *wsave);
74*3f1979aaSAndroid Build Coastguard Worker   void cosqb(fftpack_int n, fftpack_real *x, fftpack_real *wsave);
75*3f1979aaSAndroid Build Coastguard Worker 
76*3f1979aaSAndroid Build Coastguard Worker   void costi(fftpack_int n, fftpack_real *wsave);
77*3f1979aaSAndroid Build Coastguard Worker   void cost(fftpack_int n, fftpack_real *x, fftpack_real *wsave);
78*3f1979aaSAndroid Build Coastguard Worker 
79*3f1979aaSAndroid Build Coastguard Worker   void sinqi(fftpack_int n, fftpack_real *wsave);
80*3f1979aaSAndroid Build Coastguard Worker   void sinqb(fftpack_int n, fftpack_real *x, fftpack_real *wsave);
81*3f1979aaSAndroid Build Coastguard Worker   void sinqf(fftpack_int n, fftpack_real *x, fftpack_real *wsave);
82*3f1979aaSAndroid Build Coastguard Worker 
83*3f1979aaSAndroid Build Coastguard Worker   void sinti(fftpack_int n, fftpack_real *wsave);
84*3f1979aaSAndroid Build Coastguard Worker   void sint(fftpack_int n, fftpack_real *x, fftpack_real *wsave);
85*3f1979aaSAndroid Build Coastguard Worker 
86*3f1979aaSAndroid Build Coastguard Worker #ifdef __cplusplus
87*3f1979aaSAndroid Build Coastguard Worker }
88*3f1979aaSAndroid Build Coastguard Worker #endif
89*3f1979aaSAndroid Build Coastguard Worker 
90*3f1979aaSAndroid Build Coastguard Worker #endif /* FFTPACK_H */
91*3f1979aaSAndroid Build Coastguard Worker 
92*3f1979aaSAndroid Build Coastguard Worker /*
93*3f1979aaSAndroid Build Coastguard Worker 
94*3f1979aaSAndroid Build Coastguard Worker                       FFTPACK
95*3f1979aaSAndroid Build Coastguard Worker 
96*3f1979aaSAndroid Build Coastguard Worker * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
97*3f1979aaSAndroid Build Coastguard Worker 
98*3f1979aaSAndroid Build Coastguard Worker                   version 4  april 1985
99*3f1979aaSAndroid Build Coastguard Worker 
100*3f1979aaSAndroid Build Coastguard Worker      a package of fortran subprograms for the fast fourier
101*3f1979aaSAndroid Build Coastguard Worker       transform of periodic and other symmetric sequences
102*3f1979aaSAndroid Build Coastguard Worker 
103*3f1979aaSAndroid Build Coastguard Worker                          by
104*3f1979aaSAndroid Build Coastguard Worker 
105*3f1979aaSAndroid Build Coastguard Worker                   paul n swarztrauber
106*3f1979aaSAndroid Build Coastguard Worker 
107*3f1979aaSAndroid Build Coastguard Worker   national center for atmospheric research  boulder,colorado 80307
108*3f1979aaSAndroid Build Coastguard Worker 
109*3f1979aaSAndroid Build Coastguard Worker    which is sponsored by the national science foundation
110*3f1979aaSAndroid Build Coastguard Worker 
111*3f1979aaSAndroid Build Coastguard Worker * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
112*3f1979aaSAndroid Build Coastguard Worker 
113*3f1979aaSAndroid Build Coastguard Worker 
114*3f1979aaSAndroid Build Coastguard Worker this package consists of programs which perform fast fourier
115*3f1979aaSAndroid Build Coastguard Worker transforms for both complex and real periodic sequences and
116*3f1979aaSAndroid Build Coastguard Worker certain other symmetric sequences that are listed below.
117*3f1979aaSAndroid Build Coastguard Worker 
118*3f1979aaSAndroid Build Coastguard Worker 1.   rffti     initialize  rfftf and rfftb
119*3f1979aaSAndroid Build Coastguard Worker 2.   rfftf     forward transform of a real periodic sequence
120*3f1979aaSAndroid Build Coastguard Worker 3.   rfftb     backward transform of a real coefficient array
121*3f1979aaSAndroid Build Coastguard Worker 
122*3f1979aaSAndroid Build Coastguard Worker 4.   ezffti    initialize ezfftf and ezfftb
123*3f1979aaSAndroid Build Coastguard Worker 5.   ezfftf    a simplified real periodic forward transform
124*3f1979aaSAndroid Build Coastguard Worker 6.   ezfftb    a simplified real periodic backward transform
125*3f1979aaSAndroid Build Coastguard Worker 
126*3f1979aaSAndroid Build Coastguard Worker 7.   sinti     initialize sint
127*3f1979aaSAndroid Build Coastguard Worker 8.   sint      sine transform of a real odd sequence
128*3f1979aaSAndroid Build Coastguard Worker 
129*3f1979aaSAndroid Build Coastguard Worker 9.   costi     initialize cost
130*3f1979aaSAndroid Build Coastguard Worker 10.  cost      cosine transform of a real even sequence
131*3f1979aaSAndroid Build Coastguard Worker 
132*3f1979aaSAndroid Build Coastguard Worker 11.  sinqi     initialize sinqf and sinqb
133*3f1979aaSAndroid Build Coastguard Worker 12.  sinqf     forward sine transform with odd wave numbers
134*3f1979aaSAndroid Build Coastguard Worker 13.  sinqb     unnormalized inverse of sinqf
135*3f1979aaSAndroid Build Coastguard Worker 
136*3f1979aaSAndroid Build Coastguard Worker 14.  cosqi     initialize cosqf and cosqb
137*3f1979aaSAndroid Build Coastguard Worker 15.  cosqf     forward cosine transform with odd wave numbers
138*3f1979aaSAndroid Build Coastguard Worker 16.  cosqb     unnormalized inverse of cosqf
139*3f1979aaSAndroid Build Coastguard Worker 
140*3f1979aaSAndroid Build Coastguard Worker 17.  cffti     initialize cfftf and cfftb
141*3f1979aaSAndroid Build Coastguard Worker 18.  cfftf     forward transform of a complex periodic sequence
142*3f1979aaSAndroid Build Coastguard Worker 19.  cfftb     unnormalized inverse of cfftf
143*3f1979aaSAndroid Build Coastguard Worker 
144*3f1979aaSAndroid Build Coastguard Worker 
145*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
146*3f1979aaSAndroid Build Coastguard Worker 
147*3f1979aaSAndroid Build Coastguard Worker subroutine rffti(n,wsave)
148*3f1979aaSAndroid Build Coastguard Worker 
149*3f1979aaSAndroid Build Coastguard Worker   ****************************************************************
150*3f1979aaSAndroid Build Coastguard Worker 
151*3f1979aaSAndroid Build Coastguard Worker subroutine rffti initializes the array wsave which is used in
152*3f1979aaSAndroid Build Coastguard Worker both rfftf and rfftb. the prime factorization of n together with
153*3f1979aaSAndroid Build Coastguard Worker a tabulation of the trigonometric functions are computed and
154*3f1979aaSAndroid Build Coastguard Worker stored in wsave.
155*3f1979aaSAndroid Build Coastguard Worker 
156*3f1979aaSAndroid Build Coastguard Worker input parameter
157*3f1979aaSAndroid Build Coastguard Worker 
158*3f1979aaSAndroid Build Coastguard Worker n       the length of the sequence to be transformed.
159*3f1979aaSAndroid Build Coastguard Worker 
160*3f1979aaSAndroid Build Coastguard Worker output parameter
161*3f1979aaSAndroid Build Coastguard Worker 
162*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 2*n+15.
163*3f1979aaSAndroid Build Coastguard Worker         the same work array can be used for both rfftf and rfftb
164*3f1979aaSAndroid Build Coastguard Worker         as long as n remains unchanged. different wsave arrays
165*3f1979aaSAndroid Build Coastguard Worker         are required for different values of n. the contents of
166*3f1979aaSAndroid Build Coastguard Worker         wsave must not be changed between calls of rfftf or rfftb.
167*3f1979aaSAndroid Build Coastguard Worker 
168*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
169*3f1979aaSAndroid Build Coastguard Worker 
170*3f1979aaSAndroid Build Coastguard Worker subroutine rfftf(n,r,wsave)
171*3f1979aaSAndroid Build Coastguard Worker 
172*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
173*3f1979aaSAndroid Build Coastguard Worker 
174*3f1979aaSAndroid Build Coastguard Worker subroutine rfftf computes the fourier coefficients of a real
175*3f1979aaSAndroid Build Coastguard Worker perodic sequence (fourier analysis). the transform is defined
176*3f1979aaSAndroid Build Coastguard Worker below at output parameter r.
177*3f1979aaSAndroid Build Coastguard Worker 
178*3f1979aaSAndroid Build Coastguard Worker input parameters
179*3f1979aaSAndroid Build Coastguard Worker 
180*3f1979aaSAndroid Build Coastguard Worker n       the length of the array r to be transformed.  the method
181*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n is a product of small primes.
182*3f1979aaSAndroid Build Coastguard Worker         n may change so long as different work arrays are provided
183*3f1979aaSAndroid Build Coastguard Worker 
184*3f1979aaSAndroid Build Coastguard Worker r       a real array of length n which contains the sequence
185*3f1979aaSAndroid Build Coastguard Worker         to be transformed
186*3f1979aaSAndroid Build Coastguard Worker 
187*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 2*n+15.
188*3f1979aaSAndroid Build Coastguard Worker         in the program that calls rfftf. the wsave array must be
189*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine rffti(n,wsave) and a
190*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
191*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
192*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
193*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
194*3f1979aaSAndroid Build Coastguard Worker         the same wsave array can be used by rfftf and rfftb.
195*3f1979aaSAndroid Build Coastguard Worker 
196*3f1979aaSAndroid Build Coastguard Worker 
197*3f1979aaSAndroid Build Coastguard Worker output parameters
198*3f1979aaSAndroid Build Coastguard Worker 
199*3f1979aaSAndroid Build Coastguard Worker r       r(1) = the sum from i=1 to i=n of r(i)
200*3f1979aaSAndroid Build Coastguard Worker 
201*3f1979aaSAndroid Build Coastguard Worker         if n is even set l =n/2   , if n is odd set l = (n+1)/2
202*3f1979aaSAndroid Build Coastguard Worker 
203*3f1979aaSAndroid Build Coastguard Worker           then for k = 2,...,l
204*3f1979aaSAndroid Build Coastguard Worker 
205*3f1979aaSAndroid Build Coastguard Worker              r(2*k-2) = the sum from i = 1 to i = n of
206*3f1979aaSAndroid Build Coastguard Worker 
207*3f1979aaSAndroid Build Coastguard Worker                   r(i)*cos((k-1)*(i-1)*2*pi/n)
208*3f1979aaSAndroid Build Coastguard Worker 
209*3f1979aaSAndroid Build Coastguard Worker              r(2*k-1) = the sum from i = 1 to i = n of
210*3f1979aaSAndroid Build Coastguard Worker 
211*3f1979aaSAndroid Build Coastguard Worker                  -r(i)*sin((k-1)*(i-1)*2*pi/n)
212*3f1979aaSAndroid Build Coastguard Worker 
213*3f1979aaSAndroid Build Coastguard Worker         if n is even
214*3f1979aaSAndroid Build Coastguard Worker 
215*3f1979aaSAndroid Build Coastguard Worker              r(n) = the sum from i = 1 to i = n of
216*3f1979aaSAndroid Build Coastguard Worker 
217*3f1979aaSAndroid Build Coastguard Worker                   (-1)**(i-1)*r(i)
218*3f1979aaSAndroid Build Coastguard Worker 
219*3f1979aaSAndroid Build Coastguard Worker  *****  note
220*3f1979aaSAndroid Build Coastguard Worker              this transform is unnormalized since a call of rfftf
221*3f1979aaSAndroid Build Coastguard Worker              followed by a call of rfftb will multiply the input
222*3f1979aaSAndroid Build Coastguard Worker              sequence by n.
223*3f1979aaSAndroid Build Coastguard Worker 
224*3f1979aaSAndroid Build Coastguard Worker wsave   contains results which must not be destroyed between
225*3f1979aaSAndroid Build Coastguard Worker         calls of rfftf or rfftb.
226*3f1979aaSAndroid Build Coastguard Worker 
227*3f1979aaSAndroid Build Coastguard Worker 
228*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
229*3f1979aaSAndroid Build Coastguard Worker 
230*3f1979aaSAndroid Build Coastguard Worker subroutine rfftb(n,r,wsave)
231*3f1979aaSAndroid Build Coastguard Worker 
232*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
233*3f1979aaSAndroid Build Coastguard Worker 
234*3f1979aaSAndroid Build Coastguard Worker subroutine rfftb computes the real perodic sequence from its
235*3f1979aaSAndroid Build Coastguard Worker fourier coefficients (fourier synthesis). the transform is defined
236*3f1979aaSAndroid Build Coastguard Worker below at output parameter r.
237*3f1979aaSAndroid Build Coastguard Worker 
238*3f1979aaSAndroid Build Coastguard Worker input parameters
239*3f1979aaSAndroid Build Coastguard Worker 
240*3f1979aaSAndroid Build Coastguard Worker n       the length of the array r to be transformed.  the method
241*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n is a product of small primes.
242*3f1979aaSAndroid Build Coastguard Worker         n may change so long as different work arrays are provided
243*3f1979aaSAndroid Build Coastguard Worker 
244*3f1979aaSAndroid Build Coastguard Worker r       a real array of length n which contains the sequence
245*3f1979aaSAndroid Build Coastguard Worker         to be transformed
246*3f1979aaSAndroid Build Coastguard Worker 
247*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 2*n+15.
248*3f1979aaSAndroid Build Coastguard Worker         in the program that calls rfftb. the wsave array must be
249*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine rffti(n,wsave) and a
250*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
251*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
252*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
253*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
254*3f1979aaSAndroid Build Coastguard Worker         the same wsave array can be used by rfftf and rfftb.
255*3f1979aaSAndroid Build Coastguard Worker 
256*3f1979aaSAndroid Build Coastguard Worker 
257*3f1979aaSAndroid Build Coastguard Worker output parameters
258*3f1979aaSAndroid Build Coastguard Worker 
259*3f1979aaSAndroid Build Coastguard Worker r       for n even and for i = 1,...,n
260*3f1979aaSAndroid Build Coastguard Worker 
261*3f1979aaSAndroid Build Coastguard Worker              r(i) = r(1)+(-1)**(i-1)*r(n)
262*3f1979aaSAndroid Build Coastguard Worker 
263*3f1979aaSAndroid Build Coastguard Worker                   plus the sum from k=2 to k=n/2 of
264*3f1979aaSAndroid Build Coastguard Worker 
265*3f1979aaSAndroid Build Coastguard Worker                    2.*r(2*k-2)*cos((k-1)*(i-1)*2*pi/n)
266*3f1979aaSAndroid Build Coastguard Worker 
267*3f1979aaSAndroid Build Coastguard Worker                   -2.*r(2*k-1)*sin((k-1)*(i-1)*2*pi/n)
268*3f1979aaSAndroid Build Coastguard Worker 
269*3f1979aaSAndroid Build Coastguard Worker         for n odd and for i = 1,...,n
270*3f1979aaSAndroid Build Coastguard Worker 
271*3f1979aaSAndroid Build Coastguard Worker              r(i) = r(1) plus the sum from k=2 to k=(n+1)/2 of
272*3f1979aaSAndroid Build Coastguard Worker 
273*3f1979aaSAndroid Build Coastguard Worker                   2.*r(2*k-2)*cos((k-1)*(i-1)*2*pi/n)
274*3f1979aaSAndroid Build Coastguard Worker 
275*3f1979aaSAndroid Build Coastguard Worker                  -2.*r(2*k-1)*sin((k-1)*(i-1)*2*pi/n)
276*3f1979aaSAndroid Build Coastguard Worker 
277*3f1979aaSAndroid Build Coastguard Worker  *****  note
278*3f1979aaSAndroid Build Coastguard Worker              this transform is unnormalized since a call of rfftf
279*3f1979aaSAndroid Build Coastguard Worker              followed by a call of rfftb will multiply the input
280*3f1979aaSAndroid Build Coastguard Worker              sequence by n.
281*3f1979aaSAndroid Build Coastguard Worker 
282*3f1979aaSAndroid Build Coastguard Worker wsave   contains results which must not be destroyed between
283*3f1979aaSAndroid Build Coastguard Worker         calls of rfftb or rfftf.
284*3f1979aaSAndroid Build Coastguard Worker 
285*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
286*3f1979aaSAndroid Build Coastguard Worker 
287*3f1979aaSAndroid Build Coastguard Worker subroutine sinti(n,wsave)
288*3f1979aaSAndroid Build Coastguard Worker 
289*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
290*3f1979aaSAndroid Build Coastguard Worker 
291*3f1979aaSAndroid Build Coastguard Worker subroutine sinti initializes the array wsave which is used in
292*3f1979aaSAndroid Build Coastguard Worker subroutine sint. the prime factorization of n together with
293*3f1979aaSAndroid Build Coastguard Worker a tabulation of the trigonometric functions are computed and
294*3f1979aaSAndroid Build Coastguard Worker stored in wsave.
295*3f1979aaSAndroid Build Coastguard Worker 
296*3f1979aaSAndroid Build Coastguard Worker input parameter
297*3f1979aaSAndroid Build Coastguard Worker 
298*3f1979aaSAndroid Build Coastguard Worker n       the length of the sequence to be transformed.  the method
299*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n+1 is a product of small primes.
300*3f1979aaSAndroid Build Coastguard Worker 
301*3f1979aaSAndroid Build Coastguard Worker output parameter
302*3f1979aaSAndroid Build Coastguard Worker 
303*3f1979aaSAndroid Build Coastguard Worker wsave   a work array with at least int(2.5*n+15) locations.
304*3f1979aaSAndroid Build Coastguard Worker         different wsave arrays are required for different values
305*3f1979aaSAndroid Build Coastguard Worker         of n. the contents of wsave must not be changed between
306*3f1979aaSAndroid Build Coastguard Worker         calls of sint.
307*3f1979aaSAndroid Build Coastguard Worker 
308*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
309*3f1979aaSAndroid Build Coastguard Worker 
310*3f1979aaSAndroid Build Coastguard Worker subroutine sint(n,x,wsave)
311*3f1979aaSAndroid Build Coastguard Worker 
312*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
313*3f1979aaSAndroid Build Coastguard Worker 
314*3f1979aaSAndroid Build Coastguard Worker subroutine sint computes the discrete fourier sine transform
315*3f1979aaSAndroid Build Coastguard Worker of an odd sequence x(i). the transform is defined below at
316*3f1979aaSAndroid Build Coastguard Worker output parameter x.
317*3f1979aaSAndroid Build Coastguard Worker 
318*3f1979aaSAndroid Build Coastguard Worker sint is the unnormalized inverse of itself since a call of sint
319*3f1979aaSAndroid Build Coastguard Worker followed by another call of sint will multiply the input sequence
320*3f1979aaSAndroid Build Coastguard Worker x by 2*(n+1).
321*3f1979aaSAndroid Build Coastguard Worker 
322*3f1979aaSAndroid Build Coastguard Worker the array wsave which is used by subroutine sint must be
323*3f1979aaSAndroid Build Coastguard Worker initialized by calling subroutine sinti(n,wsave).
324*3f1979aaSAndroid Build Coastguard Worker 
325*3f1979aaSAndroid Build Coastguard Worker input parameters
326*3f1979aaSAndroid Build Coastguard Worker 
327*3f1979aaSAndroid Build Coastguard Worker n       the length of the sequence to be transformed.  the method
328*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n+1 is the product of small primes.
329*3f1979aaSAndroid Build Coastguard Worker 
330*3f1979aaSAndroid Build Coastguard Worker x       an array which contains the sequence to be transformed
331*3f1979aaSAndroid Build Coastguard Worker 
332*3f1979aaSAndroid Build Coastguard Worker 
333*3f1979aaSAndroid Build Coastguard Worker wsave   a work array with dimension at least int(2.5*n+15)
334*3f1979aaSAndroid Build Coastguard Worker         in the program that calls sint. the wsave array must be
335*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine sinti(n,wsave) and a
336*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
337*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
338*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
339*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
340*3f1979aaSAndroid Build Coastguard Worker 
341*3f1979aaSAndroid Build Coastguard Worker output parameters
342*3f1979aaSAndroid Build Coastguard Worker 
343*3f1979aaSAndroid Build Coastguard Worker x       for i=1,...,n
344*3f1979aaSAndroid Build Coastguard Worker 
345*3f1979aaSAndroid Build Coastguard Worker              x(i)= the sum from k=1 to k=n
346*3f1979aaSAndroid Build Coastguard Worker 
347*3f1979aaSAndroid Build Coastguard Worker                   2*x(k)*sin(k*i*pi/(n+1))
348*3f1979aaSAndroid Build Coastguard Worker 
349*3f1979aaSAndroid Build Coastguard Worker              a call of sint followed by another call of
350*3f1979aaSAndroid Build Coastguard Worker              sint will multiply the sequence x by 2*(n+1).
351*3f1979aaSAndroid Build Coastguard Worker              hence sint is the unnormalized inverse
352*3f1979aaSAndroid Build Coastguard Worker              of itself.
353*3f1979aaSAndroid Build Coastguard Worker 
354*3f1979aaSAndroid Build Coastguard Worker wsave   contains initialization calculations which must not be
355*3f1979aaSAndroid Build Coastguard Worker         destroyed between calls of sint.
356*3f1979aaSAndroid Build Coastguard Worker 
357*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
358*3f1979aaSAndroid Build Coastguard Worker 
359*3f1979aaSAndroid Build Coastguard Worker subroutine costi(n,wsave)
360*3f1979aaSAndroid Build Coastguard Worker 
361*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
362*3f1979aaSAndroid Build Coastguard Worker 
363*3f1979aaSAndroid Build Coastguard Worker subroutine costi initializes the array wsave which is used in
364*3f1979aaSAndroid Build Coastguard Worker subroutine cost. the prime factorization of n together with
365*3f1979aaSAndroid Build Coastguard Worker a tabulation of the trigonometric functions are computed and
366*3f1979aaSAndroid Build Coastguard Worker stored in wsave.
367*3f1979aaSAndroid Build Coastguard Worker 
368*3f1979aaSAndroid Build Coastguard Worker input parameter
369*3f1979aaSAndroid Build Coastguard Worker 
370*3f1979aaSAndroid Build Coastguard Worker n       the length of the sequence to be transformed.  the method
371*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n-1 is a product of small primes.
372*3f1979aaSAndroid Build Coastguard Worker 
373*3f1979aaSAndroid Build Coastguard Worker output parameter
374*3f1979aaSAndroid Build Coastguard Worker 
375*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 3*n+15.
376*3f1979aaSAndroid Build Coastguard Worker         different wsave arrays are required for different values
377*3f1979aaSAndroid Build Coastguard Worker         of n. the contents of wsave must not be changed between
378*3f1979aaSAndroid Build Coastguard Worker         calls of cost.
379*3f1979aaSAndroid Build Coastguard Worker 
380*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
381*3f1979aaSAndroid Build Coastguard Worker 
382*3f1979aaSAndroid Build Coastguard Worker subroutine cost(n,x,wsave)
383*3f1979aaSAndroid Build Coastguard Worker 
384*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
385*3f1979aaSAndroid Build Coastguard Worker 
386*3f1979aaSAndroid Build Coastguard Worker subroutine cost computes the discrete fourier cosine transform
387*3f1979aaSAndroid Build Coastguard Worker of an even sequence x(i). the transform is defined below at output
388*3f1979aaSAndroid Build Coastguard Worker parameter x.
389*3f1979aaSAndroid Build Coastguard Worker 
390*3f1979aaSAndroid Build Coastguard Worker cost is the unnormalized inverse of itself since a call of cost
391*3f1979aaSAndroid Build Coastguard Worker followed by another call of cost will multiply the input sequence
392*3f1979aaSAndroid Build Coastguard Worker x by 2*(n-1). the transform is defined below at output parameter x
393*3f1979aaSAndroid Build Coastguard Worker 
394*3f1979aaSAndroid Build Coastguard Worker the array wsave which is used by subroutine cost must be
395*3f1979aaSAndroid Build Coastguard Worker initialized by calling subroutine costi(n,wsave).
396*3f1979aaSAndroid Build Coastguard Worker 
397*3f1979aaSAndroid Build Coastguard Worker input parameters
398*3f1979aaSAndroid Build Coastguard Worker 
399*3f1979aaSAndroid Build Coastguard Worker n       the length of the sequence x. n must be greater than 1.
400*3f1979aaSAndroid Build Coastguard Worker         the method is most efficient when n-1 is a product of
401*3f1979aaSAndroid Build Coastguard Worker         small primes.
402*3f1979aaSAndroid Build Coastguard Worker 
403*3f1979aaSAndroid Build Coastguard Worker x       an array which contains the sequence to be transformed
404*3f1979aaSAndroid Build Coastguard Worker 
405*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 3*n+15
406*3f1979aaSAndroid Build Coastguard Worker         in the program that calls cost. the wsave array must be
407*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine costi(n,wsave) and a
408*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
409*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
410*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
411*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
412*3f1979aaSAndroid Build Coastguard Worker 
413*3f1979aaSAndroid Build Coastguard Worker output parameters
414*3f1979aaSAndroid Build Coastguard Worker 
415*3f1979aaSAndroid Build Coastguard Worker x       for i=1,...,n
416*3f1979aaSAndroid Build Coastguard Worker 
417*3f1979aaSAndroid Build Coastguard Worker             x(i) = x(1)+(-1)**(i-1)*x(n)
418*3f1979aaSAndroid Build Coastguard Worker 
419*3f1979aaSAndroid Build Coastguard Worker              + the sum from k=2 to k=n-1
420*3f1979aaSAndroid Build Coastguard Worker 
421*3f1979aaSAndroid Build Coastguard Worker                  2*x(k)*cos((k-1)*(i-1)*pi/(n-1))
422*3f1979aaSAndroid Build Coastguard Worker 
423*3f1979aaSAndroid Build Coastguard Worker              a call of cost followed by another call of
424*3f1979aaSAndroid Build Coastguard Worker              cost will multiply the sequence x by 2*(n-1)
425*3f1979aaSAndroid Build Coastguard Worker              hence cost is the unnormalized inverse
426*3f1979aaSAndroid Build Coastguard Worker              of itself.
427*3f1979aaSAndroid Build Coastguard Worker 
428*3f1979aaSAndroid Build Coastguard Worker wsave   contains initialization calculations which must not be
429*3f1979aaSAndroid Build Coastguard Worker         destroyed between calls of cost.
430*3f1979aaSAndroid Build Coastguard Worker 
431*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
432*3f1979aaSAndroid Build Coastguard Worker 
433*3f1979aaSAndroid Build Coastguard Worker subroutine sinqi(n,wsave)
434*3f1979aaSAndroid Build Coastguard Worker 
435*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
436*3f1979aaSAndroid Build Coastguard Worker 
437*3f1979aaSAndroid Build Coastguard Worker subroutine sinqi initializes the array wsave which is used in
438*3f1979aaSAndroid Build Coastguard Worker both sinqf and sinqb. the prime factorization of n together with
439*3f1979aaSAndroid Build Coastguard Worker a tabulation of the trigonometric functions are computed and
440*3f1979aaSAndroid Build Coastguard Worker stored in wsave.
441*3f1979aaSAndroid Build Coastguard Worker 
442*3f1979aaSAndroid Build Coastguard Worker input parameter
443*3f1979aaSAndroid Build Coastguard Worker 
444*3f1979aaSAndroid Build Coastguard Worker n       the length of the sequence to be transformed. the method
445*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n is a product of small primes.
446*3f1979aaSAndroid Build Coastguard Worker 
447*3f1979aaSAndroid Build Coastguard Worker output parameter
448*3f1979aaSAndroid Build Coastguard Worker 
449*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 3*n+15.
450*3f1979aaSAndroid Build Coastguard Worker         the same work array can be used for both sinqf and sinqb
451*3f1979aaSAndroid Build Coastguard Worker         as long as n remains unchanged. different wsave arrays
452*3f1979aaSAndroid Build Coastguard Worker         are required for different values of n. the contents of
453*3f1979aaSAndroid Build Coastguard Worker         wsave must not be changed between calls of sinqf or sinqb.
454*3f1979aaSAndroid Build Coastguard Worker 
455*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
456*3f1979aaSAndroid Build Coastguard Worker 
457*3f1979aaSAndroid Build Coastguard Worker subroutine sinqf(n,x,wsave)
458*3f1979aaSAndroid Build Coastguard Worker 
459*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
460*3f1979aaSAndroid Build Coastguard Worker 
461*3f1979aaSAndroid Build Coastguard Worker subroutine sinqf computes the fast fourier transform of quarter
462*3f1979aaSAndroid Build Coastguard Worker wave data. that is , sinqf computes the coefficients in a sine
463*3f1979aaSAndroid Build Coastguard Worker series representation with only odd wave numbers. the transform
464*3f1979aaSAndroid Build Coastguard Worker is defined below at output parameter x.
465*3f1979aaSAndroid Build Coastguard Worker 
466*3f1979aaSAndroid Build Coastguard Worker sinqb is the unnormalized inverse of sinqf since a call of sinqf
467*3f1979aaSAndroid Build Coastguard Worker followed by a call of sinqb will multiply the input sequence x
468*3f1979aaSAndroid Build Coastguard Worker by 4*n.
469*3f1979aaSAndroid Build Coastguard Worker 
470*3f1979aaSAndroid Build Coastguard Worker the array wsave which is used by subroutine sinqf must be
471*3f1979aaSAndroid Build Coastguard Worker initialized by calling subroutine sinqi(n,wsave).
472*3f1979aaSAndroid Build Coastguard Worker 
473*3f1979aaSAndroid Build Coastguard Worker 
474*3f1979aaSAndroid Build Coastguard Worker input parameters
475*3f1979aaSAndroid Build Coastguard Worker 
476*3f1979aaSAndroid Build Coastguard Worker n       the length of the array x to be transformed.  the method
477*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n is a product of small primes.
478*3f1979aaSAndroid Build Coastguard Worker 
479*3f1979aaSAndroid Build Coastguard Worker x       an array which contains the sequence to be transformed
480*3f1979aaSAndroid Build Coastguard Worker 
481*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 3*n+15.
482*3f1979aaSAndroid Build Coastguard Worker         in the program that calls sinqf. the wsave array must be
483*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine sinqi(n,wsave) and a
484*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
485*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
486*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
487*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
488*3f1979aaSAndroid Build Coastguard Worker 
489*3f1979aaSAndroid Build Coastguard Worker output parameters
490*3f1979aaSAndroid Build Coastguard Worker 
491*3f1979aaSAndroid Build Coastguard Worker x       for i=1,...,n
492*3f1979aaSAndroid Build Coastguard Worker 
493*3f1979aaSAndroid Build Coastguard Worker              x(i) = (-1)**(i-1)*x(n)
494*3f1979aaSAndroid Build Coastguard Worker 
495*3f1979aaSAndroid Build Coastguard Worker                 + the sum from k=1 to k=n-1 of
496*3f1979aaSAndroid Build Coastguard Worker 
497*3f1979aaSAndroid Build Coastguard Worker                 2*x(k)*sin((2*i-1)*k*pi/(2*n))
498*3f1979aaSAndroid Build Coastguard Worker 
499*3f1979aaSAndroid Build Coastguard Worker              a call of sinqf followed by a call of
500*3f1979aaSAndroid Build Coastguard Worker              sinqb will multiply the sequence x by 4*n.
501*3f1979aaSAndroid Build Coastguard Worker              therefore sinqb is the unnormalized inverse
502*3f1979aaSAndroid Build Coastguard Worker              of sinqf.
503*3f1979aaSAndroid Build Coastguard Worker 
504*3f1979aaSAndroid Build Coastguard Worker wsave   contains initialization calculations which must not
505*3f1979aaSAndroid Build Coastguard Worker         be destroyed between calls of sinqf or sinqb.
506*3f1979aaSAndroid Build Coastguard Worker 
507*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
508*3f1979aaSAndroid Build Coastguard Worker 
509*3f1979aaSAndroid Build Coastguard Worker subroutine sinqb(n,x,wsave)
510*3f1979aaSAndroid Build Coastguard Worker 
511*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
512*3f1979aaSAndroid Build Coastguard Worker 
513*3f1979aaSAndroid Build Coastguard Worker subroutine sinqb computes the fast fourier transform of quarter
514*3f1979aaSAndroid Build Coastguard Worker wave data. that is , sinqb computes a sequence from its
515*3f1979aaSAndroid Build Coastguard Worker representation in terms of a sine series with odd wave numbers.
516*3f1979aaSAndroid Build Coastguard Worker the transform is defined below at output parameter x.
517*3f1979aaSAndroid Build Coastguard Worker 
518*3f1979aaSAndroid Build Coastguard Worker sinqf is the unnormalized inverse of sinqb since a call of sinqb
519*3f1979aaSAndroid Build Coastguard Worker followed by a call of sinqf will multiply the input sequence x
520*3f1979aaSAndroid Build Coastguard Worker by 4*n.
521*3f1979aaSAndroid Build Coastguard Worker 
522*3f1979aaSAndroid Build Coastguard Worker the array wsave which is used by subroutine sinqb must be
523*3f1979aaSAndroid Build Coastguard Worker initialized by calling subroutine sinqi(n,wsave).
524*3f1979aaSAndroid Build Coastguard Worker 
525*3f1979aaSAndroid Build Coastguard Worker 
526*3f1979aaSAndroid Build Coastguard Worker input parameters
527*3f1979aaSAndroid Build Coastguard Worker 
528*3f1979aaSAndroid Build Coastguard Worker n       the length of the array x to be transformed.  the method
529*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n is a product of small primes.
530*3f1979aaSAndroid Build Coastguard Worker 
531*3f1979aaSAndroid Build Coastguard Worker x       an array which contains the sequence to be transformed
532*3f1979aaSAndroid Build Coastguard Worker 
533*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 3*n+15.
534*3f1979aaSAndroid Build Coastguard Worker         in the program that calls sinqb. the wsave array must be
535*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine sinqi(n,wsave) and a
536*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
537*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
538*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
539*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
540*3f1979aaSAndroid Build Coastguard Worker 
541*3f1979aaSAndroid Build Coastguard Worker output parameters
542*3f1979aaSAndroid Build Coastguard Worker 
543*3f1979aaSAndroid Build Coastguard Worker x       for i=1,...,n
544*3f1979aaSAndroid Build Coastguard Worker 
545*3f1979aaSAndroid Build Coastguard Worker              x(i)= the sum from k=1 to k=n of
546*3f1979aaSAndroid Build Coastguard Worker 
547*3f1979aaSAndroid Build Coastguard Worker                4*x(k)*sin((2k-1)*i*pi/(2*n))
548*3f1979aaSAndroid Build Coastguard Worker 
549*3f1979aaSAndroid Build Coastguard Worker              a call of sinqb followed by a call of
550*3f1979aaSAndroid Build Coastguard Worker              sinqf will multiply the sequence x by 4*n.
551*3f1979aaSAndroid Build Coastguard Worker              therefore sinqf is the unnormalized inverse
552*3f1979aaSAndroid Build Coastguard Worker              of sinqb.
553*3f1979aaSAndroid Build Coastguard Worker 
554*3f1979aaSAndroid Build Coastguard Worker wsave   contains initialization calculations which must not
555*3f1979aaSAndroid Build Coastguard Worker         be destroyed between calls of sinqb or sinqf.
556*3f1979aaSAndroid Build Coastguard Worker 
557*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
558*3f1979aaSAndroid Build Coastguard Worker 
559*3f1979aaSAndroid Build Coastguard Worker subroutine cosqi(n,wsave)
560*3f1979aaSAndroid Build Coastguard Worker 
561*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
562*3f1979aaSAndroid Build Coastguard Worker 
563*3f1979aaSAndroid Build Coastguard Worker subroutine cosqi initializes the array wsave which is used in
564*3f1979aaSAndroid Build Coastguard Worker both cosqf and cosqb. the prime factorization of n together with
565*3f1979aaSAndroid Build Coastguard Worker a tabulation of the trigonometric functions are computed and
566*3f1979aaSAndroid Build Coastguard Worker stored in wsave.
567*3f1979aaSAndroid Build Coastguard Worker 
568*3f1979aaSAndroid Build Coastguard Worker input parameter
569*3f1979aaSAndroid Build Coastguard Worker 
570*3f1979aaSAndroid Build Coastguard Worker n       the length of the array to be transformed.  the method
571*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n is a product of small primes.
572*3f1979aaSAndroid Build Coastguard Worker 
573*3f1979aaSAndroid Build Coastguard Worker output parameter
574*3f1979aaSAndroid Build Coastguard Worker 
575*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 3*n+15.
576*3f1979aaSAndroid Build Coastguard Worker         the same work array can be used for both cosqf and cosqb
577*3f1979aaSAndroid Build Coastguard Worker         as long as n remains unchanged. different wsave arrays
578*3f1979aaSAndroid Build Coastguard Worker         are required for different values of n. the contents of
579*3f1979aaSAndroid Build Coastguard Worker         wsave must not be changed between calls of cosqf or cosqb.
580*3f1979aaSAndroid Build Coastguard Worker 
581*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
582*3f1979aaSAndroid Build Coastguard Worker 
583*3f1979aaSAndroid Build Coastguard Worker subroutine cosqf(n,x,wsave)
584*3f1979aaSAndroid Build Coastguard Worker 
585*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
586*3f1979aaSAndroid Build Coastguard Worker 
587*3f1979aaSAndroid Build Coastguard Worker subroutine cosqf computes the fast fourier transform of quarter
588*3f1979aaSAndroid Build Coastguard Worker wave data. that is , cosqf computes the coefficients in a cosine
589*3f1979aaSAndroid Build Coastguard Worker series representation with only odd wave numbers. the transform
590*3f1979aaSAndroid Build Coastguard Worker is defined below at output parameter x
591*3f1979aaSAndroid Build Coastguard Worker 
592*3f1979aaSAndroid Build Coastguard Worker cosqf is the unnormalized inverse of cosqb since a call of cosqf
593*3f1979aaSAndroid Build Coastguard Worker followed by a call of cosqb will multiply the input sequence x
594*3f1979aaSAndroid Build Coastguard Worker by 4*n.
595*3f1979aaSAndroid Build Coastguard Worker 
596*3f1979aaSAndroid Build Coastguard Worker the array wsave which is used by subroutine cosqf must be
597*3f1979aaSAndroid Build Coastguard Worker initialized by calling subroutine cosqi(n,wsave).
598*3f1979aaSAndroid Build Coastguard Worker 
599*3f1979aaSAndroid Build Coastguard Worker 
600*3f1979aaSAndroid Build Coastguard Worker input parameters
601*3f1979aaSAndroid Build Coastguard Worker 
602*3f1979aaSAndroid Build Coastguard Worker n       the length of the array x to be transformed.  the method
603*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n is a product of small primes.
604*3f1979aaSAndroid Build Coastguard Worker 
605*3f1979aaSAndroid Build Coastguard Worker x       an array which contains the sequence to be transformed
606*3f1979aaSAndroid Build Coastguard Worker 
607*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 3*n+15
608*3f1979aaSAndroid Build Coastguard Worker         in the program that calls cosqf. the wsave array must be
609*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine cosqi(n,wsave) and a
610*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
611*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
612*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
613*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
614*3f1979aaSAndroid Build Coastguard Worker 
615*3f1979aaSAndroid Build Coastguard Worker output parameters
616*3f1979aaSAndroid Build Coastguard Worker 
617*3f1979aaSAndroid Build Coastguard Worker x       for i=1,...,n
618*3f1979aaSAndroid Build Coastguard Worker 
619*3f1979aaSAndroid Build Coastguard Worker              x(i) = x(1) plus the sum from k=2 to k=n of
620*3f1979aaSAndroid Build Coastguard Worker 
621*3f1979aaSAndroid Build Coastguard Worker                 2*x(k)*cos((2*i-1)*(k-1)*pi/(2*n))
622*3f1979aaSAndroid Build Coastguard Worker 
623*3f1979aaSAndroid Build Coastguard Worker              a call of cosqf followed by a call of
624*3f1979aaSAndroid Build Coastguard Worker              cosqb will multiply the sequence x by 4*n.
625*3f1979aaSAndroid Build Coastguard Worker              therefore cosqb is the unnormalized inverse
626*3f1979aaSAndroid Build Coastguard Worker              of cosqf.
627*3f1979aaSAndroid Build Coastguard Worker 
628*3f1979aaSAndroid Build Coastguard Worker wsave   contains initialization calculations which must not
629*3f1979aaSAndroid Build Coastguard Worker         be destroyed between calls of cosqf or cosqb.
630*3f1979aaSAndroid Build Coastguard Worker 
631*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
632*3f1979aaSAndroid Build Coastguard Worker 
633*3f1979aaSAndroid Build Coastguard Worker subroutine cosqb(n,x,wsave)
634*3f1979aaSAndroid Build Coastguard Worker 
635*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
636*3f1979aaSAndroid Build Coastguard Worker 
637*3f1979aaSAndroid Build Coastguard Worker subroutine cosqb computes the fast fourier transform of quarter
638*3f1979aaSAndroid Build Coastguard Worker wave data. that is , cosqb computes a sequence from its
639*3f1979aaSAndroid Build Coastguard Worker representation in terms of a cosine series with odd wave numbers.
640*3f1979aaSAndroid Build Coastguard Worker the transform is defined below at output parameter x.
641*3f1979aaSAndroid Build Coastguard Worker 
642*3f1979aaSAndroid Build Coastguard Worker cosqb is the unnormalized inverse of cosqf since a call of cosqb
643*3f1979aaSAndroid Build Coastguard Worker followed by a call of cosqf will multiply the input sequence x
644*3f1979aaSAndroid Build Coastguard Worker by 4*n.
645*3f1979aaSAndroid Build Coastguard Worker 
646*3f1979aaSAndroid Build Coastguard Worker the array wsave which is used by subroutine cosqb must be
647*3f1979aaSAndroid Build Coastguard Worker initialized by calling subroutine cosqi(n,wsave).
648*3f1979aaSAndroid Build Coastguard Worker 
649*3f1979aaSAndroid Build Coastguard Worker 
650*3f1979aaSAndroid Build Coastguard Worker input parameters
651*3f1979aaSAndroid Build Coastguard Worker 
652*3f1979aaSAndroid Build Coastguard Worker n       the length of the array x to be transformed.  the method
653*3f1979aaSAndroid Build Coastguard Worker         is most efficient when n is a product of small primes.
654*3f1979aaSAndroid Build Coastguard Worker 
655*3f1979aaSAndroid Build Coastguard Worker x       an array which contains the sequence to be transformed
656*3f1979aaSAndroid Build Coastguard Worker 
657*3f1979aaSAndroid Build Coastguard Worker wsave   a work array that must be dimensioned at least 3*n+15
658*3f1979aaSAndroid Build Coastguard Worker         in the program that calls cosqb. the wsave array must be
659*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine cosqi(n,wsave) and a
660*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
661*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
662*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
663*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
664*3f1979aaSAndroid Build Coastguard Worker 
665*3f1979aaSAndroid Build Coastguard Worker output parameters
666*3f1979aaSAndroid Build Coastguard Worker 
667*3f1979aaSAndroid Build Coastguard Worker x       for i=1,...,n
668*3f1979aaSAndroid Build Coastguard Worker 
669*3f1979aaSAndroid Build Coastguard Worker              x(i)= the sum from k=1 to k=n of
670*3f1979aaSAndroid Build Coastguard Worker 
671*3f1979aaSAndroid Build Coastguard Worker                4*x(k)*cos((2*k-1)*(i-1)*pi/(2*n))
672*3f1979aaSAndroid Build Coastguard Worker 
673*3f1979aaSAndroid Build Coastguard Worker              a call of cosqb followed by a call of
674*3f1979aaSAndroid Build Coastguard Worker              cosqf will multiply the sequence x by 4*n.
675*3f1979aaSAndroid Build Coastguard Worker              therefore cosqf is the unnormalized inverse
676*3f1979aaSAndroid Build Coastguard Worker              of cosqb.
677*3f1979aaSAndroid Build Coastguard Worker 
678*3f1979aaSAndroid Build Coastguard Worker wsave   contains initialization calculations which must not
679*3f1979aaSAndroid Build Coastguard Worker         be destroyed between calls of cosqb or cosqf.
680*3f1979aaSAndroid Build Coastguard Worker 
681*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
682*3f1979aaSAndroid Build Coastguard Worker 
683*3f1979aaSAndroid Build Coastguard Worker subroutine cffti(n,wsave)
684*3f1979aaSAndroid Build Coastguard Worker 
685*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
686*3f1979aaSAndroid Build Coastguard Worker 
687*3f1979aaSAndroid Build Coastguard Worker subroutine cffti initializes the array wsave which is used in
688*3f1979aaSAndroid Build Coastguard Worker both cfftf and cfftb. the prime factorization of n together with
689*3f1979aaSAndroid Build Coastguard Worker a tabulation of the trigonometric functions are computed and
690*3f1979aaSAndroid Build Coastguard Worker stored in wsave.
691*3f1979aaSAndroid Build Coastguard Worker 
692*3f1979aaSAndroid Build Coastguard Worker input parameter
693*3f1979aaSAndroid Build Coastguard Worker 
694*3f1979aaSAndroid Build Coastguard Worker n       the length of the sequence to be transformed
695*3f1979aaSAndroid Build Coastguard Worker 
696*3f1979aaSAndroid Build Coastguard Worker output parameter
697*3f1979aaSAndroid Build Coastguard Worker 
698*3f1979aaSAndroid Build Coastguard Worker wsave   a work array which must be dimensioned at least 4*n+15
699*3f1979aaSAndroid Build Coastguard Worker         the same work array can be used for both cfftf and cfftb
700*3f1979aaSAndroid Build Coastguard Worker         as long as n remains unchanged. different wsave arrays
701*3f1979aaSAndroid Build Coastguard Worker         are required for different values of n. the contents of
702*3f1979aaSAndroid Build Coastguard Worker         wsave must not be changed between calls of cfftf or cfftb.
703*3f1979aaSAndroid Build Coastguard Worker 
704*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
705*3f1979aaSAndroid Build Coastguard Worker 
706*3f1979aaSAndroid Build Coastguard Worker subroutine cfftf(n,c,wsave)
707*3f1979aaSAndroid Build Coastguard Worker 
708*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
709*3f1979aaSAndroid Build Coastguard Worker 
710*3f1979aaSAndroid Build Coastguard Worker subroutine cfftf computes the forward complex discrete fourier
711*3f1979aaSAndroid Build Coastguard Worker transform (the fourier analysis). equivalently , cfftf computes
712*3f1979aaSAndroid Build Coastguard Worker the fourier coefficients of a complex periodic sequence.
713*3f1979aaSAndroid Build Coastguard Worker the transform is defined below at output parameter c.
714*3f1979aaSAndroid Build Coastguard Worker 
715*3f1979aaSAndroid Build Coastguard Worker the transform is not normalized. to obtain a normalized transform
716*3f1979aaSAndroid Build Coastguard Worker the output must be divided by n. otherwise a call of cfftf
717*3f1979aaSAndroid Build Coastguard Worker followed by a call of cfftb will multiply the sequence by n.
718*3f1979aaSAndroid Build Coastguard Worker 
719*3f1979aaSAndroid Build Coastguard Worker the array wsave which is used by subroutine cfftf must be
720*3f1979aaSAndroid Build Coastguard Worker initialized by calling subroutine cffti(n,wsave).
721*3f1979aaSAndroid Build Coastguard Worker 
722*3f1979aaSAndroid Build Coastguard Worker input parameters
723*3f1979aaSAndroid Build Coastguard Worker 
724*3f1979aaSAndroid Build Coastguard Worker 
725*3f1979aaSAndroid Build Coastguard Worker n      the length of the complex sequence c. the method is
726*3f1979aaSAndroid Build Coastguard Worker        more efficient when n is the product of small primes. n
727*3f1979aaSAndroid Build Coastguard Worker 
728*3f1979aaSAndroid Build Coastguard Worker c      a complex array of length n which contains the sequence
729*3f1979aaSAndroid Build Coastguard Worker 
730*3f1979aaSAndroid Build Coastguard Worker wsave   a real work array which must be dimensioned at least 4n+15
731*3f1979aaSAndroid Build Coastguard Worker         in the program that calls cfftf. the wsave array must be
732*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine cffti(n,wsave) and a
733*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
734*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
735*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
736*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
737*3f1979aaSAndroid Build Coastguard Worker         the same wsave array can be used by cfftf and cfftb.
738*3f1979aaSAndroid Build Coastguard Worker 
739*3f1979aaSAndroid Build Coastguard Worker output parameters
740*3f1979aaSAndroid Build Coastguard Worker 
741*3f1979aaSAndroid Build Coastguard Worker c      for j=1,...,n
742*3f1979aaSAndroid Build Coastguard Worker 
743*3f1979aaSAndroid Build Coastguard Worker            c(j)=the sum from k=1,...,n of
744*3f1979aaSAndroid Build Coastguard Worker 
745*3f1979aaSAndroid Build Coastguard Worker                  c(k)*exp(-i*(j-1)*(k-1)*2*pi/n)
746*3f1979aaSAndroid Build Coastguard Worker 
747*3f1979aaSAndroid Build Coastguard Worker                        where i=sqrt(-1)
748*3f1979aaSAndroid Build Coastguard Worker 
749*3f1979aaSAndroid Build Coastguard Worker wsave   contains initialization calculations which must not be
750*3f1979aaSAndroid Build Coastguard Worker         destroyed between calls of subroutine cfftf or cfftb
751*3f1979aaSAndroid Build Coastguard Worker 
752*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
753*3f1979aaSAndroid Build Coastguard Worker 
754*3f1979aaSAndroid Build Coastguard Worker subroutine cfftb(n,c,wsave)
755*3f1979aaSAndroid Build Coastguard Worker 
756*3f1979aaSAndroid Build Coastguard Worker ******************************************************************
757*3f1979aaSAndroid Build Coastguard Worker 
758*3f1979aaSAndroid Build Coastguard Worker subroutine cfftb computes the backward complex discrete fourier
759*3f1979aaSAndroid Build Coastguard Worker transform (the fourier synthesis). equivalently , cfftb computes
760*3f1979aaSAndroid Build Coastguard Worker a complex periodic sequence from its fourier coefficients.
761*3f1979aaSAndroid Build Coastguard Worker the transform is defined below at output parameter c.
762*3f1979aaSAndroid Build Coastguard Worker 
763*3f1979aaSAndroid Build Coastguard Worker a call of cfftf followed by a call of cfftb will multiply the
764*3f1979aaSAndroid Build Coastguard Worker sequence by n.
765*3f1979aaSAndroid Build Coastguard Worker 
766*3f1979aaSAndroid Build Coastguard Worker the array wsave which is used by subroutine cfftb must be
767*3f1979aaSAndroid Build Coastguard Worker initialized by calling subroutine cffti(n,wsave).
768*3f1979aaSAndroid Build Coastguard Worker 
769*3f1979aaSAndroid Build Coastguard Worker input parameters
770*3f1979aaSAndroid Build Coastguard Worker 
771*3f1979aaSAndroid Build Coastguard Worker 
772*3f1979aaSAndroid Build Coastguard Worker n      the length of the complex sequence c. the method is
773*3f1979aaSAndroid Build Coastguard Worker        more efficient when n is the product of small primes.
774*3f1979aaSAndroid Build Coastguard Worker 
775*3f1979aaSAndroid Build Coastguard Worker c      a complex array of length n which contains the sequence
776*3f1979aaSAndroid Build Coastguard Worker 
777*3f1979aaSAndroid Build Coastguard Worker wsave   a real work array which must be dimensioned at least 4n+15
778*3f1979aaSAndroid Build Coastguard Worker         in the program that calls cfftb. the wsave array must be
779*3f1979aaSAndroid Build Coastguard Worker         initialized by calling subroutine cffti(n,wsave) and a
780*3f1979aaSAndroid Build Coastguard Worker         different wsave array must be used for each different
781*3f1979aaSAndroid Build Coastguard Worker         value of n. this initialization does not have to be
782*3f1979aaSAndroid Build Coastguard Worker         repeated so long as n remains unchanged thus subsequent
783*3f1979aaSAndroid Build Coastguard Worker         transforms can be obtained faster than the first.
784*3f1979aaSAndroid Build Coastguard Worker         the same wsave array can be used by cfftf and cfftb.
785*3f1979aaSAndroid Build Coastguard Worker 
786*3f1979aaSAndroid Build Coastguard Worker output parameters
787*3f1979aaSAndroid Build Coastguard Worker 
788*3f1979aaSAndroid Build Coastguard Worker c      for j=1,...,n
789*3f1979aaSAndroid Build Coastguard Worker 
790*3f1979aaSAndroid Build Coastguard Worker            c(j)=the sum from k=1,...,n of
791*3f1979aaSAndroid Build Coastguard Worker 
792*3f1979aaSAndroid Build Coastguard Worker                  c(k)*exp(i*(j-1)*(k-1)*2*pi/n)
793*3f1979aaSAndroid Build Coastguard Worker 
794*3f1979aaSAndroid Build Coastguard Worker                        where i=sqrt(-1)
795*3f1979aaSAndroid Build Coastguard Worker 
796*3f1979aaSAndroid Build Coastguard Worker wsave   contains initialization calculations which must not be
797*3f1979aaSAndroid Build Coastguard Worker         destroyed between calls of subroutine cfftf or cfftb
798*3f1979aaSAndroid Build Coastguard Worker 
799*3f1979aaSAndroid Build Coastguard Worker */
800