[sdiy] Uniformly distributed noise generator?

cheater00 . cheater00 at gmail.com
Sun Jun 16 15:18:49 CEST 2013

Hi Olivier,

On Mon, Jun 10, 2013 at 2:25 PM, Olivier Gillet <ol.gillet at gmail.com> wrote:
> The waveshaper would need to have the shape of the CDF of the gaussian:
> http://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Normal_Distribution_CDF.svg/350px-Normal_Distribution_CDF.svg.png
> which is:
> 0.5 (1 + erf(x / scaling constant))
> Good luck building a circuit for that!

After some reflection, I realize this might not only be the most
prudent way to go, but also the easiest one. An analogue source of
randomness, sampled, put through an LUT, and pushed out a DAC. The
limiting cost here ends up being the AD and DA. If you want say 100
MHz you might run into cost issues on the codecs and on the DSP chip.

To aid the AD's resolution, one could waveshape it via a simple analog
approximation of the CDF's inverse. It's not going to be perfect but
it'll be good enough for the AD to pick up a lot more resolution at
the extreme ends of the voltage range you are wave shaping.

If you add some logic to the LUT, you can have it auto-correct, so
that your noise will be uniformly distributed even if the noise input
isn't exactly uniform.

The LUT approach could make the noise attain a distribution of any
shape you'd like.

This approach uses no advanced mathematics in the DSP - in fact the
digital code is dead simple - and it uses an absolutely trivial source
of true, uncorrelated randomness. I think this is what I have been
looking for.

The simplest circuit is a transistor noise source followed by a tan
shaper and a DSP micro with integrated AD/DA. Do note that the wave
shaper isn't in the form of the Gaussian CDF - in fact, it's in form
of its inverse function. So the shaper you want looks like a tangent
function, rather than a sinusoid. Even with 12-bit input, if you use
interpolation you should be able to get 16-bit output.


More information about the Synth-diy mailing list