DSP Master VCL
|
Estimate the length of a windowed FIR filter.
function KaiserFirLength(W: array of double; Ripple: double; FS: double = 2): integer; overload;
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.
Design a highpass filter with at least 80 dB attenuation in the stopband and not more then 0.0001 ripple in the passband. Transition band is between 0.5 and 0.6 Hz. Sampling frequency is 2 Hz.
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;
#include "MtxExpr.hpp" #include "MtxVecEdit.hpp" #include "MtxVecTee.hpp" #include "SignalUtils.hpp" void __fastcall TForm41::BitBtn1Click(TObject *Sender) { sVector h,Response; int n; double FS = 2; double Ripple = 0.0001; n = KaiserFirLength(OPENARRAY(double,(0.5,0.6)), Ripple, FS); n = EnsureRange(4, n, MaxFirLength); if ((n%2) == 0) n++; //must be odd, if passband at FS/2 FirImpulse(h.Size(n), OPENARRAY(double,(0.5,0.6)), ftHighpass,FS); //get impulse response Kaiser(h,KaiserBetaFir(Ripple)); //apply Kaiser window FrequencyResponse(h,NULL,Response,8); //zero padd by 8x DrawIt(20*Log10(Abs(Response))); }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
|
What do you think about this topic? Send feedback!
|