SignalUtils::SavGolayImpulse Function

Overload List

#SignatureDescription
1void SavGolayImpulse(TMtx *H, TMtx *Diff, int FrameSize, int Order, TVec *Weights = null);Design a Savitzky-Golay polynomial smoothing filter.
2void SavGolayImpulse(TVec *H, int FrameSize, int Order, TVec *Weights = null);The resulting H vector contains FIR type impulse response, which can be passed to the FirInit routine.

Overload 1: void SavGolayImpulse(TMtx *H, TMtx *Diff, int FrameSize, int Order, TVec *Weights = null);

Design a Savitzky-Golay polynomial smoothing filter.

#NameTypeDescription
1HTMtx *
2DiffTMtx *
3FrameSizeint
4Orderint
5Weights = nullTVec *
Remarks:

Compute a Savitzky-Golay polynomial smoothing filter: a polynomial of degree Order is least-squares fitted to each FrameSize-long window of the signal. H is sized FrameSize x FrameSize; row i holds the filter producing the fitted value at window position i. Only the center row of H is used for filtering the signal interior, the upper and lower rows of H are applied to the transition regions where the signal starts and stops (see SignalUtils::SavGolayFilter). Diff is sized (Order+1) x FrameSize; row k recovers the coefficient of x^k of the fitted polynomial, with x counted in samples relative to the window center, so row 1 is the first-derivative filter.

Weights, when assigned, must hold FrameSize strictly positive values and the fit minimizes the weighted sum of squares; H is then not symmetric. An exception is raised if FrameSize is not odd, if Order is not in [0, FrameSize-1], or if Weights are present with wrong length, non-positive values or a precision different from H. The computation runs in the precision of H.

Examples
#include "MtxExpr.h"
#include "Units.SignalUtils.h"

using namespace Dew;
using namespace Dew::Math;
using namespace Dew::Signal;
using namespace Dew::Signal::Units::SignalUtils;

void Example()
{
    Matrix H, D;
    Vector Data, Data1;
    int Frs, Ord;

    Data.Size(100);
    Data.RandGauss();
    Data1.Copy(Data);
    Frs = 10;
    if (!Odd(Frs)) Frs++;
    Ord = 5;
    SavGolayImpulse(H, D, Frs, Ord, nullptr);   //single block processing
    SavGolayFilter(Data, H);
}
Declared in Dew::Signal::Units::SignalUtils · Dew.Signal/Units.SignalUtils.h · Cross-compiler

Overload 2: void SavGolayImpulse(TVec *H, int FrameSize, int Order, TVec *Weights = null);

The resulting H vector contains FIR type impulse response, which can be passed to the FirInit routine.

#NameTypeDescription
1HTVec *
2FrameSizeint
3Orderint
4Weights = nullTVec *
Remarks:

Returns the center row of the Savitzky-Golay smoothing matrix: the FIR filter fitting a polynomial of degree Order to each FrameSize-long window and evaluating it at the window center. Optional Weights (FrameSize strictly positive values, same precision as H) select a weighted least-squares fit.

Examples
#include "MtxExpr.h"
#include "Units.MtxExpr.h"
#include "Units.SignalUtils.h"

using namespace Dew;
using namespace Dew::Math;
using namespace Dew::Math::Units::MtxExpr;
using namespace Dew::Signal;
using namespace Dew::Signal::Units::SignalUtils;

void Example()
{
    Vector h(0);
    Vector b = Ramp(300, TMtxFloatPrecision::mvDouble, 0, 0.1);
    Vector c(b.Length);
    TFirState state;
    int n = 10;
    int i;

    SavGolayImpulse(h, 15, 7, nullptr);
    FirInit(h, state, 1, 0, 1, 0);
    c.Size(b);
    n = 10;
    int bLength = b.Length; //must be outside of the "for" to prevent reevaluation
    for (i = 0; i < (bLength/n); i++)
    {
        b.SetSubRange(i * n, n); //select only a small subvector of the vector
        c.SetSubRange(i * n, n);
        FirFilter(b, c, state);
    }
    FirFree(state);
}
See Also: SignalUtils::FirFilter, SignalUtils::FirFree, SignalUtils::FirInit, SignalUtils::SavGolayFilter
Declared in Dew::Signal::Units::SignalUtils · Dew.Signal/Units.SignalUtils.h · Cross-compiler