SignalUtils.KaiserFirLength Method

Int32 KaiserFirLength(Double[] W, Double Ripple, Double FS)

Estimate the length of a windowed FIR filter.

#NameTypeDescription
1WDouble[]
2RippleDoublescalar
3FSDoublescalar

Returns: Int32

Remarks:

Returns the length of the FIR filter, windowed with the Kaiser window, where the maximum allowed ripple of the pass band is Ripple and sampling frequency is FS. The W array holds two parameters: the start and the stop of the narrowest transition band, relative to the specified sampling frequency.

The equation can be found in [1] p. 453, eq. 7.93. The length of the filter designed with kaiser window is about 10% bigger then the length of the filter with the same specifications designed with the remez algorithm. The ripple of the passband and the stopband attenuation of a FIR filter designed with a Kaiser window are related with the equations:

Att[dB] = -20*Log10(Ripple);

Ripple = Exp10(Att/-20);

References:

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

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 h = new Vector(0);
    Vector response = new Vector(0);

    double FS = 2;
    double Ripple = 0.0001;

    int n = SignalUtils.KaiserFirLength(new double[2] {0.5,0.6}, Ripple, FS);
    n = Math387.EnsureRange(4, n, SignalUtils.MaxFirLength);
    if (n % 2 == 0)
    {
        n++; //must be odd, if passband at FS/2
    }
    SignalUtils.FirImpulse(h.Size(n), new double[2] { 0.5, 0.6 }, TFilterType.ftHighpass, FS); //get impulse response
    SignalUtils.Kaiser(h,SignalUtils.KaiserBetaFir(Ripple)); //apply Kaiser window
    SignalUtils.FrequencyResponse(h,null,response,8,false,TSignalWindowType.wtRectangular,0); //zero padd by 8x
    MtxVecTee.DrawIt(20*MtxExpr.Log10(MtxExpr.Abs(response)),"Highpass FIR filter",false);
}
See Also: OptimalFir.RemezFirLength, SignalUtils.KaiserImpulse, OptimalFir.RemezImpulse