You are here: Symbol Reference > SignalUtils Namespace > Functions > SignalUtils.ExpAverageFilter Function
DSP Master VCL
ContentsIndex
PreviousUpNext
SignalUtils.ExpAverageFilter Function

Design an exponential filter with Decay parameter and place the transfer function in Num (numerator) and Den (denominator).

Pascal
procedure ExpAverageFilter(Decay: double; Num: TVec; Den: TVec); overload;

Transfer function can be used to initialize an IIR filter by passing num and den to the IirInit routine.

Exponential average filter. 

 

  uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit,OptimalFir;

  procedure TForm1.Button1Click(Sender: TObject);
  var b,c,num,den: Vector;
      n,i: integer;
      IirState: TIirState;
      State: double;
  begin
  //Alternative 1: Tone with 5 periods
  //      b := Sin(Ramp(300,mvDouble, 0,2*Pi*5/300));

  //Alternative 2: Gaussian noise
        b := RandGauss(300);
        c.Copy(b);
        n := 10;
        State := 0;
        for i := 0 to (b.Length div n) - 1 do //streaming test 1
        begin
            b.SetSubRange(i*n,n);
            ExpAverageFilter(b,State,10); //set to 10%
        end;
        b.SetFullRange;
        DrawIt([c,b],['Unfiltered','Filtered']);

        b.Copy(c);
        ExpAverageFilter(10,num,den); //set to 10x, (1/10 = 0.1, => 10%)
        FillChar(IirState,SizeOf(IirState),0);

        IirInit(Num,Den,IirState);
        for i := 0 to (b.Length div n) - 1 do //streaming test 2
        begin
            b.SetSubRange(i*n,n);
            c.SetSubRange(i*n,n);
            IirFilter(b,c,IirState);
        end;
        IirFree(IirState);
        b.SetFullRange;
        c.SetFullRange;
        DrawIt([b,c],['Unfiltered','Filtered']);
  end;

 

    #include "MtxExpr.hpp"
  #include "MtxVecEdit.hpp"
  #include "MtxVecTee.hpp"
  #include "SignalUtils.hpp"
  #include "OptimalFir.hpp"
  #include <string.h>

  void __fastcall TForm1::BitBtn1Click(TObject *Sender)
  {
    sVector num,den,b,c;
    int n,i;
    TIirState IirState;
    double    State = 0;

    //Alternative 1: Tone with 5 periods
    //      b = Sin(Ramp(300, mvDouble,0,2*Pi*5/300));

    //Alternative 2: Gaussian noise
    b.Size(300);
    b.RandGauss();
    c = b;  //delayed deep copy
    n = 10;
    for (i = 0; i < (b.Length/n); i++) //streaming test 1
      ExpAverageFilter(b(i*n,i*n+n-1),State,10); //set to 10%

    DrawIt(OPENARRAY(TVec*,(c,b)),OPENARRAY(AnsiString,("Unfiltered","Filtered")));

    b = c;
    ExpAverageFilter(10,num,den); //set to 10x, (1/10 = 0.1, => 10%)
    memset(&IirState,0,sizeof(IirState));

    IirInit(num,den,IirState);
    for (i = 0; i < (b.Length/n); i++) //streaming test 2
      IirFilter(b(i*n,i*n+n-1),c(i*n,i*n+n-1),IirState);

    DrawIt(OPENARRAY(TVec*,(b,c)),OPENARRAY(AnsiString,("Unfiltered","Filtered")));
  }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
What do you think about this topic? Send feedback!