added new files for filtering

This commit is contained in:
Dejan Rožič 2026-02-20 12:54:24 +01:00
parent be5720e84e
commit 88e893e4ad
2 changed files with 76 additions and 0 deletions

View file

@ -0,0 +1,27 @@
#Faster response than SMA, no large buffer needed. The alpha parameter (0.01.0) controls smoothing — lower = more smoothing.
FUNCTION_BLOCK FB_EMA
VAR_INPUT
xEnable : BOOL;
rInput : REAL;
rAlpha : REAL := 0.1; // Smoothing factor: 0 = max smooth, 1 = no filter
END_VAR
VAR_OUTPUT
rOutput : REAL;
END_VAR
VAR
xFirst : BOOL := TRUE;
END_VAR
IF NOT xEnable THEN
xFirst := TRUE;
rOutput := rInput;
RETURN;
END_IF;
IF xFirst THEN
rOutput := rInput;
xFirst := FALSE;
ELSE
rOutput := rAlpha * rInput + (1.0 - rAlpha) * rOutput;
END_IF;

View file

@ -0,0 +1,49 @@
#More recent samples have higher weight. Better step response than SMA.
FUNCTION_BLOCK FB_WMA
VAR_INPUT
xEnable : BOOL;
rInput : REAL;
iWindowSize : INT := 8; // Max 16
END_VAR
VAR_OUTPUT
rOutput : REAL;
END_VAR
VAR
arBuffer : ARRAY[0..15] OF REAL;
iIndex : INT := 0;
iCount : INT := 0;
iWin : INT;
rWeightSum : REAL;
rValSum : REAL;
i : INT;
iPos : INT;
rWeight : REAL;
END_VAR
IF NOT xEnable THEN
iIndex := 0; iCount := 0; rOutput := rInput;
RETURN;
END_IF;
iWin := MIN(MAX(iWindowSize, 1), 16);
// Store newest sample
arBuffer[iIndex] := rInput;
iIndex := (iIndex + 1) MOD iWin;
IF iCount < iWin THEN iCount := iCount + 1; END_IF;
// Calculate weighted sum (weight = position, newest = highest)
rWeightSum := 0.0;
rValSum := 0.0;
FOR i := 0 TO iCount - 1 DO
// Most recent sample is at (iIndex - 1), going back
iPos := (iIndex - 1 - i + iWin * 2) MOD iWin;
rWeight := INT_TO_REAL(iCount - i); // Newest gets weight=iCount, oldest=1
rValSum := rValSum + arBuffer[iPos] * rWeight;
rWeightSum := rWeightSum + rWeight;
END_FOR;
IF rWeightSum > 0.0 THEN
rOutput := rValSum / rWeightSum;
END_IF;