松翰单片机之滑动平均滤波法

[复制链接]
查看6356 | 回复5 | 2010-4-13 16:18:42 | 显示全部楼层 |阅读模式
1.原理
       把连续取N个采样值看成一个队列
     队列的长度固定为N
       每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
       把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
     N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
2.程序代码
;NAME:                        adc_data_avg
;INPUT:                       
;FUNCTION:                /8
;DESCRIBE:               
;CALL SUBPROGRAM:        NONE
;USING RESOURCE:       
;STACK NEED:                1
;OUTPUT:                wk03wk02
;*********************************************************************************
adc_data_avg:
        b0mov        y,#adc_data_buf$m
        b0mov        z,#adc_data_buf$l
        b0mov        r,#ADC_COUNTER_CONST
       
        clr        wk04
        clr        wk03
        clr        wk02
adc_data_avg20:
        mov        a,@yz                         ;读取一个数据的高字节
        b0mov         wk01,a
        ;inc_yz
        incms        z
        ;nop
        mov        a,@yz                         ;读取一个数据的低字节
        ;inc_yz
        incms        z
        ;nop
       
        add         wk02,a                         ;累加到累加和中               
        b0mov         a,wk01
        adc         wk03,a
        mov        a,#00h
        adc        wk04,a       
        djnz         r,adc_data_avg20        ;累加完全部数据
               
        b0mov        r,#DIV_CONTER
        b0bclr        fc
adc_data_avg30:       
        rrcm        wk04
        rrcm        wk03
        rrcm        wk02
        djnz        r,adc_data_avg30       
;=====================================================================
adc_data_avg40:                                ;数据变化判断
        B0MOV_        wk01,adc_data_back_h
        B0MOV_        wk00,adc_data_back_l
        call        sub_hex2b                ;(FC)(wk01wk00)=(wk03wk02)-(wk01wk00) 1OS 0:NEG
       
        b0mov        a,pflag
        b0mov        r,a
                                        ;数据变化大,则跳
        HEX2B_CJAE wk01,wk00,#00,std_step,adc_data_avg42
adc_data_avg41:                                ;数据稳定
        djnz        data_std_counter,adc_data_avg48       
        clr        data_inc_counter
        clr        data_dec_counter
        mov        a,#01
        b0mov        data_std_counter,a
        jmp        adc_data_avg47
       
adc_data_avg42:
        b0mov        a,r
        b0mov        pflag,a       
        jnc        adc_data_avg44                ;<       
adc_data_avg43:                                ;>数据增大
        incs        data_inc_counter
        ;nop
        cjae        a,#DATA_TRACK_CONTER,adc_data_avg45
        b0mov        data_inc_counter,a
        clr        data_dec_counter
        jmp        adc_data_avg47
       
adc_data_avg44:                                ;<,数据减小
        incs        data_dec_counter
        ;nop
        cjbe        a,#DATA_TRACK_CONTER,adc_data_avg46       
adc_data_avg45:                                ;数据变化OK
        mov        a,#DATA_TRACK_CONTER
        b0mov        data_dec_counter,a
        b0mov        data_inc_counter,a
        b0mov        data_std_counter,a
        jmp        adc_data_avg48
               
adc_data_avg46:
        b0mov        data_dec_counter,a
        clr        data_inc_counter
adc_data_avg47:               
        B0MOV_        wk03,adc_data_back_h
        B0MOV_        wk02,adc_data_back_l
        jmp        adc_data_avg50

adc_data_avg48:
        B0MOV_        adc_data_back_h,wk03
        B0MOV_        adc_data_back_l,wk02

adc_data_avg50:                                ;数据累加,求算术平均
        b0mov        a,wk02
        add        data_avg_l,a
        b0mov        a,wk03
        adc        data_avg_m,a
        mov        a,#00
        adc        data_avg_h,a       
        djnz        data_avg_count,adc_data_avg90
       
        b0mov        r,#02
adc_data_avg51:
        b0bclr        FC
        rrcm        data_avg_h
        rrcm        data_avg_m
        rrcm        data_avg_l       
        djnz        r,adc_data_avg51
       
        B0MOV_        wk03,data_avg_m
        B0MOV_        wk02,data_avg_l
        b0bset        f_data_ok
        call        adc_data_init
adc_data_avg90:       
        ret
       
       


adc_data_init:
        clr        data_avg_h
        clr        data_avg_m
        clr        data_avg_l
        B0MOV_        data_avg_count,#04
        ret
andychencc | 2010-4-14 09:12:00 | 显示全部楼层
高手,转载点资料没事吧
chenlong2010 | 2010-4-15 19:41:16 | 显示全部楼层
有没有C写的例子啊?
simon007 | 2010-4-17 17:40:19 | 显示全部楼层
学习!有没有中值滤波的?
ritammkk | 2010-5-20 21:53:56 | 显示全部楼层
学习啦,谢谢分享
zqy511325 | 2010-6-28 15:52:30 | 显示全部楼层
学习啦,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则