分享“双字节无符号数去极值平均滤波法子程序”(汇编)
我刚编的"双字节无符号数去极值平均滤波法子程序"软件模拟通过,与大家分享,也欢迎各位指出不足之处,使之更加完善;========================================================
.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编辑过 不错,好贴子 是“去掉最大值和最小值,取平均数”的意思吗?如果是的话,为什么不用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);
} 这个程序应该是出自《AVR单片机应用技术》这本书中的吧,这本书中还有一个8点移动增均值滤波法的程序,不过,我购买这本书的时候,随书没有附带光盘,所以我一时不能将这段程序转贴上来 我觉得这本书还蛮适合初学者的,打算学汇编的初学者可以去购买这本书,我相信一定会让你受益非浅的! 不好意思,看错了,那本书的去极值平均滤波法是单字节的,不是双字节的。 89s53 发表于 2005-11-12 02:20
是“去掉最大值和最小值,取平均数”的意思吗?如果是的话,为什么不用C呢?
uint average(uint arr){
...
现在有用到这些了,哈哈…… 标记,分享“双字节无符号数去极值平均滤波法子程序”
页:
[1]