Mercurial > hg > beaglert
diff projects/d-box/Biquad.h @ 0:8a575ba3ab52
Initial commit.
author | andrewm |
---|---|
date | Fri, 31 Oct 2014 19:10:17 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/projects/d-box/Biquad.h Fri Oct 31 19:10:17 2014 +0100 @@ -0,0 +1,99 @@ +// +// Biquad.h +// +// Created by Nigel Redmon on 11/24/12 +// EarLevel Engineering: earlevel.com +// Copyright 2012 Nigel Redmon +// +// For a complete explanation of the Biquad code: +// http://www.earlevel.com/main/2012/11/25/biquad-c-source-code/ +// +// License: +// +// This source code is provided as is, without warranty. +// You may copy and distribute verbatim copies of this document. +// You may modify and use this source code to create binary code +// for your own purposes, free or commercial. +// + +#ifndef Biquad_h +#define Biquad_h + +enum { + bq_type_lowpass = 0, + bq_type_highpass, + bq_type_bandpass, + bq_type_notch, + bq_type_peak, + bq_type_lowshelf, + bq_type_highshelf +}; + +class Biquad { +public: + Biquad(); + Biquad(int type, double Fc, double Q, double peakGainDB); + ~Biquad(); + void setType(int type); + void setQ(double Q); + void setFc(double Fc); + void setPeakGain(double peakGainDB); + void setBiquad(int type, double Fc, double Q, double peakGain); + float process(float in); + + double getQ(); + double getFc(); + double getPeakGain(); + + double getStartingQ(); + double getStartingFc(); + double getStartingPeakGain(); + +protected: + void calcBiquad(void); + + int type; + double a0, a1, a2, b1, b2; + double Fc, Q, peakGain; + double startFc, startQ, startPeakGain; + double z1, z2; +}; + +inline double Biquad::getQ() +{ + return Q; +} + +inline double Biquad::getFc() +{ + return Fc; +} + +inline double Biquad::getPeakGain() +{ + return peakGain; +} + +inline double Biquad::getStartingQ() +{ + return startQ; +} + +inline double Biquad::getStartingFc() +{ + return startFc; +} + +inline double Biquad::getStartingPeakGain() +{ + return startPeakGain; +} + +inline float Biquad::process(float in) { + double out = in * a0 + z1; + z1 = in * a1 + z2 - b1 * out; + z2 = in * a2 - b2 * out; + return out; +} + +#endif // Biquad_h