合信论坛

快捷导航
查看: 10428|回复: 0

使用CF块写的平均滤波例程

[复制链接]

29

主题

32

帖子

1189

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1189
QQ
发表于 2021-9-14 12:25:02 | 显示全部楼层 |阅读模式
使用数组锁存和冒泡排序法制作的平均滤波例程,可以自定义滤波个数、最大、最小粗大误差个数。其中滤波个数越多则滞后越大。滤波个数必须大于零且大于最大加最小的和,滤波个数为0则直接将输入值传送到输出值,数据不对则输出为0.0。

程序整体和程序块调用:
程序整体.png

程序块调用.png
几种滤波结果:
滤波结果10-3-1.png 滤波结果23-12-2.png 滤波结果64-42-1.png 滤波结果255-182-2.png
变量表:
变量表.png

↓↓↓↓↓↓↓↓源代码↓↓↓↓↓↓↓↓
/****************************************
**        使用双数组和冒泡法,首个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[300];                //        用于存储数据记录(旧值)
FP32 data_t2[300];                //        用于存储排序后数据

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[j] =data_t1[j] =data_t1[j-1];                //将data_t1的值依次往后挪一位,并按位赋值到data_t2
                data_t2[0] =data_t1[0] =in;                //新值放入数组的最前面,到此步新值读取完成,data_t1、data_t2内数据完全相等

                for(j=total-1; j>1; j--)                //冒泡排序data_t2内数据,从大到小
                {
                        for(k=0; k<j-1; k++)
                        {
                                if(data_t2[k] <data_t2[k+1])
                                {
                                        l =data_t2[k];
                                        data_t2[k] =data_t2[k+1];
                                        data_t2[k+1] =l;
                                }
                        }
                }

                l =0;
                for(j=sub_max; j<total-sub_min; j++)        l =l+data_t2[j];                //计算累加值(忽略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
}



平均滤波.rar

16.15 KB, 下载次数: 827

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

客服热线
400-700-4858 周一至周五:09:00 - 18:00
深圳市南山区打石一路深圳国际创新谷6栋A座9层

深圳市合信自动化技术有限公司(简称“合信技术”)成立于2003年,高新技术企业,专注于工业自动化产品的研发、生产、销售和技术服务,依靠高质量、高性能的自动化控制产品与方案为客户创造最大价值,立志于成为全球领先的工业自动化解决方案供应商。

Archiver|手机版|小黑屋|COTRUST Inc. ( 粤ICP备13051915号 )

GMT+8, 2024-7-24 03:02 , Processed in 0.065305 second(s), 24 queries .

快速回复 返回顶部 返回列表