ARM汇编 —— 中值滤波
ARM汇编 —— 中值滤波
中值滤波原理
中值滤波有什么用?
提到中值滤波,很多人都知道这是一种函数处理方法,但是中值滤波到底有什么用?
中值滤波主要就是用于对脉冲噪声的滤除,特别是再滤除噪声的同时,能够保护信号的边缘,使之不模糊
中值滤波的算法也比较简单,易于用硬件来实现,这些优良特性是线性滤波方法没有的,所以,中值滤波方法一经提出,便在数字信号处理领域得到了广泛的应用
中值滤波该怎么做?
中值滤波方法如下:
对一个数字信号序列 \(X_j(-\infty < j < \infty)\) 进行滤波处理时,首先要定义一个长度为奇数的 \(l\) 长窗口,\(l = 2n + 1\),\(n\) 为正整数。设在某一个时刻,窗口内的信号样本为\(x(i-n),……,x(i),……,x(i+n)\) ,其中 \(x(i)\) 位于窗口中心的信号样本值。对这 \(l\) 个信号样本值按从小到达顺序排列后,其中值在 \(i\) 处的样值,便定义为中值滤波的输出值
在嵌入式实际应用中,在信号采样时如果有瞬间干扰信号,那么采样回来的数据就会有明显的变化,明显偏大或偏小。数据显示是跳跃式的,看起来有明显的问题。由于模拟信号是连续变化的,并且变化一般都是相对缓慢的,这是就可以采用中值滤波(也叫做算数中值滤波),去除干扰数据
在采样时连续采样奇数个 \((2n+1)\) ,并把这些数排序,中间位置那个数 \((n+1位置)\) 作为本次采样的值
中值滤波程序设计
为确保任意 N(N为奇数)个数都能找出中间值,N 值放在 R0 中,原始数据放在内存 0X40000000 开始的地址空间,每个数占 32 位(即 4 个字节),中值滤波的结果放在寄存器 R1 中,本程序中假设 R0 = 9
算法流程如下:
程序代码
书中的示例代码:
AREA SORT, CODE, READONLY
ENTERY
MOV R0,#9
LDR r2,=0X40000000
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
设计代码:
AREA EXAMPLE,CODE,READONLY
ENTRY
EXPORT __main
__main
LDR SP,=0X40000000
;ldr r4,=0x40000000
;SWAP
;ldr r5,[r4]
;ldr r6,[r4,#4]
;str r5,[r4,#4]
;str r6,[r4]
;ldr r5,[r4]
;ldr r6,[r4,#4]
;R0,R2 INNITAIL
MOV R2,R0
LOOP_1 CMP R1,R0
BGE LOOP_END
ADD R1,R1,#1
SUB R2,R2,#1
MOV R3,#0
LDR R4,=0X40000000
B LOOP_2
LOOP_2 CMP R3,R2
BGE LOOP_1
ADD R3,R3,#1
LDR R5,[R4]
LDR R6,[R4,#4]
ADD R4,R4,#4
CMP R5,R6
BLS LOOP_2
SUB R4,R4,#4
STR R5,[R4,#4]
STR R6,[R4]
ADD R4,R4,#4
B LOOP_2
LOOP_END
MOV R2,R0,LSR#1
MOV R3,#4
MUL R1,R2,R3
LDR R1,[SP,R1]
END