We choose to go to the moon. We choose to go to the moon in this decade and do the other things, not because they are easy, but because they are hard, because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone, and one which we intend to win, and the others, too.
            John F. Kennedy
Name:  AvgReject.JPG
Views: 2903
Size:  196.7 KB

Notice in the image that all spurious samples were rejected.
And where the samples changed from 6798 to 3899, the average caught up after 2 samples (adjustable with a constant).
Code:
DEFINE OSC 20

DEFINE LCD_DREG PORTB 'LCD data port 
DEFINE LCD_DBIT 0 'LCD data starting bit 0 or 4 
DEFINE LCD_RSREG PORTB 'LCD register select port 
DEFINE LCD_RSBIT 4 'LCD register select bit 
DEFINE LCD_EREG PORTB 'LCD enable port 
DEFINE LCD_EBIT 5 'LCD enable bit 
DEFINE LCD_BITS 4 'LCD bus size 4 or 8 
DEFINE LCD_LINES 2 'Number lines on LCD 
DEFINE LCD_COMMANDUS 2000 'Command delay time in us 
DEFINE LCD_DATAUS 50 'Data delay time in us 

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 129 ' 9600 Baud @ 20MHz, 0.16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

'----[Averaging Options]------------------------------------------------------------------
AvgCount	CON  16		' Number of samples to average
FAspread	CON  50 	' Fast Average threshold +/-
Reject          CON  2          ' Spurious Rejection level

;----[Variables]--------------------------------------------------------------------------
Value		VAR  WORD
RejCount        VAR  BYTE
ADavg		VAR  WORD

;----[Initialize]-------------------------------------------------------------------------
RejCount = 0
ADavg = 0

;----[Main Program Loop]------------------------------------------------------------------
Main:
    HSERIN [wait($FF),DEC Value]                                   ; get a sample
    HSEROUT ["Smpl= ",DEC Value]
    LCDOUT $FE,$80,"Smpl= ",DEC Value,"    "
    GOSUB Average                                                  ; average it
    HSEROUT ["  Avg= ",DEC ADavg] ;   ,"  Avg2= ",DEC ADavg2,13,10]
    IF RejCount > 0 THEN HSEROUT ["  Rejected"]                    ; indicate if rejected
    HSEROUT [13,10]
    LCDOUT $FE,$C0,"Avg = ",DEC Value,"    "
    LCDOUT $FE,$94,"FC  = ",DEC RejCount,"    "
GOTO Main

' -=-=-=-=-=-=  Average Sample values -=-=-=-=-=-=-=-=-=-=
Average:
    IF Value = ADavg Then RejCount = 0 : RETURN  ; NoChange
    IF ABS (Value - ADavg) > FAspread OR Value < AvgCount Then FastAvg
    IF ABS (Value - ADavg) < AvgCount Then RealClose
    ADavg = ADavg - (ADavg/AvgCount)
    ADavg = ADavg + (Value/AvgCount)
    RejCount = 0
    GoTo AVGok
  FastAvg:
    RejCount = RejCount + 1
    IF RejCount = Reject + 1 THEN 
        ADavg = Value
        RejCount = 0
    ENDIF
    GoTo AVGok
  RealClose:
    RejCount = 0
    ADavg = ADavg - (ADavg/(AvgCount/4))
    ADavg = ADavg + (Value/(AvgCount/4))
  AVGok:
    Value = ADavg			' Put Average back into Value
  NoChange:
Return