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

Design an optimal equiripple FIR filter with Parks-McClellan algorithm.

Pascal
function RemezImpulse(const H: TVec; const W: array of Double; FilterType: TFilterType; Gain: Double = 1; FS: Double = 2): boolean; overload;

Required length of the filter must be preset by setting H.Length. H vector holds the impulse response on exit.

RemezImpulse examples. Comment out the filter setup that you need. 

 

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

    procedure TForm1.Button1Click(Sender: TObject);
    var H,Response: Vector;
          TransBW, Ripple: Double;
      begin
    //Assumed sampling frequency = 2
             TransBW := 0.02; //transition bandwidth in Hz.
             Ripple := 0.001;
    //Lowpass filter
             RemezImpulse(H,[0.3,0.3+TransBW],Ripple, ftLowpass);
    //Highpass filter
    //           RemezImpulse(H,[0.3,0.3+TransBW],Ripple, ftHighpass);
    //Bandpass filter
    //           RemezImpulse(H,[0.3,0.3+TransBW, 0.5-TransBW,0.5],Ripple, ftBandpass);
    //Bandstop filter
    //           RemezImpulse(H,[0.3,0.3+TransBW, 0.5-TransBW,0.5],Ripple, ftBandstop);


    //  Type III Hilbert transformer
    //           RemezImpulse(H,[TransBW,1-TransBW],Ripple, ftHilbertIII);

    //  Type IV Hilbert transformer
    //           RemezImpulse(H,[TransBW,1],Ripple, ftHilbertIV);

    //  Type III linear phase differentiator filter
    //           KaiserImpulse(H,[1-TransBW,1],Ripple, ftDifferentiatorIII);
    //           H.Scale(2);  //Scale by sampling frequency

    //  Type IV linear phase differentiator filter
    //           KaiserImpulse( H,[1-TransBW,1],Ripple, ftDifferentiatorIV);
    //           H.Scale(2);  //Scale by sampling frequency

    //  Type III differentiator filter
    //           RemezImpulse(H,[0,1-TransBW],Ripple, ftDifferentiatorIII);
    //           H.Scale(2);  //Scale by sampling frequency

    //  Type IV differentiator filter
    //           RemezImpulse( H,[0,1-TransBW],Ripple, ftDifferentiatorIV);
    //           H.Scale(2);  //Scale by sampling frequency

    // Type III 2x differentiator filter (remez)
    //           RemezImpulse(H,[0,1-TransBW],Ripple, ftDoubleDifferentiatorIII);
    //           H.Scale(Sqr(2));  //Scale by sampling frequency

    // Type IV 2x differentiator filter (remez)
    //           RemezImpulse(H,[0,1-TransBW],Ripple, ftDoubleDifferentiatorIV);
    //           H.Scale(Sqr(2));  //Scale by sampling frequency

    // Type III integrator  filter (remez).';
    //           RemezImpulse(H,[TransBW,1-TransBW],Ripple, ftIntegratorIII);
    //           H.Scale(1/2);  //Scale by sampling frequency

    // Type IV integrator  filter (remez).';
    //           RemezImpulse(H,[TransBW,1],Ripple, ftIntegratorIV);
    //           H.Scale(1/2);  //Scale by sampling frequency

    //  Type III 2x integrator  filter (remez).';
    //           RemezImpulse(H,[TransBW,1-TransBW],Ripple, ftDoubleIntegratorIII);
    //           H.Scale(Sqr(1/2));  //Scale by sampling frequency

    //  Type IV 2x integrator  filter (remez).';
    //           RemezImpulse(H,[TransBW,1],Ripple, ftDoubleIntegratorIV);
    //           H.Scale(Sqr(1/2));  //Scale by sampling frequency

          FrequencyResponse(h,nil,Response);
          DrawIt(Response);
    end;

 

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

    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
       sVector H,Response;
       Double TransBW, Ripple;

    //Assumed sampling frequency = 2
         TransBW = 0.02; //transition bandwidth in Hz.
         Ripple = 0.001;
    //Lowpass filter
    //       RemezImpulse(H,OPENARRAY(double,(0.3,0.3+TransBW)),Ripple, ftLowpass);
    //Highpass filter
    //         RemezImpulse(H,OPENARRAY(double,(0.3,0.3+TransBW)),Ripple, ftHighpass);
    //Bandpass filter
    //           RemezImpulse(H,OPENARRAY(double,(0.3,0.3+TransBW, 0.5-TransBW,0.5)),Ripple, ftBandpass);
    //Bandstop filter
    //           RemezImpulse(H,OPENARRAY(double,(0.3,0.3+TransBW, 0.5-TransBW,0.5)),Ripple, ftBandstop);


    //  Type III Hilbert transformer
    //           RemezImpulse(H,OPENARRAY(double,(TransBW,1-TransBW)),Ripple, ftHilbertIII);

    //  Type IV Hilbert transformer
    //           RemezImpulse(H,OPENARRAY(double,(TransBW,1)),Ripple, ftHilbertIV);

    //  Type III linear phase differentiator filter
    //             KaiserImpulse(H,OPENARRAY(double,(1-TransBW,1)),Ripple, ftDifferentiatorIII);
    //           H.Scale(2);  //Scale by sampling frequency

    //  Type IV linear phase differentiator filter
    //           KaiserImpulse( H,OPENARRAY(double,(1-TransBW,1)),Ripple, ftDifferentiatorIV);
    //           H.Scale(2);  //Scale by sampling frequency

    //  Type III differentiator filter
    //           RemezImpulse(H,OPENARRAY(double,(0,1-TransBW)),Ripple, ftDifferentiatorIII);
    //           H.Scale(2);  //Scale by sampling frequency

    //  Type IV differentiator filter
    //           RemezImpulse( H,OPENARRAY(double,(0,1-TransBW)),Ripple, ftDifferentiatorIV);
    //           H.Scale(2);  //Scale by sampling frequency

    // Type III 2x differentiator filter (remez)
    //             RemezImpulse(H,OPENARRAY(double,(0,1-TransBW)),Ripple, ftDoubleDifferentiatorIII);
    //             H.Scale(2*2);  //Scale by sampling frequency

    // Type IV 2x differentiator filter (remez)
    //             RemezImpulse(H,OPENARRAY(double,(0,1-TransBW)),Ripple, ftDoubleDifferentiatorIV);
    //           H.Scale(2*2);  //Scale by sampling frequency

    // Type III integrator  filter (remez).';
    //             RemezImpulse(H,OPENARRAY(double,(TransBW,1-TransBW)),Ripple, ftIntegratorIII);
    //           H.Scale(1.0/2);  //Scale by sampling frequency

    // Type IV integrator  filter (remez).';
    //           RemezImpulse(H,OPENARRAY(double,(TransBW,1)),Ripple, ftIntegratorIV);
    //           H.Scale(1.0/2);  //Scale by sampling frequency

    //  Type III 2x integrator  filter (remez).';
    //           RemezImpulse(H,OPENARRAY(double,(TransBW,1-TransBW)),Ripple, ftDoubleIntegratorIII);
    //           H.Scale(1.0/(2*2));  //Scale by sampling frequency

    //  Type IV 2x integrator  filter (remez).';
    //         RemezImpulse(H,OPENARRAY(double,(TransBW,1)),Ripple, ftDoubleIntegratorIV);
    //           H.Scale(1.0/(2*2));  //Scale by sampling frequency

        FrequencyResponse(H,NULL,Response);
        DrawIt(Response);
    }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
What do you think about this topic? Send feedback!