基于ARM汇编的中值滤波编写

摘要

根据嵌入式系统相关书籍定义,对中值滤波相关概念进行分类,将滤波分为经典滤波和现代滤波两种。

一、滤波的概念及种类

滤波( Wave Filtering )是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。滤波分为经典滤波和现代滤波。

1.经典滤波

经典滤波是基于傅里叶分析和变换提出的一个工程概念。根据高等数学理论,任何一个满足一定条件的信号,都可以被看成由无限个正弦波叠加而成。换句话说,工程信号就是由不同频率一定条件的信号,都可以被看成由无限个正弦波叠加而成。换句话说,工程信号就是由不同频率。

2.现代滤波

现代滤波是指用模拟电子电路对模拟信号进行滤波操作,其基本原理就是利用电路的频率特性实现对信号中频率成分的选择。滤波时,把信号看成由不同频率正弦波叠加而成的模拟信号,通过选择不同的频率成分来实现信号滤波。在计算机实际应用中,需要将模拟量转换为数字量(即进行A/D转换),为解决干扰问题,常用的方法主要有中值滤波和均值滤波。

二、中值滤波相关解释。

1.中值滤波的定义

中值滤波:中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,便之不模糊。此外,中值滤波的算法比较简单,也易于用硬件实现。这些优良特性是线性滤波方法所不具有的。所以,中值滤波方法-经3提出后,便在数字信号处理领域得到广泛应用。

中值速波法:

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

2.中值滤波的程序设计

对于中间数据,分别取中位数进行替换(以第一组数据为例70,80,30重新排序后为30,70,80其中位数为70,则输出为70,70,30以此类推)
输入为[70, 80, 30, 20, 10, 90, 0, 60, 40, 50]
输出为[70, 70, 30, 20, 20, 10, 60, 40, 50, 40]
对于对应两侧数据,在运算时在最左边补0构成三位数,并按照之前的方法计算中位数进行中值滤波。
输入0,[70, 80, 30, 20, 10, 90, 0, 60, 40, 50](算0,70,80这三个数的中位数,这个数还是70
同理最右边的50)
对应输出[70 70 30 20 20 10 60 40 50 40]
对于最右侧数据同理,在右方补0
输入[70, 80, 30, 20, 10, 90, 0, 60, 40, 50],0(对这三个数据进行排序 40,50,0 → 0,40,50)
输出[70 70 30 20 20 10 60 40 50 40]这个数变成了40

三、利用汇编语言实现中值滤波

1.创建新项目,并选择相应的芯片,配置环境。

在这里插入图片描述
在这里插入图片描述

2.创建源文件

Target1–Source–Add New Item…
在这里插入图片描述
创建后缀名.s的文件
在这里插入图片描述

3.编写代码

中值滤波程序流程图如下
在这里插入图片描述

		AREA SORT,CODE,READONLY//定义一个代码段
		ENTRY
		EXPORT __main
__main
		MOV R0 ,#9//需要排序的个数为奇数
		LDR R2,=0x40000000//R2为原始数据的起始地址
		MOV R9,#0
		STR R9,[R2]
		MOV R9,#2
		STR R9,[R2,4]
		MOV R9,#1
		STR R9,[R2,8]
		SUB R1,R0,#1
		MOV R4,#4
		MLA R3,R1,R4,R2//R3为原始数据的结束地址
		SUB R4,R3,#4//R4为原始数据的倒数第二个数的地址
LOOP1	ADD R5,R2,#4//R5为内循环的起始地址
LOOP2	LDR R6,[R2]   
		LDR R7,[R5]
		CMP R6,R7//比较交换,从小到大排序
		STRHI R6,[R5]
		STRHI R7,[R2]
		ADD R5,R5,#4//修改内循环地址
		CMP R5,R3//内循环结束比较
		BLS LOOP2
		ADD R2,R2,#4//修改外循环地址
		CMP R2,R4//外循环结束比较
		BLS LOOP1
		LDR R2,=0X40000000
		MOV R0,R0,LSR #1
		MOV R4,#4
		MLA R3,R0,R4,R2
		LDR R1,[R3]//找到中间的数并赋给R1
		MOV R0,#100
		END

4.调试

首先在debug中选择使用仿真器simulator,否则会报错。
在这里插入图片描述
在这里插入图片描述
在此处打断点,SUB处为数组赋值后查看数组的值。
在这里插入图片描述
此处打断点为完成调试后保存在R1之中的结果。
在这里插入图片描述
进行调试(右键–Set Program Counter)
在这里插入图片描述
点击调试
在这里插入图片描述
程序执行在第一个断点前停下,对寄存器中相应数组做出了修改
在这里插入图片描述
再次执行,程序执行至第二个断点之前,数组中元素值发生改变。
在这里插入图片描述
执行单步,最终结果被放入了R1中
在这里插入图片描述
得到中值为1。

总结:

在进行汇编语言的编写时,我遇到了很多困难,参考书所给程序无法运行,单步指令报错等等。通过查找大量资料,阅读大量相关博客查到了解决方案。本人小白,本篇文章还有很多不足的地方,欢迎大佬指正,也希望可以解答其他新手的问题。

参考文献

基于中值滤波处理ECG信号
ARM 汇编 内存访问指令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值