|
//
// 加权滑动平均滤波 Weighted Moving Average Filter
//
// 把连续取得的N个采样值看成一个队列,队列的长度固定为N
// 每次采样的一个新数据放入队尾,并扔掉原来队首的一次数据
// 把队列中的N个数据进行加权平均,即滤波输出
//
// 适用:有较大纯滞后时间常数的对象,和采样周期较短的系统
//
#T_On(IN := NOT #T_Off.Q,
PT := #Period / 2);
#T_Off(IN := #T_On.Q,
PT := #Period / 2);
#Trigger(CLK := #T_On.Q); // 采样触发,周期 = Period
IF #Trigger.Q THEN
FOR #i := 1 TO #Window - 1 DO // 采样队列滑动
#Buff[#i + 1] := #Buff[#i];
END_FOR;
#Buff[1] := #Sample_In; // 新采样值入列
FOR #i := 1 TO #Window DO
#sum_sample := #sum_sample + #Buff[#i] * #COE[#i];
#sum_coe := #sum_coe + #COE[#i];
END_FOR;
#Filter_Out := #sum_sample / #sum_coe; // 加权平均值
END_IF;
|
|