wangzs728 发表于 2021-9-14 12:25:02

使用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=total-1; j>1; j--)                //冒泡排序data_t2内数据,从大到小
                {
                        for(k=0; k<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);                //计算平均值
                setFP32(out,l);                //输出到梯形图中
        }
        else if(total==0)        setFP32(out,in);                //total == 0,直接将输入值作为输出值
        else if(total<=sub_max+sub_min)        setFP32(out,0);                //输入参数错误,输出0
}



页: [1]
查看完整版本: 使用CF块写的平均滤波例程