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

The resulting H vector contains FIR type impulse response, which can be passed to the FirInit routine.

Pascal
procedure SavGolayImpulse(const H: TVec; FrameSize: integer; Order: integer; const Weights: TVec = nil); overload;

And excerpt from the Savitzky-Golay demo for a single block filter: 

 

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

procedure TForm1.Button1Click(Sender: TObject);
var H,D: Matrix;
    Data, Data1: Vector;
    Frs,Ord: integer;
begin
     Data.Size(100);
     Data.RandGauss;
     Data1.Copy(Data);
     Frs := 10;
     if not Odd(Frs) then Inc(Frs);
     Ord := 5;
     SavGolayImpulse(H,D,Frs,Ord,nil);   //single block processing
     SavGolayFilter(Data,H);
     DrawIt([Data,Data1],['Filtered data','Original data']);
end;

 

  #include "MtxExpr.hpp"
  #include "MtxVecEdit.hpp"
  #include "MtxVecTee.hpp"
  #include "SignalUtils.hpp"

  void __fastcall TForm1::BitBtn1Click(TObject *Sender)
  {
      sMatrix H,D;
      sVector Data, Data1;

      Data.Size(100);
      Data.RandGauss();
      Data1.Copy(Data);
      int Frs = 10;
      if ((Frs%2) == 0) Frs++;
      int Ord = 5;
      SavGolayImpulse(H,D,Frs,Ord,NULL);   //single block processing
      SavGolayFilter(Data,H);
      DrawIt(OPENARRAY(TVec*,(Data,Data1)),OPENARRAY(AnsiString,("Filtered data","Original data")));
  }

Streamed filtering. A vector with a sine signal is broken down in to smaller pieces and they are filtered one by one. 

 

procedure TForm1.Button1Click(Sender: TObject);
var h,b,c: Vector;
    n,i: integer;
    State: TFirState;
begin
    SavGolayImpulse(h,15,7);
    FirInit(h,State);
    try
        b := Ramp(300, mvDouble, 0,0.1);
        c.Size(b);
        n := 10;
        for i := 0 to (b.Length div n) - 1 do
        begin
             b.SetSubRange(i*n,n);
             c.SetSubRange(i*n,n);
             FirFilter(b,c,State);
        end;
        b.SetFullRange;
        c.SetFullRange;
        DrawIt([b,c],['Filtered data','Original data']);
    finally
        FirFree(State);
    end;
end;

 

  void __fastcall TForm1::BitBtn1Click(TObject *Sender)
  {
      sVector h,b,c;
      int n,i;
      TFirState State;

      SavGolayImpulse(h,15,7);
      FirInit(h,State);
      try
      {
          b = Ramp(300, mvDouble0,0.1);
          c.Size(b);
          n = 10;
          for (i = 0; i < (b.Length/n); i++)
          {
             FirFilter(b(i*n, i*n+n-1),c(i*n, i*n+n-1),State);
          }
          DrawIt(OPENARRAY(TVec*,(b,c)),OPENARRAY(AnsiString,("Filtered data","Original data")));
      }
      __finally
      {
        FirFree(State);
      }
  }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
What do you think about this topic? Send feedback!