|
DSP Master VCL
|
Design an optimal equiripple FIR filter with Parks-McClellan algorithm.
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!
|