DewDSPMasterNET
ChebyshevIFilter Routines
Summary
Design Chebyshev type I IIR filter.

Unit
IIRFilters

Declaration
Function ChebyshevIFilter(Order: integer; PassRipple: TSample; const CutoffFreq: array of TSample; FilterType: TFilterType; Analog: boolean; num, den: TVec; IirFrequencyTransform: TIirFrequencyTransform = ftStateSpaceAnalog): TSample;

Description
The resulting transfer function is returned in the numerator/denumerator form with num and den.
Declaration
Function ChebyshevIFilter(Order: integer; PassRipple: TSample; const CutoffFreq: array of TSample; FilterType: TFilterType; Analog: boolean; A: TMtx; B, C: TVec; out d: TSample): TSample;

Description
The resulting transfer function is returned in the state-space form with A,B,C,D variables.
Categories
IIR filter design routines
 See Also 
IirFilter 
ChebyshevIOrder 
ButterFilter 
ChebyshevIIFilter 
EllipticFilter 
BesselFilter 

Example 1

Design an analog bandpass filter with transition band between 1..2 and 5..7 rad/sec and with at least 50dB attenuation in the stopband and. The passband should not have more then 0.2dB ripple.
uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit, IirFilters, LinearSystems; {$R *.dfm} procedure TForm42.Button1Click(Sender: TObject); var z,p, num,den, FreqFr,Response: Vector; Order: integer; k,Bw,Wc: TSample; WcArray: TSampleArray; //modified 3dB frequency begin SetLength(WcArray,2); Order := ChebyshevIIOrder([1,2,5,7],0.2,50,ftBandpass,WcArray,True); ChebyshevIFilter(Order,0.2,WcArray,ftBandPass,true,num,den); FreqFr.Length := 1000; //Define the frequency grid (logarithmic) LogRamp(FreqFr,-1,1); //between 0.1 (=10^(-1)) and 10 (=10^1) rad/sec FrequencyResponseS(num,den,FreqFr,Response); //Laplace DrawIt(Response); //Y axis linear, X axis logarithmic; //Alternative: Design a digital filter with the passband between 0.2 and 0.5 Hz (FS =2) // SetLength(WcArray,2); // Order := ChebyshevIOrder([0.1,0.2,0.5,0.6],0.2,50,ftBandPass,WcArray,false); // ChebyshevIFilter(Order,0.2,WcArray,ftBandPass,false,num,den); // FrequencyResponse(num,den,Response,64); // FreqFr.Size(Response.Length); // FreqFr.Ramp(0,1/FreqFr.Length); // DrawIt(FreqFr,Response); end;
#include "MtxVecCPP.h" //MtxVecCPP.cpp must be included in the project #include "MtxVecEdit.hpp" #include "MtxVecTee.hpp" #include "SignalUtils.hpp" #include "IirFilters.hpp" #include "LinearSystems.hpp" void __fastcall TForm1::BitBtn1Click(TObject *Sender) { Vector z,p, num, den, FreqFr, Response, WcArray; int Order; double k,Wc,Bw; WcArray->Size(2); Order = ChebyshevIIOrder(OPENARRAY(double,(1,2,5,7)),0.2,50,ftBandPass,WcArray->PValues1D(0),WcArray->Length-1,true); ChebyshevIFilter(Order,0.2,WcArray->PValues1D(0),WcArray->Length-1,ftBandPass,true,num,den); FreqFr->Length = 1000; //Define the frequency grid (logarithmic) LogRamp(FreqFr,-1,1); //between 0.1 (=10^(-1)) and 10 (=10^1) rad/sec FrequencyResponseS(num,den,FreqFr,Response); //Laplace DrawIt(Response); //Y axis linear, X axis logarithmic; //Alternative: Design a digital filter with the passband between 0.2 and 0.5 Hz (FS =2) // WcArray->Size(2); // Order = ChebyshevIOrder(OPENARRAY(double,(0.1,0.2,0.5,0.6)),0.2,50,ftBandPass,WcArray->PValues1D(0),WcArray->Length-1,false); // ChebyshevIFilter(Order,0.2,WcArray->PValues1D(0),WcArray->Length-1,ftBandPass,false,num,den); // FrequencyResponse(num,den,Response,64); // FreqFr = Ramp(Response->Length,0,1.0/Response->Length); // DrawIt(FreqFr,Response,"Frequency response",false); }
using Dew.Math; using Dew.Math.Editors; using Dew.Math.Units; using Dew.Signal; using Dew.Signal.Units; using Dew.Math.Tee; using Dew.Signal.Tee; private void button1_Click(object sender, EventArgs e) { Vector num = new Vector(0); Vector den = new Vector(0); Vector Response = new Vector(0); Vector FreqFr = new Vector(0); double[] WcArray= new double[2]; //design analog filter int Order = IIRFilters.ChebyshevIIOrder(new double[4] { 1, 2, 5, 7 }, 0.2, 50, TFilterType.ftBandPass, ref WcArray, true); IIRFilters.ChebyshevIIFilter(Order, 50, WcArray, TFilterType.ftBandPass, true, num,den, TIirFrequencyTransform.ftStateSpaceAnalog); //design analog protype FreqFr.Length = 1000; SignalUtils.LogRamp(FreqFr, -1, 1); SignalUtils.FrequencyResponseS(num, den, FreqFr, Response, 0); TeeChart.DrawIt(Response, "Frequency response", false); //Alternative: Design a digital filter with the passband between 0.2 and 0.5 Hz (FS =2) Order = IIRFilters.ChebyshevIOrder(new double[4] { 0.1, 0.2, 0.5, 0.6 }, 0.2, 50, TFilterType.ftBandPass, ref WcArray, false); IIRFilters.ChebyshevIFilter(Order, 0.2, WcArray, TFilterType.ftBandPass, false, num, den, TIirFrequencyTransform.ftStateSpaceAnalog); //design analog protype FreqFr = MtxExpr.Ramp(Response.Length, 0, 1.0 / FreqFr.Length); TeeChart.DrawIt(Response, "Frequency response", false); }


Declaration
Function ChebyshevIFilter(Order: integer; PassRipple: TSample; const CutoffFreq: array of TSample; FilterType: TFilterType; Analog: boolean; z, p: TVec; out k: TSample; IirFrequencyTransform: TIirFrequencyTransform = ftStateSpaceAnalog): TSample;

Description
Design Chebyshev type I filter of Order with CutoffFreq frequencies and of FilterType type. Set Analog to True, to request and analog filter design in s-plane or set it to false to obtain a digital filter design in z-plane. PassRipple defines the passband ripple in dB. The CutoffFreq must be in range between 0 and 1 (Sampling frequency = 2) in case of a digital filter design. IIrFrequencyTransform specifies when and how will the frequency band transformation be applied. The resulting transfer function is returned in the zero-pole form, with z,p,k variables.

Copyright 2008 Dew Research
http://www.dewresearch.com