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