Frequency transformation from a lowpass to a highpass filter in s-domain.
Example 1
Design an analog highass filter, where the passband is defined with Wu = 0.2 rad/sec
uses MtxExpr, Math387, MtxVec, MtxVecTee, MtxVecEdit,
LinearSystems, IirFilters, SignalUtils;
procedure TForm42.Button1Click(Sender: TObject);
var z,p, num,den, FreqFr,Response: Vector;
Order: integer;
k,Wc,BW: TSample;
begin
Order := 5; //design a fifth order filter.
EllipticAnalog(Order,0.2,40,z,p,k); //design analog protype
Wc := 0.2;
LowpassToHighpass(z,p,k,WC); //frequency transformation in s-domain
ZeroPoleToTransferFun(num,den,z,p,k);
//Define the frequency grid (logarithmic)
FreqFr.Length := 1000;
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
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;
int Order;
double k,Wc,BW;
Order = 5; //design a fifth order filter.
EllipticAnalog(Order,0.2,40,z,p,k); //design analog protype
Wc = 0.2;
LowpassToHighpass(z,p,k,Wc); //frequency transformation in s-domain
ZeroPoleToTransferFun(num,den,z,p,k);
//Define the frequency grid (logarithmic)
FreqFr->Length = 1000;
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
}
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 FS = 2;
int Order = 5; //design a fifth order filter.
IIRFilters.EllipticAnalog(Order,0.2,40,z,p,out k); //design analog protype
Wc = 0.2;
LinearSystems.LowpassToHighpass(z,p,ref k,Wc); //frequency transformation in s-domain
LinearSystems.ZeroPoleToTransferFun(num,den,z,p,k);
//Define the frequency grid (logarithmic)
FreqFr.Length = 1000;
SignalUtils.LogRamp(FreqFr,-1,1); //between 0.1 (=10^(-1)) and 10 (=10^1) rad/sec
SignalUtils.FrequencyResponseS(num,den,FreqFr,Response,0); //Laplace
TeeChart.DrawIt(Response,"Frequency response",false); //Y axis linear, X axis logarithmic
}
Declaration
Procedure LowpassToHighpass(z, p: TVec; var k: TSample; Freq: TSample);
Description
Transform a lowpass filter prototype in zero-pole form to a highpass filter, where the new cutoff frequency is Freq. Assumed sampling frequency is 2. The transformation is defined as ([1], p. 258):
Wu
s --> -----
s
Wu - new cutoff frequency
The routine also adds zeros at 0. It adds one zero, if the lowpass filter order is odd and already has zeros. If the filter does not have zeros, it adds sufficient zeros at 0 to match the order of the filter.