All pastes #386445 Raw Edit

Someone

public cpp v1 · immutable
·published 2007-03-08 16:45 UTC
rendered paste body
#include "pa_dither.h"#include "pa_types.h"#define PA_DITHER_BITS_   (15)void PaUtil_InitializeTriangularDitherState( PaUtilTriangularDitherGenerator *state ){    state->previous = 0;    state->randSeed1 = 22222;    state->randSeed2 = 5555555;}signed long PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerator *state ){    signed long current, highPass;    /* Generate two random numbers. */    state->randSeed1 = (state->randSeed1 * 196314165) + 907633515;    state->randSeed2 = (state->randSeed2 * 196314165) + 907633515;    /* Generate triangular distribution about 0.     * Shift before adding to prevent overflow which would skew the distribution.     * Also shift an extra bit for the high pass filter.      */#define DITHER_SHIFT_  ((SIZEOF_LONG*8 - PA_DITHER_BITS_) + 1)    current = (((signed long)state->randSeed1)>>DITHER_SHIFT_) +              (((signed long)state->randSeed2)>>DITHER_SHIFT_);    /* High pass filter to reduce audibility. */    highPass = current - state->previous;    state->previous = current;    return highPass;}/* Multiply by PA_FLOAT_DITHER_SCALE_ to get a float between -2.0 and +1.99999 */#define PA_FLOAT_DITHER_SCALE_  (1.0f / ((1<<PA_DITHER_BITS_)-1))static const float const_float_dither_scale_ = PA_FLOAT_DITHER_SCALE_;float PaUtil_GenerateFloatTriangularDither( PaUtilTriangularDitherGenerator *state ){    signed long current, highPass;    /* Generate two random numbers. */    state->randSeed1 = (state->randSeed1 * 196314165) + 907633515;    state->randSeed2 = (state->randSeed2 * 196314165) + 907633515;    /* Generate triangular distribution about 0.     * Shift before adding to prevent overflow which would skew the distribution.     * Also shift an extra bit for the high pass filter.      */#define DITHER_SHIFT_  ((SIZEOF_LONG*8 - PA_DITHER_BITS_) + 1)    current = (((signed long)state->randSeed1)>>DITHER_SHIFT_) +              (((signed long)state->randSeed2)>>DITHER_SHIFT_);    /* High pass filter to reduce audibility. */    highPass = current - state->previous;    state->previous = current;    return ((float)highPass) * const_float_dither_scale_;}