LinearSystems.LowpassToBandpassZ Method

Overload List

#SignatureDescription
1procedure LowpassToBandpassZ(const Num: TVec; const Den: TVec; Freq: Double; BW: Double; PrototypeFreq: Double);Apply frequency band transformation from lowpass to bandpass in the z-domain.
2procedure LowpassToBandpassZ(const z: TVec; const p: TVec; var k: Double; Freq: Double; BW: Double; PrototypeFreq: Double);The function returns modified z (zeros), p (poles) and k (gain).

Overload 1: procedure LowpassToBandpassZ(const Num: TVec; const Den: TVec; Freq: Double; BW: Double; PrototypeFreq: Double);

Apply frequency band transformation from lowpass to bandpass in the z-domain.

#NameTypeDescription
1NumTVec
2DenTVec
3FreqDoublescalar
4BWDoublescalar
5PrototypeFreqDoublescalar

Result: stored in self (calling object)

Remarks:

Freq is the center frequency of the passband with width BW of the new filter. The function returns modified num and den. PrototypeFreq is the cutoff frequency of the prototype lowpass filter after it has been mapped to z-domain. Freq, BW and PrototypeFreq must be between 0 and 1 (Sampling frequency = 2). The transformation is defined with the following mapping ([1] p. 260 and [2] p. 434, [3] p. 352): z^(-1) -> (-a2 + a1 z^(-1) - z^(-2))/(1 - a1 z^(-1) + a2 z^(-2)) beta = (cos((w2 + w1)/2))/(cos((w2 - w1)/2)) k1 = cot((w2 - w1)/2)tan(wc/2) a1 = (2 beta k1)/(k1 + 1), a2 = (k1 - 1)/(k1 + 1)

wc - old cutoff frequency
w2 - desired upper cutoff frequency
w1 - desired lower cutoff frequency

References:

[1] Theory and application of digital signal processing, Lawrence R. Rabiner and Bernard Gold. Prentice-Hall, 1975

[2] Discrete-time signal processing, Oppenheim and Schafer, Prentice-Hall, 1989

[3] Digital signal processing, Vinay K. Ingle and John G. Proakis, Brooks-Cole, 2000

Examples
uses MtxExpr, Math387, MtxVec, MtxVecTee, MtxVecEdit,
LinearSystems, IirFilters, SignalUtils;

procedure TForm1.Button1Click(Sender: TObject);
var z,p,num,den,Response: Vector;
Order: integer;
k,Wc,w1,w2,BW: Double;
begin
    Order := 4;//design a fourth order filter.
    EllipticAnalog(Order,0.1,30,z,p,k);  //design analog protype
    Bilinear(z,p,k,2); //bilinear with sampling frequency 2Hz.
    w1 := 0.2; //start of the passband at 0.2Hz.
    w2 := 0.5; //stop of the passband at 0.5Hz.
    Wc := Sqrt(w1*w2); //center frequency of the passband
    BW := w2-w1;  //passband width
    //    LowpassToBandpassZ(z,p,k,Wc,BW,BilinearUnwarp(1));
    //    ZeroPoleToTransferFun(num,den,z,p,k);

    //Alternative:
    //       ...
    ZeroPoleToTransferFun(num,den,z,p,k);
    LowpassToBandpassZ(num,den,Wc,BW,BilinearUnwarp(1));

    FrequencyResponse(num,den,Response,64);
    DrawIt(Response);
end;

Overload 2: procedure LowpassToBandpassZ(const z: TVec; const p: TVec; var k: Double; Freq: Double; BW: Double; PrototypeFreq: Double);

The function returns modified z (zeros), p (poles) and k (gain).

#NameTypeDescription
1zTVec
2pTVec
3kDouble
4FreqDoublescalar
5BWDoublescalar
6PrototypeFreqDoublescalar

Result: stored in self (calling object)

See Also: LinearSystems.Bilinear, LinearSystems.RationalSubstitution, LinearSystems.LowpassToBandpass, LinearSystems.LowpassToLowpassZ, LinearSystems.LowpassToHighpassZ, LinearSystems.LowpassToBandstopZ