IIRFilters.ButterAnalog Method

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

Design an analog Butterworth lowpass prototype filter of order Order, cutoff fixed at 1 rad/s. Returns zero-pole-gain in z (zeros), p (poles), k (gain): H(s)=k/(prod_(i=1)^n(s-p_i)), p_k=exp(j(pi/2+(pi(2k-1))/2n)), k=1... n. All n poles lie on the left half of the unit circle (so the prototype is stable, Re(p_k)<0) and all zeros are at infinity (z is returned empty), giving a maximally-flat magnitude that is 3 dB down at omega=1. Domain: Order is a positive integer, 1 <= Order <= MaxIirOrder (=50). z and p must share the same precision; a precision mismatch raises an exception. No NaN is produced for valid input.

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

Result: stored in self (calling object)

Remarks:

Design analog butterworth lowpass prototype filter of order Order. Place the resulting transfer function in zero-pole form in Z (zeros), P (poles) and K (gain). The cutoff frequency of the prototype filter is preset to 1 rad/sec.

The filter has all zeros in infinity. The transfer function is defined as ([1], p. 277):

k0 H(s) = ------------------------- (s - s[1])...(s - s[n]) The poles of the filter are located at s[k] := Expj(Pi*(0.5+(2*k-1)/(2*n))); n = order of filter k = 1,...,n k0 = gain

The magnitude response is down 3dB at the cutoff frequency.

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.ButterAnalog(Order,z, p, out k);  //design analog protype
    Wc = 3; //cutoff frequency
    LinearSystems.LowpassToLowpass(z, p, ref k, Wc);
    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.ButterFilter, LinearSystems.LowpassToHighpass, LinearSystems.Bilinear