IIRFilters.ChebyshevIIAnalog Method

void ChebyshevIIAnalog(Int32 Order, Double StopRipple, TVec z, TVec p, ref Double k)

Design an analog Chebyshev type II (inverse Chebyshev) lowpass prototype filter of order Order with StopRipple dB of equiripple attenuation in the stopband, cutoff fixed at 1 rad/s. Returns zero-pole-gain with finite imaginary-axis zeros: |H(jomega)|^2=1/(1+[varepsilon^2 T_n^2(1/omega)]^(-1)), varepsilon=1/(sqrt(10^(R_s/10)-1)), z_k=j/(cos((2k-1)pi)/2n). The magnitude is maximally flat in the passband and equiripple in the stopband; at the stopband edge omega=1 it equals 10^(-R_s/20) where R_s=StopRipple. Domain: 1 <= Order <= MaxIirOrder, StopRipple>0 dB. Poles satisfy Re(p_k)<0 (stable). z and p must share precision or an exception is raised.

#NameTypeDescription
1OrderInt32
2StopRippleDoublescalar
3zTVecsource TVec
4pTVecsource TVec
5kDouble (ref)output

Result: stored in self (calling object)

Remarks:

Design analog Chebyshev type II lowpass prototype filter of order Order. Place the resulting
transfer function in zero-pole form in Z (zeros), P (poles) and K (gain). Ripple defines the StopRipple (dB) of the stopband.The cutoff frequency of the prototype filter is preset to 1 rad/sec, the unit circle.

Chebyshevs type II filters have poles and zeros and are equiripple in the stopband. The design formulas are found in [1] p. 232:

Wr
Zeros: z[k] = j* --------------------- cos((2*k-1)/(2*n)*Pi)
Poles: p[k] = s[k] + j*W[k] Wr*a[k]
s[k] = ----------------- a[k]^2 + b[k]^2
-Wr*b[k]
W[k] = ----------------- a[k]^2 + b[k]^2
a[k] = -sinh(Phi)sin((2*k-1)*Pi/(2*n)) b[k] = cosh(Phi)*cos((2*k-1)*Pi/(2*n)) sinh(phi) = 0.5(v - 1/v) cosh(phi) = 0.5*(v + 1/v) v = (A + (A^2 - 1)^0.5)^(1/n), A = 1/sr^2 n - order of the filter k = 1,...,n
Wr - stopband edge
sr - stopband ripple

References:

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

Examples
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;
    int Order = 5; //design a fifth order filter.

    IIRFilters.ChebyshevIIAnalog(Order,20,z, p, out k);  //design analog protype
    Wc = Math.Sqrt(3*2); //cutoff frequency
    double BW = 3 - 2;
    LinearSystems.LowpassToBandpass(z, p, ref k, Wc,BW);
    LinearSystems.ZeroPoleToTransferFun(num, den, z, p, k);
    FreqFr.Length = 1000;
    SignalUtils.LogRamp(FreqFr, -1, 1);

    SignalUtils.FrequencyResponseS(num, den, FreqFr, Response, 0);
    MtxVecTee.DrawIt(Response, "Frequency response", false);
}
See Also: IIRFilters.ChebyshevIFilter, LinearSystems.LowpassToHighpass, LinearSystems.Bilinear