aboutsummaryrefslogtreecommitdiffstats
path: root/sim.c
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2014-01-02 21:55:13 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2014-01-02 21:55:13 +0100
commita31630e0d5b9880c716d9004ef4154396ba41ebc (patch)
treeaebbd3b132e5f2dd31bc34750ccded2378fc687a /sim.c
parent9aaac5be9db5e1537badc65242412ef14c5096e3 (diff)
downloadka9q-fec-a31630e0d5b9880c716d9004ef4154396ba41ebc.tar.gz
ka9q-fec-a31630e0d5b9880c716d9004ef4154396ba41ebc.tar.bz2
ka9q-fec-a31630e0d5b9880c716d9004ef4154396ba41ebc.zip
Extract fec-3.0.1
Diffstat (limited to 'sim.c')
-rw-r--r--sim.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/sim.c b/sim.c
new file mode 100644
index 0000000..151b04c
--- /dev/null
+++ b/sim.c
@@ -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;
+}