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

Estimate the length of a windowed FIR filter.

Pascal
function KaiserFirLength(W: array of double; Ripple: double; FS: double = 2): integer; overload;

Returns the length of the FIR filter, windowed with the Kaiser window, where the maximum allowed ripple of the pass band is Ripple and sampling frequency is FS. The W array holds two parameters: the start and the stop of the narrowest transition band, relative to the specified sampling frequency. 

The equation can be found in [1] p. 453, eq. 7.93. The length of the filter designed with kaiser window is about 10% bigger then the length of the filter with the same specifications designed with the remez algorithm. The ripple of the passband and the stopband attenuation of a FIR filter designed with a Kaiser window are related with the equations:

Att[dB] = -20*Log10(Ripple);

Ripple = Exp10(Att/-20);

References:  

[1] Discrete-time signal processing, Oppenheim and Schafer, Prentice-Hall, 1989.

Design a highpass filter with at least 80 dB attenuation in the stopband and not more then 0.0001 ripple in the passband. Transition band is between 0.5 and 0.6 Hz. Sampling frequency is 2 Hz.

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

  procedure TForm1.Button1Click(Sender: TObject);
  var h,response: Vector;
      n: integer;
      FS,Ripple: double;
  begin
      Ripple := 0.0001;
      FS := 2;
      n := KaiserFirLength([0.5,0.6], Ripple, FS);
      n := EnsureRange(4, n, MaxFirLength);
      if not Odd(n) then Inc(n); //must be odd, if passband at FS/2
      FirImpulse(H.Size(n), [0.5,0.6], ftHighpass,FS); //get impulse response
      Kaiser(H,KaiserBetaFir(Ripple)); //apply Kaiser window
      FrequencyResponse(H,nil,Response,8); //zero padd by 8x
      DrawIt(20*Log10(Abs(Response)));
  end;

 

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

  void __fastcall TForm41::BitBtn1Click(TObject *Sender)
  {
      sVector h,Response;
      int n;
      double FS = 2;
      double Ripple = 0.0001;

      n = KaiserFirLength(OPENARRAY(double,(0.5,0.6)), Ripple, FS);
      n = EnsureRange(4, n, MaxFirLength);
      if ((n%2) == 0) n++; //must be odd, if passband at FS/2
      FirImpulse(h.Size(n), OPENARRAY(double,(0.5,0.6)), ftHighpass,FS); //get impulse response
      Kaiser(h,KaiserBetaFir(Ripple)); //apply Kaiser window
      FrequencyResponse(h,NULL,Response,8); //zero padd by 8x
      DrawIt(20*Log10(Abs(Response)));
  }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
What do you think about this topic? Send feedback!