# include # include # include # include # include "cosine_transform.h" /******************************************************************************/ double *r8vec_uniform_01_new ( int n, int *seed ) /******************************************************************************/ /* Purpose: R8VEC_UNIFORM_01_NEW returns a unit pseudorandom R8VEC. Discussion: This routine implements the recursion seed = 16807 * seed mod ( 2^31 - 1 ) unif = seed / ( 2^31 - 1 ) The integer arithmetic never requires more than 32 bits, including a sign bit. Licensing: This code is distributed under the MIT license. Modified: 19 August 2004 Author: John Burkardt Reference: Paul Bratley, Bennett Fox, Linus Schrage, A Guide to Simulation, Second Edition, Springer, 1987, ISBN: 0387964673, LC: QA76.9.C65.B73. Bennett Fox, Algorithm 647: Implementation and Relative Efficiency of Quasirandom Sequence Generators, ACM Transactions on Mathematical Software, Volume 12, Number 4, December 1986, pages 362-376. Pierre L'Ecuyer, Random Number Generation, in Handbook of Simulation, edited by Jerry Banks, Wiley, 1998, ISBN: 0471134031, LC: T57.62.H37. Peter Lewis, Allen Goodman, James Miller, A Pseudo-Random Number Generator for the System/360, IBM Systems Journal, Volume 8, Number 2, 1969, pages 136-143. Parameters: Input, int N, the number of entries in the vector. Input/output, int *SEED, a seed for the random number generator. Output, double R8VEC_UNIFORM_01_NEW[N], the vector of pseudorandom values. */ { int i; int i4_huge = 2147483647; int k; double *r; if ( *seed == 0 ) { fprintf ( stderr, "\n" ); fprintf ( stderr, "R8VEC_UNIFORM_01_NEW - Fatal error!\n" ); fprintf ( stderr, " Input value of SEED = 0.\n" ); exit ( 1 ); } r = ( double * ) malloc ( n * sizeof ( double ) ); for ( i = 0; i < n; i++ ) { k = *seed / 127773; *seed = 16807 * ( *seed - k * 127773 ) - k * 2836; if ( *seed < 0 ) { *seed = *seed + i4_huge; } r[i] = ( double ) ( *seed ) * 4.656612875E-10; } return r; } /******************************************************************************/ double *cosine_transform_data ( int n, double d[] ) /******************************************************************************/ /* Purpose: COSINE_TRANSFORM_DATA does a cosine transform on a vector of data. Licensing: This code is distributed under the MIT license. Modified: 26 August 2015 Author: John Burkardt Parameters: Input, integer N, the number of data points. Input, double D[N], the vector of data. Output, double COSINE_TRANSFORM_DATA[N], the transform coefficients. */ { double angle; double *c; int i; int j; const double r8_pi = 3.141592653589793; c = ( double * ) malloc ( n * sizeof ( double ) ); for ( i = 0; i < n; i++ ) { c[i] = 0.0; for ( j = 0; j < n; j++ ) { angle = r8_pi * ( double ) ( i * ( 2 * j + 1 ) ) / ( double ) ( 2 * n ); c[i] = c[i] + cos ( angle ) * d[j]; } c[i] = c[i] * sqrt ( 2.0 / ( double ) ( n ) ); } return c; } /******************************************************************************/ double *cosine_transform_inverse ( int n, double c[] ) /******************************************************************************/ /* Purpose: COSINE_TRANSFORM_INVERSE does an inverse cosine transform. Licensing: This code is distributed under the MIT license. Modified: 27 August 2015 Author: John Burkardt Parameters: Input, integer N, the number of data points. Input, double C[N], the vector of transform coefficients Output, double COSINE_TRANSFORM_INVERSE[N], the original data. */ { double angle; double *d; int i; int j; double r8_pi = 3.141592653589793; d = ( double * ) malloc ( n * sizeof ( double ) ); for ( i = 0; i < n; i++ ) { d[i] = c[0] / 2.0; for ( j = 1; j < n; j++ ) { angle = r8_pi * ( double ) ( ( 2 * i + 1 ) * j ) / ( double ) ( 2 * n ); d[i] = d[i] + cos ( angle ) * c[j]; } d[i] = d[i] * sqrt ( 2.0 / ( double ) ( n ) ); } return d; } /******************************************************************************/ void timestamp ( ) /******************************************************************************/ /* Purpose: TIMESTAMP prints the current YMDHMS date as a time stamp. Example: 31 May 2001 09:45:54 AM Licensing: This code is distributed under the MIT license. Modified: 24 September 2003 Author: John Burkardt Parameters: None */ { # define TIME_SIZE 40 static char time_buffer[TIME_SIZE]; const struct tm *tm; time_t now; now = time ( NULL ); tm = localtime ( &now ); strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm ); fprintf ( stdout, "%s\n", time_buffer ); return; # undef TIME_SIZE }