[sdiy] LFSR digital noise source

Jay Schwichtenberg jschwich53 at comcast.net
Mon Nov 11 21:16:57 CET 2019

Very true while most transistors will work there can be a big difference 
between types (2N3904, 2N2222) and some difference between transistors 
of the same type. Some working better than others.

One thing on the CD4006 is that it is an 18 bit shift register so you 
will probably be getting a noticeable repeating pattern depending on the 
clock rate. Using a number of CD4015s to get a larger shift register and 
clocking it faster will give better results.

As far as taps go for different lengths of shift registers this is a 
good reference. Keep in mind these are XNOR gates.


If you want to do reading on noise one of our gurus Bernie Hutchins has 
a lot of great information on his web site. Check out EN76 and AN402 for 
sure but if you want more info AN378, AN384, AN412 and AN415.


If you want to implement a micro based LFSR it does not take much of a 
processor. All you need is a unit that has a timer to clock the LFSR , a 
bit or RAM, some flash memory and a 32 bit processor is nice but not 
mandatory. If you want to add options like filtering or DACs then you 
might need some more memory and peripherals.

Here's my go to code for a 32 bit LFSR which I run on 32 bit processors. 
If you have an 8 bit processor you may not need any changes, it depends 
on the compiler and libraries that are available for the chip. Think of 
the XOR option as being a form of even/odd parity and it makes things 
easier. For just a noise source I setup a timer interrupt that goes off 
at a fairly high rate (20KHz -> 100KHz) which outputs a bit and then 
calculates the next cycle. Notice that I output the bit first. That will 
give you more consistent timing then calculating which timing may very a 
small bit and then outputting. After that there is some form of analog 
filtering, typically F/5.

#define LFSR_BIT_32 (((uint32_t) 0x00000001) << 31)
#define LFSR_BIT_22 (((uint32_t) 0x00000001) << 21)
#define LFSR_BIT_02 (((uint32_t) 0x00000001) << 1)
#define LFSR_BIT_01 ((uint32_t) 0x00000001)

uint32_t lfsrCalcSum(
     uint32_t        lfsrValue
     register uint32_t   lfsrReturn;
     register uint32_t   sum;

     lfsrReturn = lfsrValue;

     sum = 0;

     if ( LFSR_BIT_32 & lfsrReturn ) sum++;
     if ( LFSR_BIT_22 & lfsrReturn ) sum++;
     if ( LFSR_BIT_02 & lfsrReturn ) sum++;
     if ( LFSR_BIT_01 & lfsrReturn ) sum++;

     lfsrReturn = (lfsrReturn << 1) | (sum & (uint32_t) 0x0000001);

     return( lfsrReturn );

Best wishes.
Jay S

On 11/11/2019 3:54 AM, René Schmitz wrote:
> Hi David,
> On 11.11.2019 08:38, David G Dixon wrote:
>> I've built quite a few analog white noise sources, and I've never 
>> selected
>> transistors, and they've always worked perfectly.  Not sure why.  Have I
>> just been lucky, or is it actually pretty idiot-proof?
> I would say, try out a few different transistors in the same circuit, 
> and see and hear for yourself. Yes, they will work. The definition of 
> "perfectly" may vary though. :)
> Best,
>  René
> -- 
> synth at schmitzbits.de
> http://schmitzbits.de
> _______________________________________________
> Synth-diy mailing list
> Synth-diy at synth-diy.org
> http://synth-diy.org/mailman/listinfo/synth-diy

More information about the Synth-diy mailing list