[PD] FWIW: Box Muller Gaussian noise

Atwood, Robert C r.atwood at imperial.ac.uk
Mon Mar 17 17:49:16 CET 2008


 
FWIW here's a C subroutine with a little 'main' routine for testing, I
did a few years ago for the Box Muller method, pretty much directly
based upon what I read in Numerical Recipes. The text of the section in
Num.Recip. Is a very clear explanation of it , I find , your mileage may
vary! 



      1 #include <math.h>
      2 #include <stdio.h>
      3 #include "machine.h" <---- just neds to choose datatype CA_FLOAT
as double or float or other real-type value
                             <----- and define LOG accordingly... Can be
gotten rid of with some small edits.
      4
      5 /*
      6    BOX-MULLER routine for returning a random number normally
distributed
      7    about a mean of zero, with a standard deviation of 1. Adapted
from Numerical Recipes in C by Press and Flannery.
      8 */
      9
     10 CA_FLOAT box_muller ()
     11 {
     12   static int flag = 0;
     13   static CA_FLOAT gset = 0;
     14   CA_FLOAT v1, v2, fac, gdev, r;
     15
     16   if (!flag) {
     17     do {
     18       v1 = 2 * drand48 () - 1;
     19       v2 = 2 * drand48 () - 1;
     20       r = v1 * v1 + v2 * v2;
     21     } while (r >= 1 || r == 0);
     22     fac = sqrt ((-2 * LOG (r) / r));
     23     gset = v1 * fac;
     24     gdev = v2 * fac;
     25     flag = 1;
     26   } else {
     27     gdev = gset;
     28     flag = 0;
     29   }
     30   return (gdev);
     31 }                               /* end of box_muller */
     32
     33 /* return gaussian devates for a given mean and standard
deviation */
     34 /* by calling the box_muller routine. */
     35
     36 CA_FLOAT gaussdev (CA_FLOAT * params)
     37 {
     38   CA_FLOAT stdev;
     39   CA_FLOAT mean;
     40
     41   if (params == NULL || (params + 1) == NULL) {
     42     fprintf (stderr, "ERROR: gaussdev: You messed up, NULL
pointer here.\n");
     43     exit (1);
     44   }
     45
     46   mean = params[0];
     47   stdev = params[1];
     48   return ((stdev * box_muller ()) + mean);
     49 }
     50
     51 #ifdef TEST_BOX_MULLER
     52 void main ()
     53 {
     54   int i;
     55   CA_FLOAT stdev = 2;
     56   CA_FLOAT mean = 10;
     57   CA_FLOAT params[2];
     58
     59   params[0] = mean; 
     60   params[1] = stdev;
     61   for (i = 0; i < 10000; i++) {
     62     printf ("%.5g\n", gaussdev (params));
     63   }
     64
     65 }
     66 #endif
     67
    
> -----Original Message-----
> From: pd-list-bounces at iem.at [mailto:pd-list-bounces at iem.at] 
> On Behalf Of Andy Farnell
> Sent: 16 March 2008 15:31
> To: pd-list at iem.at
> Subject: [PD] Box Muller Gaussian noise
> 
> Could a stats mathematician please help me check this. (attached) 
> 
> I'm following the Box Muller formula for getting  a cheap Gaussian 
> distribution (instead of adding up 12 sources a la central 
> limit method).
> 
> http://www.dspguru.com/howto/tech/wgn.htm
> 
> Does this look right?
> 
> Also, I have no idea how to check the distribution. It sounds 
> the same as
> uniform noise and looks the same in the spectrograph? What gives?
> Do I need to average over a very long time or something to see any
> difference?
> 
> Cheers all,
> 
> Andy
> 
> -- 
> Use the source
> 




More information about the Pd-list mailing list