lchsh 发表于 2005-11-11 17:04:02

分享“双字节无符号数去极值平均滤波法子程序”(汇编)

我刚编的"双字节无符号数去极值平均滤波法子程序"软件模拟通过,与大家分享,也欢迎各位指出不足之处,使之更加完善



;========================================================

.EQU SAMPLE=$0060                   ;采样数据缓冲区首地址



.DEF CNTER=R16                ;采样数据计数器:要处理的采样双字节数据的个数

.DEF ZERO=R15                ;0寄存器



.DEF SUM3=R14                ;累加和3字节,存放最高8位

.DEF SUM2=R13                ;累加和2字节,存放次高8位

.DEF SUM1=R12                ;累加和1字节,存放次低8位/滤波后采样值高字节

.DEF SUM0=R11                ;累加和0字节,存放最低8位/滤波后采样值低字节



.DEF TMP1=R10                ;暂存寄存器1

.DEF TMP0=R9                ;暂存寄存器0



.DEF MAXH=R8                ;最大值寄存器高字节

.DEF MAXL=R7                ;最大值寄存器低字节

.DEF MINH=R6                ;最小值寄存器高字节

.DEF MINL=R5                ;最小值寄存器低字节

;===============================================

FILT16U:       

                LDI ZL,LOW(SAMPLE)                ;Z指向采样数据缓冲区首地址低字节

                LDI ZH,HIGH(SAMPLE)                ;Z指向采样数据缓冲区首地址高字节

                LDI CNTER,6                                ;设置采样字节的数目:6个采样值

                CLR ZERO                                ;0寄存器内容为0



                CLR SUM3                                ;累加和初值为0

                CLR SUM2                               

                CLR SUM1

                CLR SUM0



                LD MAXL,Z+                                ;最大初值与最小初值相等

                LD MAXH,Z

                DEC ZL

                LD MINL,Z+

                LD MINH,Z                               

                DEC ZL



LOOP:                   LD TMP0,Z+                                ;读采样值,Z<--Z+1

                LD TMP1,Z+



                ADD SUM0,TMP0                        ;求累加和

                ADC SUM1,TMP1                        ;求累加和

                ADC SUM2,ZERO

                ADC SUM3,ZERO



;比较出最大值存入MAXH/MAXL

                CP MAXH,TMP1                        ;将TMP中的采样值与MAX比较

                BRLO NEWMAX                                ;若MAXH<TMP1,则MAX<TMP,则跳转到NEWMAX:更新MAXH/MAXL

               

                CP MAXH,TMP1                        ;在MAXH>=TMP1的情况下,再比较MAXH与TMP1是否相等

                BRNE COMPMIN                                ;若MAXH/=TMP1即MAXH>TMP1,则不需要调整,跳转到CNT

                               

                CP MAXL,TMP0                        ;若MAXH=TMP1,则再比较低字节:MAXL,TMP0

                BRLO NEWMAX                                ;若MAXL<TMP0,则MAX<TMP,则跳转到NEWMAX:更新MAXH、MAXL

                RJMP COMPMIN                                ;若MAXL>=TMP0,则MAX>=TMP,则不需要调整,跳转到CNT

               

NEWMAX:        MOV MAXH,TMP1                        ;更换最大值

                MOV MAXL,TMP0

;                RJMP COMPMIN



;比较出最小值存入MINH/MINL

COMPMIN:

                CP MINH,TMP1                        ;比较MINH,TMP1;

                BRLO CNT                                ;若MINH<TMP1,即MIN<TMP,则不须调整,跳转至CNT



                CP MINH,TMP1                        ;若MINH>=TMP1,再比较MINH与TMP1是否相等

                BRNE NEWMIN                                ;若MINH/=TMP1,即MINH>TMP1,即MIN>TMP,则跳转到NEWMIN:更新MINH/MINL



                CP MINL,TMP0                        ;若MINH=TMP1,则再比较低字节

                BRLO CNT

                RJMP NEWMIN       



NEWMIN:                   MOV MINH,TMP1                        ;更换最小值

                MOV MINL,TMP0

;                RJMP CNT



CNT:                   DEC CNTER

                BRNE LOOP



                SUB SUM0,MAXL                        ;减掉最大值

                SBC SUM1,MAXH

                SBC SUM2,ZERO

;                SBC SUM3,ZERO



                SUB SUM0,MINL                        ;减掉最小值

                SBC SUM1,MINH

                SBC SUM2,ZERO

;                SBC SUM3,ZERO



                LSR SUM3                                ;累加和除以2

                ROR SUM2

                ROR SUM1

                ROR SUM0



                LSR SUM3                                ;累加和除以2

                ROR SUM2

                ROR SUM1

                ROR SUM0



                RET

-----此内容被lchsh于2005-11-11,17:09:57编辑过

wen2005 发表于 2005-11-11 19:10:10

不错,好贴子

89s53 发表于 2005-11-12 02:20:52

是“去掉最大值和最小值,取平均数”的意思吗?如果是的话,为什么不用C呢?

uint average(uint arr){

       uchar i;

       uint temp,max=0,min=0;       

       for(i=0;i<10;i++){

                  if(max<arr){

                      {max=arr;}               

                  }

                  else if(min>arr){

                      {min=arr;}               

                  }

                  temp+=arr;       

       }

       temp=(temp-max-min)/8;

       return (temp);

}

sonic 发表于 2005-12-6 21:26:33

这个程序应该是出自《AVR单片机应用技术》这本书中的吧,这本书中还有一个8点移动增均值滤波法的程序,不过,我购买这本书的时候,随书没有附带光盘,所以我一时不能将这段程序转贴上来

sonic 发表于 2005-12-6 21:28:33

我觉得这本书还蛮适合初学者的,打算学汇编的初学者可以去购买这本书,我相信一定会让你受益非浅的!

sonic 发表于 2005-12-23 19:37:40

不好意思,看错了,那本书的去极值平均滤波法是单字节的,不是双字节的。

xintao 发表于 2014-6-28 14:23:51

89s53 发表于 2005-11-12 02:20
是“去掉最大值和最小值,取平均数”的意思吗?如果是的话,为什么不用C呢?

uint average(uint arr){

...

现在有用到这些了,哈哈……

BrightWang 发表于 2014-6-28 16:08:16

标记,分享“双字节无符号数去极值平均滤波法子程序”
页: [1]
查看完整版本: 分享“双字节无符号数去极值平均滤波法子程序”(汇编)