DewDSPMasterNET
SampleAndHoldFilter Routine
Summary
Filter data with a sample-and-hold filter.

Unit
SignalUtils

Declaration
Procedure SampleAndHoldFilter(Data: TVec; var State: TSampleAndHoldState; Hold: integer);

Description
Filter Data with a non-linear sample-and-hold filter. The current value is held until a bigger is found or time-out occurs. Time out is defined in samples with Hold parameter. The filter features streaming support via the State variable. Data can be real or complex. The State variable has to be initialized with zeros before it is passed to the routine for the first time.
Categories
Non-linear filters
 See Also 
SampleAndDecayFilter 
MedianFilter 
MovingAverageFilter 
ExpAverageFilter 

Example 1

SampleAndHoldFilter example on a sine.
uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit; procedure TForm1.Button1Click(Sender: TObject); var b,c: Vector; n,i: integer; State: TSampleAndHoldState; begin Tone(b,300,5.0/300,0,1); c.Copy(b); n := 10; for i := 0 to b.Length div n-1 do begin b.SetSubRange(i*n,n); SampleAndHoldFilter(b,State,7); end; b.SetFullRange; DrawIt([c,b],['Unfiltered','Filtered']); end;
#include "MtxVecCPP.h" //MtxVecCPP.cpp must be included in the project #include "MtxVecEdit.hpp" #include "MtxVecTee.hpp" #include "SignalUtils.hpp" void __fastcall TForm1::BitBtn1Click(TObject *Sender) { Vector b,c; int n,i; TSampleAndHoldState State; Tone(b,300,5.0/300,0,1); //generate sine with 5 periods in 300 samples c = b; n = 10; for (i = 0; i < (b->Length/n); i++) //Streaming test 1 { SampleAndHoldFilter(b(i*n,i*n+n-1),State,7); } DrawIt(OPENARRAY(TVec*,(c,b)),OPENARRAY(AnsiString,("Unfiltered","Filtered"))); }
using Dew.Math; using Dew.Math.Editors; using Dew.Math.Units; using Dew.Signal; using Dew.Signal.Units; using Dew.Math.Tee; using Dew.Signal.Tee; private void button1_Click(object sender, EventArgs e) { Vector b = new Vector(0); Vector c = new Vector(0); Vector num = new Vector(0); int n = 10; int i; TSampleAndHoldState State = new TSampleAndHoldState(); SignalUtils.Tone(b,300,5.0/300,0,1,false); c.Copy(b); int bLength = b.Length; for (i = 0; i < (bLength/n); i++) { b.SetSubRange(i*n,n); SignalUtils.SampleAndHoldFilter(b,ref State, 7); } b.SetFullRange(); TeeChart.DrawIt(new TVec[2] {c,b}, new string[2] {"Unfiltered","Filtered"},"SampleAndDecay",false); }

Copyright 2008 Dew Research
http://www.dewresearch.com