Mercurial > audlegacy
view src/libSAD/noicegen.c @ 4876:85e71772af79
Credit Carlo Bramini for patching in bug #47.
author | Tony Vroon <chainsaw@gentoo.org> |
---|---|
date | Tue, 28 Apr 2009 23:00:58 +0100 |
parents | bb0638143fc8 |
children |
line wrap: on
line source
#include <stdio.h> #include <assert.h> #include "../../config.h" #ifdef HAVE_SSE2 # define SSE2 1 #endif #ifdef HAVE_ALTIVEC # define ALTIVEC 1 #endif #define MEXP 19937 #include "SFMT.h" #include "SFMT.c" #include "noicegen.h" #include "debug.h" int triangular_dither_noise(int nbits) { // parameter nbits : the peak-to-peak amplitude desired (in bits) // use with nbits set to 2 + nber of bits to be trimmed. // (because triangular is made from two uniformly distributed processes, // it starts at 2 bits peak-to-peak amplitude) // see The Theory of Dithered Quantization by Robert Alexander Wannamaker // for complete proof of why that's optimal int v = (gen_rand32() / 2 - gen_rand32() / 2); // in ]-2^31, 2^31[ //int signe = (v>0) ? 1 : -1; int P = 1 << (32 - nbits); // the power of 2 v /= P; // now v in ]-2^(nbits-1), 2^(nbits-1) [ return v; } double triangular_dither_noise_f() { // Сonditionally assume we have 16 bits in fractional part // Please, check it thoroughly: is this assumption correct in floatin-point arithmetic? return (double) triangular_dither_noise(17) / 65536.0; } void noicegen_init_rand(uint32_t seed) { init_gen_rand(seed); }