| #define MAX_RANDOM 0x7fffffff |
| /* Generate gaussian random double with specified mean and std_dev */ |
| double normal_rand(double mean, double std_dev) |
| return mean + std_dev*gset; |
| /* Generate two evenly distributed numbers between -1 and +1 |
| * that are inside the unit circle |
| v1 = 2.0 * (double)random() / MAX_RANDOM - 1; |
| v2 = 2.0 * (double)random() / MAX_RANDOM - 1; |
| } while(rsq >= 1.0 || rsq == 0.0); |
| fac = sqrt(-2.0*log(rsq)/rsq); |
| return mean + std_dev*v2*fac; |
| unsigned char addnoise(int sym,double amp,double gain,double offset,int clip){ |
| sample = offset + gain*normal_rand(sym?amp:-amp,1.0); |
| /* Clip to 8-bit offset range */ |