Overload List
| # | Signature | Description |
|---|---|---|
| 1 | procedure FirFilter(const Src: TCplx; out Dst: TCplx; var FIRState: TFirState); | Filter data with a FIR filter. |
| 2 | procedure FirFilter(const Src: TVec; const Dst: TVec; var FIRState: TFirState); | Filter data with a FIR filter. |
| 3 | procedure FirFilter(const Data: TVec; const FirTaps: TVec; UpSample: Integer; DownSample: Integer); | Filter Data with a FIR filter and place the result back in the Data. |
| 4 | procedure FirFilter(const Src: Double; out Dst: Double; var FIRState: TFirState); | Filter data with a FIR filter. |
Overload 1: procedure FirFilter(const Src: TCplx; out Dst: TCplx; var FIRState: TFirState);
Filter data with a FIR filter.
| # | Name | Type | Description |
|---|---|---|---|
| 1 | Src | TCplx | |
| 2 | Dst | TCplx | |
| 3 | FIRState | TFirState |
Result: stored in self (calling object)
Filter real TCplx sample and place the filtered result in Dst sample.
Overload 2: procedure FirFilter(const Src: TVec; const Dst: TVec; var FIRState: TFirState);
Filter data with a FIR filter.
| # | Name | Type | Description |
|---|---|---|---|
| 1 | Src | TVec | |
| 2 | Dst | TVec | |
| 3 | FIRState | TFirState |
Result: stored in self (calling object)
Filter data in Src and place the result in Dst. FirState must be initialized with a call to FirInit. This version of FirFilter routine can filter streaming blocks of data.
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;
Overload 3: procedure FirFilter(const Data: TVec; const FirTaps: TVec; UpSample: Integer; DownSample: Integer);
Filter Data with a FIR filter and place the result back in the Data.
| # | Name | Type | Description |
|---|---|---|---|
| 1 | Data | TVec | |
| 2 | FirTaps | TVec | |
| 3 | UpSample | Integer | |
| 4 | DownSample | Integer |
Result: stored in self (calling object)
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).
Overload 4: procedure FirFilter(const Src: Double; out Dst: Double; var FIRState: TFirState);
Filter data with a FIR filter.
| # | Name | Type | Description |
|---|---|---|---|
| 1 | Src | Double | |
| 2 | Dst | Double | |
| 3 | FIRState | TFirState |
Result: stored in self (calling object)
Filter real Src sample and place the filtered result in Dst sample.