Estimate the order of the Elliptic filter.
Bedg array must contain the band edges of the transition region(s) sorted in ascending order. PassRipple defines the ripple of the passband and StopRipple defines the ripple of the stopband. The length of the CutoffFreq array must be equal to one half of the length of the BEdg array and must match the specified FilterType. The routine returns the estimated order as a result and fill's the CutoffFreq array. This array can then be passed to the EllipticFilter routine.
Example 1
Design a digital bandstop filter with transition band between 0.2..0.3 and 0.6..0.7 Hz and with at least 50dB attenuation in the stopband and. The passband should not have more then 0.2dB ripple. The sampling frequency is 2Hz.
uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit, IirFilters,
LinearSystems;
procedure TForm1.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 := EllipticOrder([0.2,0.3,0.6,0.7],0.2,50,ftBandstop,WcArray);
EllipticAnalog(Order,0.2,50,z,p,k); //design analog protype
Bilinear(z,p,k,2); //Sampling frequency is 2
Wc := Sqrt(WcArray[0]*WcArray[1]); //modified 3dB frequency
Bw := WcArray[1] - WcArray[0];
LowpassToBandstopZ(z,p,k,Wc,Bw,BilinearUnwarp(1)); //frequency transformation in z-domain
ZeroPoleToTransferFun(num,den,z,p,k);
FrequencyResponse(num,den,Response,64);
DrawIt(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 = EllipticOrder(OPENARRAY(double,(0.2,0.3,0.6,0.7)),0.2,50,ftBandStop,WcArray->PValues1D(0),WcArray->Length-1);
EllipticAnalog(Order,0.2,50,z,p,k); //design analog protype
Bilinear(z,p,k,2); //Sampling frequency is 2
Wc = Sqrt(WcArray[0]*WcArray[1]); //modified 3dB frequency
Bw = WcArray[1] - WcArray[0];
LowpassToBandStopZ(z,p,k,Wc,Bw,BilinearUnwarp(1)); //frequency transformation in z-domain
ZeroPoleToTransferFun(num,den,z,p,k);
FrequencyResponse(num,den,Response,64);
DrawIt(Response);
}
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 z = new Vector(0);
Vector p = new Vector(0);
Vector num = new Vector(0);
Vector den = new Vector(0);
Vector Response = new Vector(0);
Vector FreqFr = new Vector(0);
double k,Wc;
double[] WcArray = new double[2];
int Order; //design a fifth order filter.
double FS = 2;
Order = IIRFilters.EllipticOrder(new double[4] { 0.2, 0.3, 0.6, 0.7 }, 0.2, 50, TFilterType.ftBandStop, ref WcArray, true); //design analog protype
IIRFilters.EllipticAnalog(Order, 0.2, 50, z, p, out k); //design analog protype
LinearSystems.Bilinear(z, p, ref k, FS, true);
Wc = Math.Sqrt(WcArray[0] * WcArray[1]); //modified 3dB frequency
double Bw = WcArray[1] - WcArray[0];
LinearSystems.LowpassToBandStopZ(z, p, ref k, Wc, Bw, LinearSystems.BilinearUnwarp(1,FS));
LinearSystems.ZeroPoleToTransferFun(num, den, z, p, k);
SignalUtils.FrequencyResponse(num, den, Response, 32, false, TSignalWindowType.wtRectangular, 0);
TeeChart.DrawIt(Response, "Frequency response", false);
}