目录
1 滤波的概念及种类
滤波(Wave Filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。滤波分为经典滤波和现代滤波
1.1 经典滤波
经典滤波是基于傅里叶分析和变换提出的一个工程概念。根据高等数学理论,任何一个满足一定条件的信号,都可以被看成由无限个正弦波叠加而成。换句话说,工程信号就是由不同频率的正弦波叠加而成的,组成信号的不同频率的正弦波叫信号的“频率成分”或“谐波成分”。
1.2 现代滤波
现代滤波是指用模拟电子电路对模拟信号进行滤波操作,其基本原理就是利用电路的频率特性实现对信号中频率成分的选择。滤波时,把信号看成由不同频率正弦波叠加而成的模拟信号,通过选择不同的频率成分来实现信号滤波。在计算机实际应用中,需要将模拟量转换为数字量(即进行A/D转换),为解决干扰问题,常用的方法主要有中值滤波
和均值滤波
本文即讲解现代滤波中的中值滤波方法
2 中值滤波及程序设计
2.1 中值滤波
中值滤波对脉冲噪声
有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不模糊。此外,中值滤波的算法比较简单,也易于用硬件实现。这些优良特性是线性滤波方法所不具有的。所以,中值滤波方法-经提出后,便在数字信号处理领域得到广泛应用。
中值速波方法如下:对一个数字信号序列 xj(∞<j<∞) 进行滤波处理时,首先要定义一个
长度为奇数的 l 长窗口,l=2n+1,n为正整数。设在某一个时刻,窗口内的信号祥本为 x(i-n),…,x(i),…,x(i+n) ,其中 x(i) 为位于窗口中心的信号样本值。对这 l 个信号样本值按从小到大的顺序排列后,其中值在 i 处的样值,便定义为中值滤波的输出值。
在嵌人式的实际应用中,如A/D采样时,如果有瞬间干扰信号,那么采样回来的数据就有明显的变化,如明显偏大或偏小。如果把这些数据拿来显示,那显示数据就是跳跃式的,看起来明显有问题。因为模拟信号是连续变化的,并且其变化一般都是相对缓慢的, 这时就可以采用中值滤波(也叫“算数中值滤波”),把这些干扰数据去除掉,其原理如下:在采样时连续采样奇数个数 (2n+1) ,并把这些数排序,中间位置那个数 (n+1 位置) 作为本次采样的值。
2.2 中值滤波程序设计
为了保证程序的通用性,对任意N(N为奇数)个数都能找出中间值,N值放在R0中,原始数据放在内存0x40000000
开始的地址空间,每个数占32位,中值滤波的结果放在寄存器R1中,此处假设R0=9。
流程图如下
3 程序实现
3.1 工程的创建
keil下stm32工程的创建过程与之前文章一样,本文将不做介绍,详情参考:
基于Keil MDK 完成对纯汇编语言的STM32工程的建立
3.2 汇编代码实现
AREA SORT,CODE,READONLY
ENTRY
EXPORT __main
__main
MOV R0,#7
LDR R2,=0X40000000
MOV R9,#1
STR R9,[R2]
MOV R9,#5
STR R9,[R2,4]
MOV R9,#8
STR R9,[R2,8]
MOV R9,#7
STR R9,[R2,12]
MOV R9,#12
STR R9,[R2,16]
MOV R9,#15
STR R9,[R2,20]
MOV R9,#18
STR R9,[R2,24]
SUB R1,R0,#1
MOV R4,#4
MLA R3,R1,R4,R2
SUB R4,R3,#4
LOOP1 ADD R5,R2,#4
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]
MOV R0,#100
END
键入代码后,编译一下,结果如下
无错误无警告,编译成功
3.3 stm32仿真调试
调试设置在本章开头所提到的文章中也有讲解,本文将不做解释。
设置断点,在数组赋值后,观察对应地址是否赋值成功
前面进行比较与排序,把大小为中间值的R3寄存器中地址对应的值赋给R1寄存器,运行后,发现对应地址已经赋值
再运行一次,可以看到数组中中间值的大小以存放在寄存器中
总结
学习使用了keil工具对汇编程序进行编译运行,了解到了keil中调试的各种方式。
参考
https://blog.csdn.net/isyuuun/article/details/120559821?spm=1001.2014.3001.5502