summaryrefslogtreecommitdiff
path: root/plugins/ZamTube/triode.h
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2017-01-24 21:37:38 +1100
committerDamien Zammit <damien@zamaudio.com>2017-02-11 18:45:23 +1100
commit03aab7106523afe225a13034566659e0453b99d2 (patch)
tree07c3109a46610418662999263fe901997147c37f /plugins/ZamTube/triode.h
parent482aaa982428cd30b5cfca2555dc448be6c15873 (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.h81
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