From 86ae0460c957a90cdbb1be7a49c026da570c11f9 Mon Sep 17 00:00:00 2001 From: Max Maisel Date: Mon, 6 Aug 2018 17:04:26 +0200 Subject: [PATCH] More Biquad refactoring. --- src/effects/Biquad.cpp | 45 +++++++++++++++++-------------------- src/effects/Biquad.h | 12 +++++----- src/effects/ScienFilter.cpp | 4 +--- 3 files changed, 27 insertions(+), 34 deletions(-) diff --git a/src/effects/Biquad.cpp b/src/effects/Biquad.cpp index ff1961d72..15cdedb66 100644 --- a/src/effects/Biquad.cpp +++ b/src/effects/Biquad.cpp @@ -18,8 +18,6 @@ Max Maisel Biquad::Biquad() { - pfIn = 0; - pfOut = 0; fNumerCoeffs[B0] = 1; fNumerCoeffs[B1] = 0; fNumerCoeffs[B2] = 0; @@ -36,7 +34,7 @@ void Biquad::Reset() fPrevPrevOut = 0; } -void Biquad::Process(int iNumSamples) +void Biquad::Process(float* pfIn, float* pfOut, int iNumSamples) { for (int i = 0; i < iNumSamples; i++) *pfOut++ = ProcessOne(*pfIn++); @@ -306,6 +304,26 @@ ArrayOf Biquad::CalcChebyshevType2Filter(int order, double fn, double fc return std::move(pBiquad); } +void Biquad::ComplexDiv (float fNumerR, float fNumerI, float fDenomR, float fDenomI, float* pfQuotientR, float* pfQuotientI) +{ + float fDenom = square(fDenomR) + square(fDenomI); + *pfQuotientR = (fNumerR * fDenomR + fNumerI * fDenomI) / fDenom; + *pfQuotientI = (fNumerI * fDenomR - fNumerR * fDenomI) / fDenom; +} + +bool Biquad::BilinTransform (float fSX, float fSY, float* pfZX, float* pfZY) +{ + float fDenom = square (1 - fSX) + square (fSY); + *pfZX = (1 - square (fSX) - square (fSY)) / fDenom; + *pfZY = 2 * fSY / fDenom; + return true; +} + +float Biquad::Calc2D_DistSqr (float fX1, float fY1, float fX2, float fY2) +{ + return square (fX1 - fX2) + square (fY1 - fY2); +} + double Biquad::ChebyPoly(int Order, double NormFreq) // NormFreq = 1 at the f0 point (where response is R dB down) { // Calc cosh (Order * acosh (NormFreq)); @@ -319,24 +337,3 @@ double Biquad::ChebyPoly(int Order, double NormFreq) // NormFreq = 1 at the f0 } return fSum; } - -void ComplexDiv (float fNumerR, float fNumerI, float fDenomR, float fDenomI, float* pfQuotientR, float* pfQuotientI) -{ - float fDenom = square(fDenomR) + square(fDenomI); - *pfQuotientR = (fNumerR * fDenomR + fNumerI * fDenomI) / fDenom; - *pfQuotientI = (fNumerI * fDenomR - fNumerR * fDenomI) / fDenom; -} - -bool BilinTransform (float fSX, float fSY, float* pfZX, float* pfZY) -{ - float fDenom = square (1 - fSX) + square (fSY); - *pfZX = (1 - square (fSX) - square (fSY)) / fDenom; - *pfZY = 2 * fSY / fDenom; - return true; -} - -float Calc2D_DistSqr (float fX1, float fY1, float fX2, float fY2) -{ - return square (fX1 - fX2) + square (fY1 - fY2); -} - diff --git a/src/effects/Biquad.h b/src/effects/Biquad.h index 321660c56..2261399bd 100644 --- a/src/effects/Biquad.h +++ b/src/effects/Biquad.h @@ -19,7 +19,7 @@ struct Biquad { Biquad(); void Reset(); - void Process(int iNumSamples); + void Process(float* pfIn, float* pfOut, int iNumSamples); enum { @@ -47,8 +47,6 @@ struct Biquad return fOut; } - float* pfIn; - float* pfOut; float fNumerCoeffs[3]; // B0 B1 B2 float fDenomCoeffs[2]; // A1 A2, A0 == 1.0 float fPrevIn; @@ -67,12 +65,12 @@ struct Biquad static ArrayOf CalcChebyshevType1Filter(int order, double fn, double fc, double ripple, int type); static ArrayOf CalcChebyshevType2Filter(int order, double fn, double fc, double ripple, int type); + static void ComplexDiv (float fNumerR, float fNumerI, float fDenomR, float fDenomI, float* pfQuotientR, float* pfQuotientI); + static bool BilinTransform (float fSX, float fSY, float* pfZX, float* pfZY); + static float Calc2D_DistSqr (float fX1, float fY1, float fX2, float fY2); + static const double s_fChebyCoeffs[MAX_Order][MAX_Order + 1]; static double ChebyPoly(int Order, double NormFreq); }; -void ComplexDiv (float fNumerR, float fNumerI, float fDenomR, float fDenomI, float* pfQuotientR, float* pfQuotientI); -bool BilinTransform (float fSX, float fSY, float* pfZX, float* pfZY); -float Calc2D_DistSqr (float fX1, float fY1, float fX2, float fY2); - #endif diff --git a/src/effects/ScienFilter.cpp b/src/effects/ScienFilter.cpp index a451906f7..137c8460e 100644 --- a/src/effects/ScienFilter.cpp +++ b/src/effects/ScienFilter.cpp @@ -218,9 +218,7 @@ size_t EffectScienFilter::ProcessBlock(float **inBlock, float **outBlock, size_t float *ibuf = inBlock[0]; for (int iPair = 0; iPair < (mOrder + 1) / 2; iPair++) { - mpBiquad[iPair].pfIn = ibuf; - mpBiquad[iPair].pfOut = outBlock[0]; - mpBiquad[iPair].Process(blockLen); + mpBiquad[iPair].Process(ibuf, outBlock[0], blockLen); ibuf = outBlock[0]; }