搜索
bottom↓
回复: 7

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

[复制链接]

出0入0汤圆

发表于 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编辑过

出0入0汤圆

发表于 2005-11-11 19:10:10 | 显示全部楼层
不错,好贴子

出0入0汤圆

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

uint average(uint arr[10]){

         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);  

}

出0入0汤圆

发表于 2005-12-6 21:26:33 | 显示全部楼层
这个程序应该是出自《AVR单片机应用技术》这本书中的吧,这本书中还有一个8点移动增均值滤波法的程序,不过,我购买这本书的时候,随书没有附带光盘,所以我一时不能将这段程序转贴上来

出0入0汤圆

发表于 2005-12-6 21:28:33 | 显示全部楼层
我觉得这本书还蛮适合初学者的,打算学汇编的初学者可以去购买这本书,我相信一定会让你受益非浅的!

出0入0汤圆

发表于 2005-12-23 19:37:40 | 显示全部楼层
不好意思,看错了,那本书的去极值平均滤波法是单字节的,不是双字节的。

出0入0汤圆

发表于 2014-6-28 14:23:51 | 显示全部楼层
89s53 发表于 2005-11-12 02:20
是“去掉最大值和最小值,取平均数”的意思吗?如果是的话,为什么不用C呢?

uint average(uint arr[10]){

...

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

出0入0汤圆

发表于 2014-6-28 16:08:16 | 显示全部楼层
标记,分享“双字节无符号数去极值平均滤波法子程序”
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 10:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表