IIRFilters.ButterFilter Method

Overload List

#SignatureDescription
1Double ButterFilter(Int32 Order, Double[] CutoffFreq, TFilterType FilterType, Boolean Analog, TMtx A, TVec B, TVec C, ref Double d)The resulting transfer function is returned in the state-space form with A,B,C,D variables.
2Double ButterFilter(Int32 Order, Double[] CutoffFreq, TFilterType FilterType, Boolean Analog, TVec Num, TVec Den, TIirFrequencyTransform IirFrequencyTransform)The resulting transfer function is returned in the numerator/denumerator form with num and den.
3Double ButterFilter(Int32 Order, Double[] CutoffFreq, TFilterType FilterType, Boolean Analog, TVec z, TVec p, ref Double k, TIirFrequencyTransform IirFrequencyTransform)Design a complete Butterworth IIR filter of the given Order, cutoff(s) CutoffFreq and band type FilterType, returning the transfer function in zero-pole form (z, p, k): H(z)=k (prod_i (z-z_i))/(prod_i (z-p_i)). Set Analog=True for an s-plane design or Analog=False for a z-plane (digital) design; for a digital design CutoffFreq lies in $(0,1)$ with sampling frequency 2 (so 1 = Nyquist). FilterType is lp/hp (1 cutoff) or bp/bs (2 cutoffs); a bandpass/bandstop design has twice the prototype order. IirFrequencyTransform selects when the frequency-band transform is applied (state-space-analog, zero-pole-analog or zero-pole-discrete). Digital poles satisfy |p_i|<1 (stable). The function result is the natural 3 dB cutoff W_c. The other overloads return the same filter as num/den (ba), second-order sections (sos) or state space (A,B,C,D). NOTE: a digital cutoff outside $(0,1)$ is NOT range-checked and yields a degenerate filter.
4Double ButterFilter(Int32 Order, Double[] CutoffFreq, TFilterType FilterType, Boolean Analog, TVec sos, TIirFrequencyTransform IirFrequencyTransform)The resulting transfer function is returned in the second order section form stored in the sos variable.

Overload 1: Double ButterFilter(Int32 Order, Double[] CutoffFreq, TFilterType FilterType, Boolean Analog, TMtx A, TVec B, TVec C, ref Double d)

The resulting transfer function is returned in the state-space form with A,B,C,D variables.

#NameTypeDescription
1OrderInt32
2CutoffFreqDouble[]
3FilterTypeTFilterType
4AnalogBoolean
5ATMtxsource TMtx
6BTVecsource TVec
7CTVecsource TVec
8dDouble (ref)output

Returns: Double

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[] WcArray = new double[2];
    int Order; //design a fifth order filter.

    Order = IIRFilters.ButterOrder(new double[4] { 0.2, 0.3, 0.6, 0.7 }, 0.2, 50, TFilterType.ftBandstop, ref WcArray, true);  //design analog protype
    IIRFilters.ButterFilter(Order, WcArray, TFilterType.ftBandstop, false, num, den, TIirFrequencyTransform.ftStateSpaceAnalog);

    // Alternative 1. Specify the order and the 3 dB frequencies explicitely:
    //
    //     IIRFilters.ButterFilter(5, new double[2] {0.2,0.7}, TFilterType.ftBandstop,false,num,den,TIirFrequencyTransform.ftStateSpaceAnalog);


    // Alternative 2. Specifying the 3 dB frequencies explicitely
    // will result in 3 dB ripple (and not 0.2 as requested) in the passband,
    // but one coulde always move the 3 dB frequencies a little:
    //
    //     IIRFilters.ButterFilter(5, new double[2] { 0.22, 0.68 }, TFilterType.ftBandstop, false, num, den, TIirFrequencyTransform.ftStateSpaceAnalog);

    // Alternative 3. Specifying the order explicitely
    // will not ensure 50 dB attenuation in the edges of the stopband,
    // but one can increase filter order:
    //
    //     IIRFilters.ButterFilter(10, new double[2] { 0.22, 0.68 }, TFilterType.ftBandstop, false, num, den, TIirFrequencyTransform.ftStateSpaceAnalog);

    SignalUtils.FrequencyResponse(num, den, Response, 32, false, TSignalWindowType.wtRectangular, 0);
    MtxVecTee.DrawIt(Response, "Frequency response", false);
See Also: IIRFilters.ButterOrder, IIRFilters.ChebyshevIFilter, IIRFilters.ChebyshevIIFilter, IIRFilters.EllipticFilter, IIRFilters.BesselFilter

Overload 2: Double ButterFilter(Int32 Order, Double[] CutoffFreq, TFilterType FilterType, Boolean Analog, TVec Num, TVec Den, TIirFrequencyTransform IirFrequencyTransform)

The resulting transfer function is returned in the numerator/denumerator form with num and den.

#NameTypeDescription
1OrderInt32
2CutoffFreqDouble[]
3FilterTypeTFilterType
4AnalogBoolean
5NumTVecsource TVec
6DenTVecsource TVec
7IirFrequencyTransformTIirFrequencyTransform

Returns: Double

Overload 3: Double ButterFilter(Int32 Order, Double[] CutoffFreq, TFilterType FilterType, Boolean Analog, TVec z, TVec p, ref Double k, TIirFrequencyTransform IirFrequencyTransform)

Design a complete Butterworth IIR filter of the given Order, cutoff(s) CutoffFreq and band type FilterType, returning the transfer function in zero-pole form (z, p, k): H(z)=k (prod_i (z-z_i))/(prod_i (z-p_i)). Set Analog=True for an s-plane design or Analog=False for a z-plane (digital) design; for a digital design CutoffFreq lies in (0,1)(0,1) with sampling frequency 2 (so 1 = Nyquist). FilterType is lp/hp (1 cutoff) or bp/bs (2 cutoffs); a bandpass/bandstop design has twice the prototype order. IirFrequencyTransform selects when the frequency-band transform is applied (state-space-analog, zero-pole-analog or zero-pole-discrete). Digital poles satisfy |p_i|<1 (stable). The function result is the natural 3 dB cutoff W_c. The other overloads return the same filter as num/den (ba), second-order sections (sos) or state space (A,B,C,D). NOTE: a digital cutoff outside (0,1)(0,1) is NOT range-checked and yields a degenerate filter.

#NameTypeDescription
1OrderInt32
2CutoffFreqDouble[]
3FilterTypeTFilterType
4AnalogBoolean
5zTVecsource TVec
6pTVecsource TVec
7kDouble (ref)output
8IirFrequencyTransformTIirFrequencyTransform

Returns: Double

Remarks:

Design Butterworth filter of Order with CutoffFreq frequencies and of FilterType type. Set Analog to True, to request and analog filter design in s-plane or set it to false to obtain a digital filter design in z-plane. The CutoffFreq must be in range between 0 and 1 (Sampling frequency = 2) in case of a digital filter design.

IIrFrequencyTransform specifies when and how will the frequency band transformation be applied. The resulting transfer function is returned in the zero-pole form, with z,p,k variables.

Overload 4: Double ButterFilter(Int32 Order, Double[] CutoffFreq, TFilterType FilterType, Boolean Analog, TVec sos, TIirFrequencyTransform IirFrequencyTransform)

The resulting transfer function is returned in the second order section form stored in the sos variable.

#NameTypeDescription
1OrderInt32
2CutoffFreqDouble[]
3FilterTypeTFilterType
4AnalogBoolean
5sosTVecsource TVec
6IirFrequencyTransformTIirFrequencyTransform

Returns: Double

Remarks:

The sos variable can be passed directly to the IirInitBQ filter initialization routine. Second order section form delivers substantially higher numerical stability and range than filtering with num/den form which is used by the IirInit routine.