Doxygen/style, test for div/0

This commit is contained in:
Klaus Basan
2019-10-18 12:11:18 +02:00
parent aaa5fc259a
commit 7cfcc61bd3
2 changed files with 34 additions and 22 deletions

View File

@@ -7,10 +7,14 @@
*/
#include "biquadfilter.h"
#include "blackmisc/verify.h"
#include "blackconfig/buildconfig.h"
#include <QtMath>
#include <algorithm>
using namespace BlackMisc;
using namespace BlackConfig;
namespace BlackSound
{
@@ -19,27 +23,29 @@ namespace BlackSound
float BiQuadFilter::transform(float inSample)
{
// compute result
double result = a0 * inSample + a1 * x1 + a2 * x2 - a3 * y1 - a4 * y2;
double result = m_a0 * inSample + m_a1 * m_x1 + m_a2 * m_x2 - m_a3 * m_y1 - m_a4 * m_y2;
// shift x1 to x2, sample to x1
x2 = x1;
x1 = inSample;
m_x2 = m_x1;
m_x1 = inSample;
// shift y1 to y2, result to y1
y2 = y1;
y1 = static_cast<float>(result);
m_y2 = m_y1;
m_y1 = static_cast<float>(result);
return y1;
return m_y1;
}
void BiQuadFilter::setCoefficients(double aa0, double aa1, double aa2, double b0, double b1, double b2)
{
if (CBuildConfig::isLocalDeveloperDebugBuild()) { BLACK_VERIFY_X(qAbs(aa0) > 1E-06, Q_FUNC_INFO, "Div by zero?"); }
// precompute the coefficients
a0 = b0 / aa0;
a1 = b1 / aa0;
a2 = b2 / aa0;
a3 = aa1 / aa0;
a4 = aa2 / aa0;
m_a0 = b0 / aa0;
m_a1 = b1 / aa0;
m_a2 = b2 / aa0;
m_a3 = aa1 / aa0;
m_a4 = aa2 / aa0;
}
void BiQuadFilter::setLowPassFilter(float sampleRate, float cutoffFrequency, float q)

View File

@@ -8,8 +8,8 @@
//! \file
#ifndef BIQUADFILTER_H
#define BIQUADFILTER_H
#ifndef BLACKSOUND_DSP_BIQUADFILTER_H
#define BLACKSOUND_DSP_BIQUADFILTER_H
#include "blacksound/blacksoundexport.h"
@@ -24,28 +24,34 @@ namespace BlackSound
//! Ctor
BiQuadFilter() = default;
//! Transform
float transform(float inSample);
//! Set filter parameters @{
void setCoefficients(double aa0, double aa1, double aa2, double b0, double b1, double b2);
void setLowPassFilter(float sampleRate, float cutoffFrequency, float q);
void setPeakingEq(float sampleRate, float centreFrequency, float q, float dbGain);
void setHighPassFilter(float sampleRate, float cutoffFrequency, float q);
//! @}
//! Get filters @{
static BiQuadFilter lowPassFilter(float sampleRate, float cutoffFrequency, float q);
static BiQuadFilter highPassFilter(float sampleRate, float cutoffFrequency, float q);
static BiQuadFilter peakingEQ(float sampleRate, float centreFrequency, float q, float dbGain);
//! @}
private:
double a0;
double a1;
double a2;
double a3;
double a4;
double m_a0 = 0.0;
double m_a1 = 0.0;
double m_a2 = 0.0;
double m_a3 = 0.0;
double m_a4 = 0.0;
// state
float x1 = 0.0;
float x2 = 0.0;
float y1 = 0.0;
float y2 = 0.0;
float m_x1 = 0.0;
float m_x2 = 0.0;
float m_y1 = 0.0;
float m_y2 = 0.0;
};
} // ns
} // ns