SignalUtils.KaiserFirLength Method

function KaiserFirLength(W: TDoubleArray; Ripple: Double; FS: Double): Integer;

Estimate the length of a windowed FIR filter.

#NameTypeDescription
1WTDoubleArray
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
uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit;

procedure TForm1.Button1Click(Sender: TObject);
var h,response: Vector;
n: integer;
FS,Ripple: double;
begin
    Ripple := 0.0001;
    FS := 2;
    n := KaiserFirLength([0.5,0.6], Ripple, FS);
    n := EnsureRange(4, n, MaxFirLength);
    if not Odd(n) then Inc(n); //must be odd, if passband at FS/2
    FirImpulse(H.Size(n), [0.5,0.6], ftHighpass,FS); //get impulse response
    Kaiser(H,KaiserBetaFir(Ripple)); //apply Kaiser window
    FrequencyResponse(H,nil,Response,8); //zero padd by 8x
    DrawIt(20*Log10(Abs(Response)));
end;
See Also: OptimalFir.RemezFirLength, SignalUtils.KaiserImpulse, OptimalFir.RemezImpulse