summaryrefslogtreecommitdiff
path: root/vpx_dsp/add_noise.c
diff options
context:
space:
mode:
Diffstat (limited to 'vpx_dsp/add_noise.c')
-rw-r--r--vpx_dsp/add_noise.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/vpx_dsp/add_noise.c b/vpx_dsp/add_noise.c
index 682b44419..baede2850 100644
--- a/vpx_dsp/add_noise.c
+++ b/vpx_dsp/add_noise.c
@@ -8,6 +8,7 @@
* be found in the AUTHORS file in the root of the source tree.
*/
+#include <math.h>
#include <stdlib.h>
#include "./vpx_config.h"
@@ -38,3 +39,37 @@ void vpx_plane_add_noise_c(uint8_t *start, char *noise,
}
}
}
+
+static double gaussian(double sigma, double mu, double x) {
+ return 1 / (sigma * sqrt(2.0 * 3.14159265)) *
+ (exp(-(x - mu) * (x - mu) / (2 * sigma * sigma)));
+}
+
+int vpx_setup_noise(int size, double sigma, char *noise) {
+ char char_dist[256];
+ int next, i, j;
+
+ next = 0;
+
+ // set up a 256 entry lookup that matches gaussian distribution
+ for (i = -32; i < 32; i++) {
+ int a_i = (int) (0.5 + 256 * gaussian(sigma, 0, i));
+ if (a_i) {
+ for (j = 0; j < a_i; j++) {
+ char_dist[next + j] = (char) (i);
+ }
+ next = next + j;
+ }
+ }
+
+ // Rounding error - might mean we have less than 256.
+ for (; next < 256; next++)
+ char_dist[next] = 0;
+
+ for (i = 0; i < size; i++) {
+ noise[i] = char_dist[rand() & 0xff]; // NOLINT
+ }
+
+ // Returns the highest non 0 value used in distribution.
+ return -char_dist[0];
+}