[CodeSys] 数字滤波合集——CODESYS(ST语言)

[复制链接]
查看49008 | 回复0 | 2024-11-12 09:26:46 | 显示全部楼层 |阅读模式

    减少噪声:通过过滤掉信号中的高频噪声,可以使得实际想要检测的变化更加清晰。

    平滑数据:对于变化较慢的过程变量,采用适当的滤波算法能够平滑数据波动,避免因为瞬时干扰而导致误动作。

    提取特征:某些情况下,可能需要从复杂的信号中提取特定频率范围内的信息,此时使用合适的滤波器设计非常重要。

    改善响应特性:合理设置滤波参数有助于优化控制回路的动态性能,如加快响应速度同时保持系统稳定。
二、应用场合



    温度监测与控制:例如,在加热炉温控系统中,通过对测得的温度值应用低通滤波来去除由热电偶线缆感应到的电磁干扰。

    流量测量:在流体输送过程中,由于管道震动等因素引起的流量计读数跳动可通过软件实现的移动平均法来减小。

    位置伺服系统:当使用编码器作为反馈装置时,其输出信号容易受到外部因素影响而产生误差,利用高阶滤波技术可以帮助获得更准确的位置信息。

    振动分析:在机械设备的状态监测中,通过对采集到的振动信号进行频谱分析,并选择性地抑制非目标频段,以突出显示潜在故障特征。

    安全相关领域:比如紧急停止按钮状态监控,为防止误触发,通常会采用一定时间窗口内的多次采样确认机制。

三、滑动+最值滤波



//数据采集

FOR 指针:=1 TO 滤波长度 BY 1 DO

data_1[指针]:=滤波前输入;

END_FOR

//最大值滤波

data_max:=0;

FOR 指针:=1 TO 滤波长度  BY 1 DO

IF data_max<data_1[指针]  THEN

data_max:=data_1[指针];

END_IF

END_FOR

//最小值滤波

data_min:=data_max;

FOR 指针:=1 TO 滤波长度  BY 1 DO

IF data_min>data_1[指针]  THEN

data_min:=data_1[指针];

END_IF

END_FOR

//求平均值输出

数据和:=0;

FOR 指针:=1 TO 滤波长度  BY 1 DO

数据和:=data_1[指针]+数据和;

END_FOR

滤波后输出:= (数据和-data_max-data_min)/(滤波长度-2);

//滑动滤波数据交换

FOR 指针:=1 TO (滤波长度-滤波强度)  BY 1 DO

data_2[指针]:=data_1[指针];

END_FOR

FOR 指针:=1 TO (滤波长度-滤波强度)  BY 1 DO

data_1[指针+滤波强度]:=data_2[指针];

END_FOR

//数字滤波强度计算

IF 滤波长度>=10 THEN

     IF 滤波强度设定值0_3>3 THEN

  滤波强度设定值0_3:=3;

     END_IF;

滤波强度:=(滤波长度/10)*2*滤波强度设定值0_3;

END_IF

IF 滤波长度<10 THEN

IF 滤波强度设定值0_3>2 THEN

  滤波强度设定值0_3:=2;

     END_IF;

滤波强度:=2*滤波强度设定值0_3;

END_IF
四、简易卡尔曼滤波


   KM_X_1:=KM_A*KM_X+KM_B;      

   KM_P_1:=KM_A*KM_P*KM_A+KM_Q;

   KM_K:=KM_P_1*KM_C/(KM_C*KM_P_1*KM_C*KM_R);   

   KM_X:=KM_X_1+KM_K*(DATA_Slide_NUM-KM_C*KM_X_1);

   KM_P:=(1-KM_K*KM_C)*KM_P_1;

IF IIR_A <> DATA_val[1] THEN  

IIR_B:=1-IIR_A;

DATA_val[1]:=IIR_A ;

DATA_val[2]:=IIR_B;

END_IF

IF IIR_B <> DATA_val[2] THEN   

IIR_A:=1-IIR_B;

DATA_val[1]:=IIR_A;

DATA_val[2]:=IIR_B;

END_IF

    DATA_OUT_IIR:=LREAL_TO_REAL(IIR_A*DATA_Slide_NUM+IIR_B*DATA_val[3]);

        DATA_val[3]:=DATA_OUT_IIR;

FILTER_Coeffs[1]:=0.25;

FILTER_Coeffs[2]:=0.5;

FILTER_Coeffs[3]:=0.25;

FOR i:=1 TO BUFFER_SIZE BY 1 DO

Buffer_temp:=Buffer_temp[i+1];

END_FOR;

Buffer_temp[1]:=DATA_OUT_IIR;

DATA_OUT_PUT :=FIR_OUT_PUT;

FOR i:=1 TO FILTER_LENGTH BY 1 DO  

FIR_OUT_PUT:=FILTER_Coeffs*Buffer_temp+FIR_OUT_PUT;

END_FOR;

FOR i:=1 TO FILTER_LENGTH BY 1 DO

Buffer:=Buffer_temp;

END_FOR;

五、IIR滤波



IF IIR_A <> DATA_val[1] THEN IIR_B:=1-IIR_A; DATA_val[1]:=IIR_A ; DATA_val[2]:=IIR_B;END_IF
IF IIR_B <> DATA_val[2] THEN    IIR_A:=1-IIR_B; DATA_val[1]:=IIR_A; DATA_val[2]:=IIR_B;END_IF          DATA_OUT_PUT:=IIR_A*DATA_IN_PUT+IIR_B*DATA_val[3];        DATA_val[3]:=DATA_OUT_PUT; 六、FIR滤波


IF  REAL_20 = 0 THEN        //初始化数组

FOR i:=1 TO DATA_NUM BY 1 DO

DATA_10:=0.0;

END_FOR;
REAL_20:=1;END_IF;    FOR i:=1 TO DATA_NUM BY 1 DODATA_11:=DATA_30;END_FOR;FOR i:=1 TO DATA_NUM BY 1 DO     DATA_12:=DATA_10;END_FORFOR i:=1 TO DATA_NUM-1 BY 1 DO     DATA_10[i+1]:=DATA_12;END_FORDATA_10[1]:=DATA_IN_PUT;DATA_OUT_PUT:=0;FOR i:=1 TO DATA_NUM BY 1 DO

DATA_OUT_PUT:=DATA_10*DATA_11+DATA_OUT_PUT;

END_FOR



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则