回复:用SCL写了一个中位值滤波的功能块

uglyxu

  • 帖子

    2
  • 精华

    0
  • 被关注

    0

论坛等级:游民

注册时间:2013-05-23

普通 普通 如何晋级?

发布于 2013-07-25 10:01:49

9楼

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
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。