使用CF块写的平均滤波例程
使用数组锁存和冒泡排序法制作的平均滤波例程,可以自定义滤波个数、最大、最小粗大误差个数。其中滤波个数越多则滞后越大。滤波个数必须大于零且大于最大加最小的和,滤波个数为0则直接将输入值传送到输出值,数据不对则输出为0.0。程序整体和程序块调用:
几种滤波结果:
变量表:
↓↓↓↓↓↓↓↓源代码↓↓↓↓↓↓↓↓
/****************************************
** 使用双数组和冒泡法,首个if判断参数是否合理,参数不合理则输出0(滤波个数小于去除粗大误差数)
** 如果total(滤波个数)==0,则不进行滤波排序直接将新值输出到‘out’中
** 18-19行:旧值处理、抓取新值 21-32行:冒泡排序data_t2内的值 34-37行:计算均值、输出
******************************************/
#include "math.h"
#include "stdio.h"
#include "plc300.h"
FP32 l;
U16 j, k;
FP32 data_t1; // 用于存储数据记录(旧值)
FP32 data_t2; // 用于存储排序后数据
void CF_0( FP32 in, U8 total, U8 sub_max, U8 sub_min, FP32 *out)
{
if(total>0&&total-sub_max-sub_min>0)
{
for(j=total-1; j>0; j--) data_t2 =data_t1 =data_t1; //将data_t1的值依次往后挪一位,并按位赋值到data_t2
data_t2 =data_t1 =in; //新值放入数组的最前面,到此步新值读取完成,data_t1、data_t2内数据完全相等
for(j=0; j<total; j++) //冒泡排序data_t2内数据,从大到小
{
for(k=0; k<total-j-1; k++)
{
if(data_t2 <data_t2)
{
l =data_t2;
data_t2 =data_t2;
data_t2 =l;
}
}
}
l =0;
for(j=sub_max; j<total-sub_min; j++) l =l+data_t2; //计算累加值(忽略sub_max个最大值、sub_min个最小值)
l =l/(total-sub_max-sub_min); //计算平均值
if( finitef( l)) setFP32(out,l); //输出到梯形图中
}
else if(total==0 && finitef( in) != 0) setFP32(out,in); //total == 0,直接将输入值作为输出值
else if(total<=sub_max+sub_min) setFP32(out,0); //输入参数错误,输出0
}
页:
[1]