You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1016 B
43 lines
1016 B
#include <math.h> |
|
#include <stdlib.h> |
|
#include "fec.h" |
|
|
|
#define MAX_RANDOM 0x7fffffff |
|
|
|
/* Generate gaussian random double with specified mean and std_dev */ |
|
double normal_rand(double mean, double std_dev) |
|
{ |
|
double fac,rsq,v1,v2; |
|
static double gset; |
|
static int iset; |
|
|
|
if(iset){ |
|
/* Already got one */ |
|
iset = 0; |
|
return mean + std_dev*gset; |
|
} |
|
/* Generate two evenly distributed numbers between -1 and +1 |
|
* that are inside the unit circle |
|
*/ |
|
do { |
|
v1 = 2.0 * (double)random() / MAX_RANDOM - 1; |
|
v2 = 2.0 * (double)random() / MAX_RANDOM - 1; |
|
rsq = v1*v1 + v2*v2; |
|
} while(rsq >= 1.0 || rsq == 0.0); |
|
fac = sqrt(-2.0*log(rsq)/rsq); |
|
gset = v1*fac; |
|
iset++; |
|
return mean + std_dev*v2*fac; |
|
} |
|
|
|
unsigned char addnoise(int sym,double amp,double gain,double offset,int clip){ |
|
int sample; |
|
|
|
sample = offset + gain*normal_rand(sym?amp:-amp,1.0); |
|
/* Clip to 8-bit offset range */ |
|
if(sample < 0) |
|
sample = 0; |
|
else if(sample > clip) |
|
sample = clip; |
|
return sample; |
|
}
|
|
|