diff options
Diffstat (limited to 'vpx_dsp/add_noise.c')
-rw-r--r-- | vpx_dsp/add_noise.c | 35 |
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]; +} |