void IirInitBQ(TVec *sos, TIirState &IIRState, bool ComplexData);
Initialize an IIR filter with second order sections.
Remarks:
Initialize an IIR filter by initializing the IirState variable. Set ComplexData to True, if the data stream to be filtered will be complex. The Sos (real) vector variable contains second order sections as produced by the ZeroPoleToSOS function:
(B00, B10, B20, A00, A10, A20), (B01, B11, B21, A01, A11, A21), (.... ),...
B - numerator sections array A - denumarator sections array
Using second order sections to compute an IIR filter results in higher numerical accuracy and greater filter stability at a slightly higher cost on performance.
Examples
#include "MtxExpr.h"
#include "Units.IIrFilters.h"
#include "Units.SignalUtils.h"
using namespace Dew;
using namespace Dew::Math;
using namespace Dew::Signal;
using namespace Dew::Signal::Units::IIRFilters;
using namespace Dew::Signal::Units::SignalUtils;
void Example()
{
Vector b(0);
Vector c(0);
Vector sos(0);
Vector Response1(0);
Vector Response2(0);
TIirState state;
int n;
int i;
Tone(b, 300, 6.0/300, 0, 1, false);
// Alternative: try gaussian noise
// b = RandGauss(300, TMtxFloatPrecision::mvDouble);
ChebyshevIFilter(6, 0.2, DewArray<double>{0.6}, TFilterType::ftLowpass, false, sos, TIirFrequencyTransform::ftStateSpaceAnalog);
IirInitBQ(sos, state, false);
c.Copy(b); //backup data
IirFilter(c, state); //apply filter to the data
IirFree(state); //free structure, if you dont require this IIR filter anymore
FrequencyResponse(c, nullptr, Response1, 1, true, TSignalWindowType::wtHanning, 0);
FrequencyResponse(b, nullptr, Response2, 1, true, TSignalWindowType::wtHanning, 0);
}
See Also: SignalUtils::SavGolayFilter, OptimalFir::RemezImpulse, SignalUtils::FirInit, SignalUtils::IirInit, SignalUtils::IirFree
Declared in Dew::Signal::Units::SignalUtils · Dew.Signal/Units.SignalUtils.h · Cross-compiler