SignalUtils.FirFilter Method

Overload List

#SignatureDescription
1procedure FirFilter(const Src: TCplx; out Dst: TCplx; var FIRState: TFirState);Filter data with a FIR filter.
2procedure FirFilter(const Src: TVec; const Dst: TVec; var FIRState: TFirState);Filter data with a FIR filter.
3procedure 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.
4procedure 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.

#NameTypeDescription
1SrcTCplx
2DstTCplx
3FIRStateTFirState

Result: stored in self (calling object)

Remarks:

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.

#NameTypeDescription
1SrcTVec
2DstTVec
3FIRStateTFirState

Result: stored in self (calling object)

Remarks:

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.

Examples
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.

#NameTypeDescription
1DataTVec
2FirTapsTVec
3UpSampleInteger
4DownSampleInteger

Result: stored in self (calling object)

Remarks:

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).

See Also: SignalUtils.FirInit, SignalUtils.FirFilter

Overload 4: procedure FirFilter(const Src: Double; out Dst: Double; var FIRState: TFirState);

Filter data with a FIR filter.

#NameTypeDescription
1SrcDouble
2DstDouble
3FIRStateTFirState

Result: stored in self (calling object)

Remarks:

Filter real Src sample and place the filtered result in Dst sample.