DSP Master VCL
|
Filter Data and place the result back in Data.
The Iir filter is defined with a transfer function. Num is numerator and Den is denominator. Set LinearPhase to True to double filter attenuation and ensure no phase distortion and no phase delay (except for the initial transition regions).
Lowpass filter a sine signal with Chebyshev type I filter. Sampling frequency is 2Hz, cutoff frequency is 0.6 Hz. Passband ripple is 0.2 dB and filter order is 6.
uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit, IIRFilters; procedure TForm42.Button1Click(Sender: TObject); var b,c,Response,Response1,num,den: Vector; State: TIirState; n,i: integer; begin Tone(b,300,6/300,0,1); // Alternative: try gaussian noise // b := RandGauss(300); c.Size(b); ChebyshevIFilter(6,0.2,[0.6],ftLowpass,false,num,den); FillChar(State,SizeOf(State),0); IirInit(num,den,State); try //Alternative 1, IIR streaming n := 10; for i := 0 to (b.Length div n) - 1 do begin b.SetSubRange(i*n,n); c.SetSubRange(i*n,n); IirFilter(b,c,State); end; //Alternative 2 single block filter (does not require TIirState) // c.Copy(b); // IirFilter(c,num,den,True); //Alternative 3 single block // c.Copy(b); // IirFilter(c,State); c.SetFullRange; b.SetFullRange; DrawIt([b,c],['Original signal','Filtered signal']); FrequencyResponse(b,nil,Response,8,True,wtHanning); FrequencyResponse(c,nil,Response1,8,True,wtHanning); DrawIt([Response,Response1],['Orig. signal','Filtered']); finally IirFree(State); end; end;
#include "MtxExpr.hpp" #include "MtxVecEdit.hpp" #include "MtxVecTee.hpp" #include "SignalUtils.hpp" #include "IIRFilters.hpp" #include <string.h> void __fastcall TForm1::BitBtn1Click(TObject *Sender) { sVector b,c, Response1, Response, num, den; TIirState State; TToneState ToneState; int i,n; b.Size(300); ToneInit(6.0/300,0.0,1.0,ToneState,false); Tone(b,ToneState); // Alternative: try gaussian noise // b.RandGauss(); c.Size(b); ChebyshevIFilter(6,0.2,OPENARRAY(double,(0.6)),ftLowpass,false,num,den); memset(&State,0,sizeof(State)); IirInit(num,den,State); try { //Alternative 1, IIR streaming n = 10; for (i = 0; i < (b.Length/n); i++) { IirFilter(b(i*n,i*n+n-1),c(i*n,i*n+n-1),State); } //Alternative 2 single block filter (does not require TIirState) // c.Copy(b); // IirFilter(c,num,den,true); //Alternative 3 single block // c.Copy(b); // IirFilter(c,State); DrawIt(OPENARRAY(TVec*,(b,c)),OPENARRAY(AnsiString,("Original signal","Filtered Signal"))); FrequencyResponse(b,NULL,Response,8,True,wtHanning); FrequencyResponse(c,NULL,Response1,8,True,wtHanning); DrawIt(OPENARRAY(TVec*,(Response,Response1)),OPENARRAY(AnsiString,("Spectrum: original signal","Spectrum: filtered signal"))); } __finally { IirFree(State); } }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
|
What do you think about this topic? Send feedback!
|