摘要
根据嵌入式系统相关书籍定义,对中值滤波相关概念进行分类,将滤波分为经典滤波和现代滤波两种。
一、滤波的概念及种类
滤波( 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。
总结:
在进行汇编语言的编写时,我遇到了很多困难,参考书所给程序无法运行,单步指令报错等等。通过查找大量资料,阅读大量相关博客查到了解决方案。本人小白,本篇文章还有很多不足的地方,欢迎大佬指正,也希望可以解答其他新手的问题。