SignalUtils::FractionalFirImpulse Function

void FractionalFirImpulse(int Length, TVec *H, const DewArray<double> &W, double Offset, double Step, TFilterType FilterType, double FS = 2);

Design an oversampled FIR filter with rectangular window.

#NameTypeDescription
1Lengthint
2HTVec *
3Wconst DewArray<double> &
4Offsetdouble
5Stepdouble
6FilterTypeTFilterType
7FS = 2double
Remarks:

Compute a FIR impulse response filter (no window applied) and place the result in H. The transition regions are defined with the W array. There must be at least one (lowpass, highpass) and at most two (bandpass, bandstop) transition regions (2 or 4 elements). Filter type is defined with TFilterType. 20*Log10(Ripple) is also the required attenuation of the stop band in decibel. FS is the sampling frequency. Length specifies the length of the original filter and Step defines the oversampling factor. The actual length of the impulse response vector is computed like this: H.Length := Round(Length/Step) Step and offset must be bigger then 0. If the Offest is 0 and step is 1, the routine returns the same result as FirImpulse. The resulting H vector contains FIR type impulse response, which can be passed to an interpolation routine (linear, cubic, lagrange, etc..). Oversampled FIR filters are used for resampling with an arbitrary sampling frequency and, if Offset > 0 and Step = 1, fractional delay FIR filters can be implemented. If Step = 1 then the resulting impulse response can be passed directly to the FirInit and FirFilter routines. When setting Step bigger then 1, the filter designed must also work as an anti-aliasing filter (low-pass) or aliasing will occur.

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 x(0);

    double FS = 2;
    double Step = 1; //interpolate by 1x

    Step = 1;
    FractionalFirImpulse(30, h, DewArray<double>{0.5, 0.6}, 0, Step, TFilterType::ftLowpass, FS);
    x = Ramp(h, 0, 1.0/h.Length);
    Step = 0.5; //interpolate by 2x
    FractionalFirImpulse(30, h, DewArray<double>{0.5, 0.6}, 0, Step, TFilterType::ftLowpass, FS);
    x = Ramp(h, 0, 1.0/h.Length);
    Step = 0.25; //interpolate by 4x
    FractionalFirImpulse(30, h, DewArray<double>{0.5, 0.6}, 0, Step, TFilterType::ftLowpass, FS);
    x = Ramp(h, 0, 1.0/h.Length);
    Step = 0.125; //interpolate by 8x
    FractionalFirImpulse(30, h, DewArray<double>{0.5, 0.6}, 0, Step, TFilterType::ftLowpass, FS);
    x = Ramp(h, 0, 1.0/h.Length);
}
See Also: SignalUtils::FirImpulse, SignalUtils::KaiserImpulse, SignalUtils::FractionalKaiserImpulse, SignalUtils::FractionalFirImpulse
Declared in Dew::Signal::Units::SignalUtils · Dew.Signal/Units.SignalUtils.h · Cross-compiler