ARM实验-数字滤波

一、实验名称:数字滤波

二、实验目的:

  1. 通过工程中常用的数字滤波编程实现,验培养学生分析问题、解决问题能力。
  2. 通过该编程,进一步巩固和强化学生ARM汇编编程的能力。

三、实验原理:

(1)中值滤波

数字图像在其形成、传输记录的过程中往往会受到很多噪声的的污染,比如:椒盐噪声、高斯噪声等,为了抑制和消除这些随即产生的噪声而改善图像的质量,就需要去、对图像进行去滤波噪处理。

中值滤波是图像平滑的一种方法 它是一种非线性平滑滤波技术,在一定条件下可以克服线性滤波带来的图像细节的模糊问题,特别是针对被椒盐噪声污染的图像。中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中值滤波方法一经提出后,便在数字信号处理领得到重要的应用。

中值滤波方法:对一个数字信号序列xj(-∞<j<∞)进行滤波处理时,首先要定义一个长度为奇数的L长窗口,L=2N+1,N为正整数。设在某一个时刻,窗口内的信号样本为x(i-N),…,x(i),…,x(i+N),其中x(i)为位于窗口中心的信号样本值。对这L个信号样本值按从小到大的顺序排列后,其中值,在i处的样值,便定义为中值滤波的输出值。

(2)均值滤波

均值滤波也用于图像处理,均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=∑f(x,y)/m m为该模板中包含当前像素在内的像素总个数。

本事实验要求,将 N 个无符号数进行排序,去掉最大值和最小值,剩余的数求平均值,平均值即为本次滤波所得的结果。

四、实验要求

(1)中值滤波及编程实验,要求如下:

  • 关于 N(N为奇数)个数的值在程序中能任意、方便设置,并且放在 R0 中;
  • 原始数据放在内存 0X40000000 开始的地址空间;
  • 中值滤波的结果放在寄存器 R1 中;

(2)均值滤波编程实验,要求如下:

  • 关于 N(N为偶数)个数的值在程序中能任意、方便设置,如 4、6、10、18 等,该值放在 R0 中;
  • 原始数据放在内存中 0X40000000 开始的地址空间;
  • 均值滤波的结果放在寄存器 R1 中;

五、实验器材(设备、元器件):

        1.PC机一台;

        2.Keil MDK-ARM uVision4开发工具。

六、实验步骤:

        1.打开Keil MDK-ARM uVision4开发工具;

        2.新建一个工程文件;

        3.在新建的工程文件中,添加新的源程序文件

        4.编写代码

        5.选择“Build target”菜单对编写好的工程文件进行编译链接。

        6.点击““Start/Stop Debug Section””按键,对程序进行跟踪调试,在调试界面,单步执行,对CPU各寄存器的值的变化、以及相关内存的变化进行分析比较,判断程序的执行是否符合预期要求。

七、代码实现

(1).中值滤波程序代码如下所示:

AREA midfilter,CODE,READONLY
	ENTRY
	MOV R0,#5	 	;要排序个数
	MOV R9,R0
	LDR R1,=0x40000000
	LDR R2,=INIT
LOOP	 			;数据初始化
	LDR R3,[R2],#4
	STR R3,[R1],#4
	SUBS R9,R9,#1
	BNE LOOP	
	MOV R9,R0
	SUB R9,R9,#1
OUTLOOP	   	;冒泡排序
	MOV R4,#0 
	LDR R1,=0x40000000
INNERLOOP
	LDRB R5,[R1],#4  ;取操作数
	LDRB R6,[R1]	  ;取下一个操作数	
	CMP R5,R6
	STRHI R6,[R1,#-4]	;R5操作数小于R6操作数时进行交换
	STRHI R5,[R1]
	ADD R4,R4,#1
	CMP R4,R9  		;比较R9次
	BNE INNERLOOP
	SUBS R9,R9,#1
	BNE OUTLOOP
	MOV R7,R0,LSR #1 ;取中值下标
	LDR R8,=0x40000000
	ADD R8,R8,R7,LSL #2
	LDR R1,[R8] ;取中值
INIT
	DCD 0x05,0x03,0x09,0x16,0x02
	END

(2)  均值滤波程序代码如下所示:

AREA midfilter,CODE,READONLY
	ENTRY
	MOV R0,#6	 	;要排序个数
	MOV R9,R0
	LDR R1,=0x40000000
	LDR R2,=INIT
LOOP1	 			;数据初始化
	LDR R3,[R2],#4
	STR R3,[R1],#4
	SUBS R9,R9,#1
	BNE LOOP1	
	MOV R9,R0
	LDR R2,=0x40000000
	SUB R9,R9,#1
OUTLOOP	   	;冒泡排序
	MOV R4,#0 
	LDR R1,=0x40000000
INNERLOOP
	LDRB R5,[R1],#4  ;取操作数
	LDRB R6,[R1]	  ;取下一个操作数	
	CMP R5,R6
	STRHI R6,[R1,#-4]	;R5操作数小于R6操作数时进行交换
	STRHI R5,[R1]
	ADD R4,R4,#1
	CMP R4,R9  		;比较R9次
	BNE INNERLOOP
	SUBS R9,R9,#1
	BNE OUTLOOP
	LDR R7,=0x40000004
	MOV R9,R0
	SUB R9,R9,#2
LOOP2		;除去最大最小值求和,并放入R8寄存器
	LDR R6,[R7],#4
	ADD R8,R8,R6
	SUBS R9,R9,#1
	BNE LOOP2
	MOV R1,R8,LSR #2
INIT
	DCD 0x05,0x03,0x09,0x16,0x02,0x24
	END

 

八、总结及心得体会:

        思考题:用被除数一直减除数,直到被除数小于等于零,如果最后被除数为0则进行减法的次数就是商;如果被除数小于0,则商为进行减法的次数减1.

        心得及体会:通过本次实验,了解到了两种图像处理算法:中值滤波跟均值滤波。也进一步提高了分析问题跟解决问题的能力。同时也对Keil MDK-ARM uVision4开发工具的使用更加熟悉,能够熟练的使用ARM汇编语言实现冒泡排序,对ARM汇编程序能力有了进一步的提高。

九、对本实验过程及方法、手段的改进建议:

        改进1:在均值滤波的实验中,可以不必将全部数据排序,只需找出最大值跟最小值并记录下来,之后将所有数据全部求和,再减去最大值跟最小值然后求平均,这样可以减少时间复杂度,提高程序效率。

        改进2:在均值滤波的实验中,求和可能会发生溢出,此时利用一个空闲寄存器来储存溢出部分数据,每次R8加1个数后,再将上述空闲寄存器的值加上标志位C的值。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

实名吃香菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值