LZ的程序是去除最大值、最小值的平均值滤波程序
quote:以下是引用jianghehupo在2012-09-16 23:58:28的发言:
lz的中值滤波的程序有点儿问题吧,中值滤波应该有4个步骤:
1、先入先出堆栈
2、将堆栈暂存到临时数组(以后的排序工作就在此临时数组中完成,不会影响对战里的数据)
3、排序
4、取中值(从1开始的数组应该取第(n+1)/2个数据)
下面这段程序经过plcsim仿真,可以实现中值算法:
FUNCTION_BLOCK FB2
CONST
Length :=5; //数据记录宽度(为奇数)
END_CONST
VAR_INPUT //定义输入参数
Realtime_Value :REAL; //实时采样值
END_VAR
VAR_OUTPUT //定义输出参数
Filted_Value :REAL; //滤波后采样值
END_VAR
VAR_TEMP //定义临时变量
Loop_Count :INT; //循环计数
Squence_Count :INT; //排序计数
Temp_Data :REAL; //临时数据
data_tmp :ARRAY[1..length] OF REAL;
END_VAR
VAR //定义静态变量
Data_Store :ARRAY[1..Length] OF REAL;
END_VAR
BEGIN
(* 先入先出堆栈 *)
FOR Loop_Count := 1 TO (Length - 1) BY 1 DO
Data_Store[Loop_Count] := Data_Store[Loop_Count + 1];
END_FOR;
Data_Store[Length] := Realtime_Value;
(* 将堆栈里的数据暂存到临时数组中*)
FOR Loop_Count := 1 TO Length BY 1 DO
Data_tmp[Loop_Count] := Data_Store[Loop_Count];
END_FOR;
(* 排序 *)
FOR Loop_Count := Length TO 2 BY -1 DO
FOR Squence_Count := 1 TO (Loop_Count - 1) BY 1 DO
IF data_tmp[Squence_Count] > data_tmp[Squence_Count + 1] THEN
Temp_Data := data_tmp[Squence_Count];
data_tmp[Squence_Count] := data_tmp[Squence_Count + 1];
data_tmp[Squence_Count + 1] := Temp_Data;
END_IF;
END_FOR;
END_FOR;
(* 取中间值 *)
Filted_Value := data_tmp[(Length + 1) / 2];
END_FUNCTION_BLOCK