DSP Master VCL
|
Filter Data with a FIR filter and place the result back in the Data.
This version of FirFilter can not be used to filter streaming data. The routine compensates for group delay and returns filtered data delayed by 0 (odd FIR length) or 0.5 samples (even FIR length).
Lowpass filter a signal with a FIR filter. Sampling frequency is 2Hz, cutoff frequency is 0.6 Hz. Stopand passband ripple is 0.001.
uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit,OptimalFir; procedure TForm1.Button1Click(Sender: TObject); var b,c,Response,Response1,H: Vector; State: TFirState; n,i: integer; FS: double; begin FS := 2; Tone(b, 300,6/300,0,1); // Alternative: try gaussian noise // b := RandGauss(300); c.Size(b); RemezImpulse(H,[0.5,0.7],0.001,ftLowpass,1,FS); FillChar(State,SizeOf(State),0); FirInit(H,State); try //Alternative 1, FIR streaming n := 10; for i := 0 to (b.Length div n) - 1 do begin b.SetSubRange(i*n,n); c.SetSubRange(i*n,n); FirFilter(b,c,State); end; //Alternative 2 single block filter (does not require TIirState) // c.Copy(b); // FirFilter(c,H); //Alternative 3 single block // FirFilter(b,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 FirFree(State); end; 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 b,c, Response1, Response, H; TFirState State; TToneState ToneState; int i,n; double FS = 2; Tone(b,300,6.0/300,0.0,1.0); // Alternative: try gaussian noise // b->RandGauss(); c.Size(b); RemezImpulse(H,OPENARRAY(double,(0.5,0.7)),0.001,ftLowpass,1,FS); memset(&State,0,sizeof(TFirState)); FirInit(H,State,1,0,1,0); try { //Alternative 1, FIR streaming n = 10; for (i = 0; i < (b.Length/n); i++) { FirFilter(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); // FirFilter(c,H); //Alternative 3 single block // FirFilter(b,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 { FirFree(State); } }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
|
What do you think about this topic? Send feedback!
|