Documente Academic
Documente Profesional
Documente Cultură
***********************************************************************************
**
// ** MEDIAN FILTER
**
// ** v1.0 August 2018 C. Laffoon
**
// ** Median filter function for use in reducing effects of random noise spikes
**
// ** To increase/decrease number of filter elements, change constant
FILTER_ELEMENTS **
// ** and also edit size of arrays to match.
**
//
***********************************************************************************
**
FUNCTION_BLOCK FB201
CONST
FILTER_ELEMENTS := 11;
END_CONST
VAR_INPUT
IN_VALUE : INT;
END_VAR
VAR_OUTPUT
OUT_VALUE : INT;
END_VAR
VAR_TEMP
// Temporary Variables
BFR_VAL : ARRAY[0..10] OF INT;
BFR_AGE : ARRAY[0..10] OF INT;
BFR_IDX : INT;
VAL_IDX : INT;
TMP_IDX : INT;
OLDEST_DELETED : BOOL;
OLDEST_AGE : INT;
OLDEST_IDX : INT;
INCOMING_VALUE_WRITTEN : BOOL;
MEDIAN_IDX : INT;
END_VAR
VAR
// Static Variables
VALUE : ARRAY[0..10] OF INT;
AGE : ARRAY[0..10] OF INT;
END_VAR
LABEL
LAB1, LAB2;
END_LABEL
// ***********************************************************
// ** Statement Section **
// ***********************************************************
BEGIN
BFR_IDX := 0; // Initialize Index
VAL_IDX := 0; // Initialize Index
OLDEST_DELETED := FALSE;
OLDEST_AGE := -1;
INCOMING_VALUE_WRITTEN := FALSE;
MEDIAN_IDX := (FILTER_ELEMENTS / 2);
// If new value is smaller than current index value, then write incoming
value to buffer
IF INCOMING_VALUE_WRITTEN = FALSE AND IN_VALUE <= VALUE[VAL_IDX] OR VAL_IDX
> (FILTER_ELEMENTS-1) THEN
// Write incoming value and age to buffer
BFR_VAL[BFR_IDX] := IN_VALUE;
BFR_AGE[BFR_IDX] := 0;
BFR_IDX := BFR_IDX + 1;
INCOMING_VALUE_WRITTEN := TRUE;
END_IF;
END_FUNCTION_BLOCK