;*******************************************************************
;
; Random Number Generator
;
; This routine generates a 16 Bit Pseudo Sequence Random Generator
; It is based on Linear shift register feedback. The sequence
; is generated by (Q15 xorwf Q14 xorwf Q12 xorwf Q3 )
;
; The 16 bit random number is in location RandHi(high byte)
; & RandLo (low byte)
;
; Before calling this routine, make sure the initial values
; of RandHi & RandLo are NOT ZERO
; A good chiose of initial random number is 0x3045
;*******************************************************************
;
Random16
rlcf RandHi,W
rlcf WREG, F ; carry bit = xorwf(Q15,14)
;
swapf RandHi, F
swapf RandLo,W
rlncf WREG, F
xorwf RandHi,W ; LSB = xorwf(Q12,Q3)
swapf RandHi, F
andlw 0x01
rlcf RandLo, F
xorwf RandLo, F
rlcf RandHi, F
return
;
PAGE
;*******************************************************************
; Gaussian Noise Generator
;
; This routine generates a 16 Bit Gaussian distributed random
; points. This routine calls the routine “Random16”, which
; generates a psuedo random noise sequence. Gaussian noise
; is computed using the CENTRAL LIMIT THEOREM.
; The Central Limit Theorem states that the average weighted
; sum of uncorelated samples tends to have a Gaussian distribution
; For practical purposes, the sum could be over a sample size
; of 32 Random numbers. Better results could result if a larger
; sample size is desired. For faster results, a sum over 16 samples
; would also be adequate ( say, for applications like Speech synthesis,
; channel simulations, etc).
;
; The 16 bit Gaussian distributed point is in locations
; GaussHi & GaussLo
;
; Before calling this routine, the initial seed of Random
; number should be NON ZERO ( refer to notes on “Random16” routine
;
;*******************************************************************
;
Gauss
clrf count, F
bsf count,5 ; set Sample size = 32
clrf GaussLo, F
clrf GaussHi, F
clrf GaussTmp, F
;
NextGauss
call Random16 ; get a random value
movfp RandLo,WREG
addwf GaussLo, F
addwfc GaussHi, F
clrf WREG, F
addwfc GaussTmp, F
decfsz count, F
goto NextGauss ; sum 16 random numbers
;
movlw 5
GaussDiv16
rrcf GaussTmp, F
rrcf GaussHi, F
rrcf GaussLo, F ; weghted average
decfsz WREG, F ; divide by 32
goto GaussDiv16
;
return
;
END ; End Of arith.asm