DSP Master VCL
|
Design an exponential filter with Decay parameter and place the transfer function in Num (numerator) and Den (denominator).
Transfer function can be used to initialize an IIR filter by passing num and den to the IirInit routine.
Exponential average filter.
uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit,OptimalFir; procedure TForm1.Button1Click(Sender: TObject); var b,c,num,den: Vector; n,i: integer; IirState: TIirState; State: double; begin //Alternative 1: Tone with 5 periods // b := Sin(Ramp(300,mvDouble, 0,2*Pi*5/300)); //Alternative 2: Gaussian noise b := RandGauss(300); c.Copy(b); n := 10; State := 0; for i := 0 to (b.Length div n) - 1 do //streaming test 1 begin b.SetSubRange(i*n,n); ExpAverageFilter(b,State,10); //set to 10% end; b.SetFullRange; DrawIt([c,b],['Unfiltered','Filtered']); b.Copy(c); ExpAverageFilter(10,num,den); //set to 10x, (1/10 = 0.1, => 10%) FillChar(IirState,SizeOf(IirState),0); IirInit(Num,Den,IirState); for i := 0 to (b.Length div n) - 1 do //streaming test 2 begin b.SetSubRange(i*n,n); c.SetSubRange(i*n,n); IirFilter(b,c,IirState); end; IirFree(IirState); b.SetFullRange; c.SetFullRange; DrawIt([b,c],['Unfiltered','Filtered']); end;
#include "MtxExpr.hpp" #include "MtxVecEdit.hpp" #include "MtxVecTee.hpp" #include "SignalUtils.hpp" #include "OptimalFir.hpp" #include <string.h> void __fastcall TForm1::BitBtn1Click(TObject *Sender) { sVector num,den,b,c; int n,i; TIirState IirState; double State = 0; //Alternative 1: Tone with 5 periods // b = Sin(Ramp(300, mvDouble,0,2*Pi*5/300)); //Alternative 2: Gaussian noise b.Size(300); b.RandGauss(); c = b; //delayed deep copy n = 10; for (i = 0; i < (b.Length/n); i++) //streaming test 1 ExpAverageFilter(b(i*n,i*n+n-1),State,10); //set to 10% DrawIt(OPENARRAY(TVec*,(c,b)),OPENARRAY(AnsiString,("Unfiltered","Filtered"))); b = c; ExpAverageFilter(10,num,den); //set to 10x, (1/10 = 0.1, => 10%) memset(&IirState,0,sizeof(IirState)); IirInit(num,den,IirState); for (i = 0; i < (b.Length/n); i++) //streaming test 2 IirFilter(b(i*n,i*n+n-1),c(i*n,i*n+n-1),IirState); DrawIt(OPENARRAY(TVec*,(b,c)),OPENARRAY(AnsiString,("Unfiltered","Filtered"))); }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
|
What do you think about this topic? Send feedback!
|