diff options
author | Damien Zammit <damien@zamaudio.com> | 2017-01-24 21:37:38 +1100 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2017-02-11 18:45:23 +1100 |
commit | 03aab7106523afe225a13034566659e0453b99d2 (patch) | |
tree | 07c3109a46610418662999263fe901997147c37f /plugins/ZamTube/triode.h | |
parent | 482aaa982428cd30b5cfca2555dc448be6c15873 (diff) |
Wild ZamTube DSP!
Signed-off-by: Damien Zammit <damien@zamaudio.com>
Diffstat (limited to 'plugins/ZamTube/triode.h')
-rw-r--r-- | plugins/ZamTube/triode.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/plugins/ZamTube/triode.h b/plugins/ZamTube/triode.h new file mode 100644 index 0000000..fd2da51 --- /dev/null +++ b/plugins/ZamTube/triode.h @@ -0,0 +1,81 @@ +/* +wdf.h +Copyright (C) 2013 Damien Zammit + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ +#ifndef __WDF_H__ +#define __WDF_H__ + +#include <math.h> + +#define BIG 1e12 +#define SMALL 1e-14 +#define EPSILON 1e-9 +#define ITER 50 +#define SWAP_PP(x,y) {T tmp=y; y=x; x=tmp;} +#define SWAP_PN(x,y) {T tmp=y; y=-x; x=tmp;} +#define SWAP_NP(x,y) {T tmp=y; y=x; x=-tmp;} +#define SWAP_NN(x,y) {T tmp=y; y=-x; x=-tmp;} +#define TOLERANCE 1e-6 + +typedef double T; + +static inline float +sanitize_denormal(float v) { + if(!std::isnormal(v) || !std::isfinite(v)) + return 0.f; + return v; +} + +class Triode { +public: + T Kb, Gb, Pb; + T Kr, Gr, Pr; + + T vg, vk, vp; + T g, mu, gamma, c, gg, e, cg, ig0; + T g1, mu1, gamma1, c1, gg1, e1, cg1, ig01; + T g2, mu2, gamma2, c2, gg2, e2, cg2, ig02; + + T ffg(T VG); + T fgdash(T VG); + T ffp(T VP); + T ffp_insane(T VP); + T fpdash(T VP); + T ffk(); + T secantfg(T *i1, T *i2); + T newtonfg(T *i1); + T secantfp(T *i1, T *i2); + T newtonfp(T *i1); + bool insane; + + Triode(); + void compute(T Kbb, T Gbb, T Pbb); + T getC(void); + T getG(void); + T getP(void); + + //Brent's method + T r8_abs ( T x ); + T r8_epsilon; + T r8_max ( T x, T y ); + T r8_sign ( T x ); + T zeroffp ( T a, T b, T t ); + T zeroffp_insane ( T a, T b, T t ); + T zeroffg ( T a, T b, T t ); +}; + +#endif |