mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-16 16:10:06 +02:00
More Biquad refactoring.
This commit is contained in:
parent
064ddb5a54
commit
86ae0460c9
@ -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> 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);
|
||||
}
|
||||
|
||||
|
@ -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<Biquad> CalcChebyshevType1Filter(int order, double fn, double fc, double ripple, int type);
|
||||
static ArrayOf<Biquad> 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
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user