[sdiy] Non maximal-length LFSR

Tom Wiltshire tom at electricdruid.net
Thu Mar 3 22:30:10 CET 2016

On 3 Mar 2016, at 20:20, ASSI <Stromeko at nexgo.de> wrote:

> Hi Richie,
> On Thursday 03 March 2016, 19:55:59, Richie Burnett wrote:
>> What my intended algorithm does instead, is implement sixteen identical
>> LFSRs in parallel at the same time using an XOR instruction acting on
>> 16-bit words in a circular buffer.  But these 16 bits aren't 16 bits of
>> one Linear Feedback Shift Register, they are all the same bit but across
>> sixteen different LFSR instances.  This is how I propose to generate the
>> 16-bit words ensuring de-correlation between the bits, by initialising
>> the 16 different shift registers to different initial states.  The taps
>> are currently one bit apart but I can move them anywhere I want.
> You are still using bits from the same sequence (each LFSR, a bitslice of 
> your 48 registers, has the same structure), so you need to carefully 
> initialize the LFSR states to have a large enough distance.  You reduce the 
> correlation length by a factor of 16, which is inconsequential if you keep 
> the sequences the maximum of 2^44 cycles apart, but could have unintended 
> results if they are quite close together.  If you really want just 16 random 
> bits per cycle, one of the pseudo-random generators that are used elsewhere 
> might actually be much less of a headache.  You don't need one that's 
> cryptographically secure, so there are lots of existing examples around.

I've used a linear congruential noise generator that can produce a "random" (ish) word in 2 instructions, but I haven't found anything else that could come close. LFSRs produce a much better output than the LCG, so Richie's tricks for getting that down to two instructions is pushing the performance hard. After all, you can't shave much more off 2 instructions.


More information about the Synth-diy mailing list