SignalUtils::DcFilter Function

Overload List

#SignatureDescription
1void DcFilter(double TransitionBandwidth, double FS, TVec *Num, TVec *Den);Design a DC filter.
2void DcFilter(double alpha, TVec *Num, TVec *Den);Design a DC-blocking (high-pass) IIR filter from alpha.
3double DcFilter(double NewValue, TCplx &State, double alpha = 0.99);State parameter holds the filter state.

Overload 1: void DcFilter(double TransitionBandwidth, double FS, TVec *Num, TVec *Den);

Design a DC filter.

#NameTypeDescription
1TransitionBandwidthdouble
2FSdouble
3NumTVec *
4DenTVec *
Remarks:

Design a DC filter with TransitionBandwidth and place the transfer function in Num (numerator) and Den (denominator). You can then use this transfer function to initialize an IIR filter with a call to IirInit.

A DC filtered signal will be centered around zero. This DC filter is a simple differentiator/integrator pair. Transition bandwidth is the width of the frequency band where the amplitude is not yet completely attenuated. With DC filters, the transition band starts at 0 Hz. Narrow transition band (TransitionBandwidth/FS ratio is small) will result in filters with longer delays. FS is the sampling frequency. The filter implements the following difference equation:

y[i] = x[i] - x[i-1] + alpha y[i-1]

x.. input signal
y.. output signal
alpha.. parameter

Alpha paremeter can control the 3dB frequency of the transition bandwidth:

alpha := 1-(TransitionBandwidth/FS)*Pi;

FS.. sampling frequency
TransitionBandwidth.. frequency up to which will the filter have more
                      then 3dB attenuation. Must be less then FS/2.
Declared in Dew::Signal::Units::SignalUtils · Dew.Signal/Units.SignalUtils.h · Cross-compiler

Overload 2: void DcFilter(double alpha, TVec *Num, TVec *Den);

Design a DC-blocking (high-pass) IIR filter from alpha.

#NameTypeDescription
1alphadouble
2NumTVec *
3DenTVec *
Remarks:

Builds the transfer function of a first-order DC blocker and stores it in num / den for use with IirInit / IirFilter; the filtered signal is centred around zero (its mean is removed). With unity-DC-gain correction g = alpha/big(alpha + 1/2(1-alpha)big) the filter is

H(z) = g (1 - z^(-1))/(1 - alpha z^(-1))

i.e. a differentiator/integrator pair with a zero at z=1 (DC) and a pole at z=alpha. Domain: 0 < alpha < 1 (typically 0.99-0.9999); alpha nearer 1 pushes the cut-off lower and lengthens the transient. A finite alpha in range yields finite coefficients.

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()
{
    Vector b, c, Response, num, den, X;
    int n, i;
    TIirState IirState;
    TCplx DCState;

    Tone(b, 300, 5.0/300, 0, 1); //generate sine with 5 periods in 300 samples

    //   Alternative:
    //          b.RandGauss();

    b = b + 2;
    c.Copy(b);
    n = 10;
    DcFilter(0.95, num, den);
    IirInit(num, den, IirState);
    int bLength = b.Length;
    for (i = 0; i <= bLength / n - 1; i++)   //only to test the streaming
    {
        b.SetSubRange(i*n, n);
        c.SetSubRange(i*n, n);
        IirFilter(b, c, IirState);
    }
    b.SetFullRange();
    c.SetFullRange();

    FrequencyResponse(num, den, Response, 64);

    DcFilter(0.05, 2, num, den);
    IirInit(num, den, IirState);
    bLength = b.Length;
    for (i = 0; i <= bLength / n - 1; i++)  // the loop is only to test the streaming
    {
        b.SetSubRange(i*n, n);
        c.SetSubRange(i*n, n);
        IirFilter(b, c, IirState);
    }
    b.SetFullRange();
    c.SetFullRange();

    FrequencyResponse(num, den, Response, 64);

    DCState = C_ZERO;
    for (i = 0; i <= b.Length - 1; i++)
        c.Values(i) = DcFilter(b.Values(i), DCState, 0.95);

}
Declared in Dew::Signal::Units::SignalUtils · Dew.Signal/Units.SignalUtils.h · Cross-compiler

Overload 3: double DcFilter(double NewValue, TCplx &State, double alpha = 0.99);

State parameter holds the filter state.

#NameTypeDescription
1NewValuedouble
2StateTCplx &
3alpha = 0.99double
Remarks:

NewValue is the next sample and alpha is typically between 0.99 and 0.9999 and must be < 1. Big alpha will cause longer filter delay and more ringing. State should be initialized to zero before the routine is called for the first time.

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()
{
    Vector b(0);
    Vector c(0);
    Vector num(0);
    Vector x(0);
    Vector den(0);
    Vector Response(0);

    int n;
    int i;

    TIirState IirState;
    TCplx DCState;

    Tone(b, 300, 5.0/300, 0, 1, false); //generate sine with 5 periods in 300 samples

    //   Alternative:
    //          b.RandGauss();

    b = b + 2;
    c.Copy(b);
    n = 10;
    DcFilter(0.95, num, den);
    IirInit(num, den, IirState, false);
    int bLength = b.Length;
    for (i = 0; i < (bLength/n); i++)   //only to test the streaming
    {
        b.SetSubRange(i*n, n);
        c.SetSubRange(i*n, n);
        IirFilter(b, c, IirState);
    }
    b.SetFullRange();
    c.SetFullRange();

    FrequencyResponse(num, den, Response, 64, false, TSignalWindowType::wtRectangular, 0);

    DcFilter(0.05, 2, num, den);
    IirInit(num, den, IirState, false);
    bLength = b.Length;
    for (i = 0; i < (bLength/n); i++)   //only to test the streaming
    {
        b.SetSubRange(i*n, n);
        c.SetSubRange(i*n, n);
        IirFilter(b, c, IirState);
    }
    b.SetFullRange();
    c.SetFullRange();

    FrequencyResponse(num, den, Response, 64, false, TSignalWindowType::wtRectangular, 0);

    DCState = C_ZERO;
    for (i = 0; i < (b.Length); i++)   //only to test the streaming
    {
        c.Values(i) = DcFilter(b.Values(i), DCState, 0.95);
    }

}
See Also: SignalUtils::RemoveDC, SignalUtils::IirFilter, IIRFilters::ButterFilter, IIRFilters::ChebyshevIFilter, IIRFilters::ChebyshevIIFilter, IIRFilters::EllipticFilter, OptimalFir::RemezImpulse
Declared in Dew::Signal::Units::SignalUtils · Dew.Signal/Units.SignalUtils.h · Cross-compiler