发布于 2006-09-20 11:12:28
0楼
我前一段时间也编了一个去极值平均滤波算法,在实际工程里面也用上去了,效果还可以。。现在共享一下,一方面大家相互交流一下,另一方面请大家指教,是否有更简单的方法。
说明: (1) 使用时事先要在对应的存储DB里面开辟空间 , 其数目为: 滤波数据个数+1 .
(2) 请在OB100里面将使用的DB空间进行初始化 .
(3) 输入的数据源是WORD类型的 , 输出的平均值是DWORD类型的 .
第一步: 递推 .
OPN #DB_Number
LAR1 P#DBX 0.0 //取首地址.
TAR1 AR2
L #Filter_Data_Number
L 2
*I
SLW 3
T #Memory_Number
L DBW [#Memory_Number] //新数据<>旧数据,才认为有效.
L #New_Data_source
==I
JC _Out
L #New_Data_source
T DBW [#Memory_Number] //采集新数据,存到DBW[2*N].
//循环递推.
L #Filter_Data_Number
Back: T #Actual_Cycle_Number
L DBW [AR1,P#2.0]
T DBW [AR1,P#0.0]
+AR1 P#2.0
L #Actual_Cycle_Number
LOOP Back
第二步: 求最值 .
LAR1 AR2
L DBW [AR1,P#0.0]
L 0
==I
JC _Out //第1个单元==0,跳出.
//找最大值.
L DBW [AR1,P#0.0]
T #Maximum
L #Filter_Data_Number
DEC 1
_010: T #Actual_Cycle_Number
L #Maximum
L DBW [AR1,P#2.0]
>=I
JC _011
T #Maximum
_011: +AR1 P#2.0
L #Actual_Cycle_Number
LOOP _010
//找最小值.
LAR1 AR2
L DBW [AR1,P#0.0]
T #Minimum
L #Filter_Data_Number
DEC 1
_012: T #Actual_Cycle_Number
L #Minimum
L DBW [AR1,P#2.0]
<=I
JC _013
T #Minimum
_013: +AR1 P#2.0
L #Actual_Cycle_Number
LOOP _012
第三步: 求平均值 .
LAR1 AR2
//累加求和.
L 0
T #Sum_Value
L #Filter_Data_Number
_031: T #Actual_Cycle_Number
L DBW [AR1,P#0.0]
L #Sum_Value
+D
T #Sum_Value
+AR1 P#2.0
L #Actual_Cycle_Number
LOOP _031
//去极值.
L #Sum_Value
L #Maximum
-D
L #Minimum
-D
T #Sum_Value
//求平均值.
L #Sum_Value
L #Filter_Data_Number
DEC 2
/D
T #Average_Value
_Out: NOP 0
乔灵