mirror of
https://git.vladimir.cc/vladimir/libfec.git
synced 2026-08-25 17:27:34 +00:00
init commit
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user