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

Filter Data with a FIR filter and place the result back in the Data.

Pascal
procedure FirFilter(const Data: TVec; const FirTaps: TVec; UpSample: integer = 1; DownSample: integer = 1); overload;

This version of FirFilter can not be used to filter streaming data. The routine compensates for group delay and returns filtered data delayed by 0 (odd FIR length) or 0.5 samples (even FIR length).

Lowpass filter a signal with a FIR filter. Sampling frequency is 2Hz, cutoff frequency is 0.6 Hz. Stopand passband ripple is 0.001. 

 

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

  procedure TForm1.Button1Click(Sender: TObject);
  var b,c,Response,Response1,H: Vector;
      State: TFirState;
      n,i: integer;
      FS: double;
  begin
      FS := 2;
      Tone(b, 300,6/300,0,1);

  //   Alternative: try gaussian noise
  //    b := RandGauss(300);

      c.Size(b);
      RemezImpulse(H,[0.5,0.7],0.001,ftLowpass,1,FS);
      FillChar(State,SizeOf(State),0);
      FirInit(H,State);
      try
  //Alternative 1, FIR streaming
          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;

  //Alternative 2 single block filter (does not require TIirState)
  //                c.Copy(b);
  //                FirFilter(c,H);

  //Alternative 3 single block
  //                FirFilter(b,c,State);

          c.SetFullRange;
          b.SetFullRange;
          DrawIt([b,c],['Original signal','Filtered signal']);
          FrequencyResponse(b,nil,Response,8,True,wtHanning);
          FrequencyResponse(c,nil,Response1,8,True,wtHanning);
          DrawIt([Response,Response1],['Orig. signal','Filtered']);
      finally
          FirFree(State);
      end;
  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 b,c, Response1, Response, H;
      TFirState State;
      TToneState ToneState;
      int i,n;
      double FS = 2;

      Tone(b,300,6.0/300,0.0,1.0);

    //   Alternative: try gaussian noise
    //   b->RandGauss();

      c.Size(b);
      RemezImpulse(H,OPENARRAY(double,(0.5,0.7)),0.001,ftLowpass,1,FS);
      memset(&State,0,sizeof(TFirState));
      FirInit(H,State,1,0,1,0);
      try
      {
    //Alternative 1, FIR streaming
        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);
        }

    //Alternative 2 single block filter (does not require TIirState)
    //                c.Copy(b);
    //                FirFilter(c,H);

    //Alternative 3 single block
    //                FirFilter(b,c,State);

        DrawIt(OPENARRAY(TVec*,(b,c)),OPENARRAY(AnsiString,("Original signal","Filtered Signal")));

        FrequencyResponse(b,NULL,Response,8,True,wtHanning);
        FrequencyResponse(c,NULL,Response1,8,True,wtHanning);
        DrawIt(OPENARRAY(TVec*,(Response,Response1)),OPENARRAY(AnsiString,("Spectrum: original signal","Spectrum: filtered signal")));
      }
      __finally
      {
        FirFree(State);
      }
  }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
What do you think about this topic? Send feedback!