summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2018-08-18 20:58:24 +1000
committerDamien Zammit <damien@zamaudio.com>2018-08-18 20:58:24 +1000
commit1aab0b117fe0288091490b264970b1b22c1a1b18 (patch)
treef395b10eaad25183efa010409061a8a96e55fa8b
parentfbdbf082fef6c5e9cd7796c8e6726c8e98c7c040 (diff)
ZamTube: Fix Taylor expansion as per original zamvalve optimization by fundamental
-rw-r--r--plugins/ZamTube/triode.cpp23
-rw-r--r--plugins/ZamTube/triode.h6
2 files changed, 22 insertions, 7 deletions
diff --git a/plugins/ZamTube/triode.cpp b/plugins/ZamTube/triode.cpp
index f725fd0..b40220f 100644
--- a/plugins/ZamTube/triode.cpp
+++ b/plugins/ZamTube/triode.cpp
@@ -89,21 +89,28 @@ T Triode::fgdash(T VG) {
T Triode::ffp(T VP) {
static bool prepared = false;
- static double coeff[4];
if(!prepared) {
//go go series expansion
const double L2 = log(2.0);
const double scale = pow(L2,gamma-2)/(8.0*pow(c,gamma));
- coeff[0] = 8.0*L2*L2*scale;
- coeff[1] = gamma*c*L2*4*scale;
- coeff[2] = (c*c*gamma*gamma+L2*c*c*gamma-c*c*gamma)*scale;
- coeff[3] = 0.0;
+ ffp_raw[0] = 8.0*L2*L2*scale;
+ ffp_raw[1] = gamma*c*L2*4*scale;
+ ffp_raw[2] = (c*c*gamma*gamma+L2*c*c*gamma-c*c*gamma)*scale;
prepared = true;
}
- double A = VP/mu+vg;
- return (Pb+Pr*((g*(coeff[0]+coeff[1]*A+coeff[2]*A*A))+(Gb-vg)/Gr)-VP);
+ return ffp_coeff[0]+ffp_coeff[1]*VP+ffp_coeff[2]*VP*VP;
+}
+
+void Triode::prepare(void)
+{
+ const double c0 = ffp_raw[0],
+ c1 = ffp_raw[1],
+ c2 = ffp_raw[2];
+ ffp_coeff[0] = Pb + Pr*Gb/Gr + c2*Pr*vg*vg - Pr*vg/Gr + c1*Pr*vg + c0*Pr;
+ ffp_coeff[1] = 2.*c2*Pr*vg/mu + c1*Pr/mu - 1.;
+ ffp_coeff[2] = c2*Pr/(mu*mu);
}
T Triode::ffp_insane(T VP) {
@@ -405,6 +412,8 @@ T Triode::zeroffp ( T a, T b, T t )
T sa;
T sb;
T tol;
+
+ prepare();
//
// Make local copies of A and B.
//
diff --git a/plugins/ZamTube/triode.h b/plugins/ZamTube/triode.h
index e7a70fb..a3b50ba 100644
--- a/plugins/ZamTube/triode.h
+++ b/plugins/ZamTube/triode.h
@@ -67,6 +67,7 @@ public:
Triode();
void compute(T Kbb, T Gbb, T Pbb);
+ void prepare(void);
T getC(void);
T getG(void);
T getP(void);
@@ -79,6 +80,11 @@ public:
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 );
+
+private:
+ //Taylor series coefficients for fast calculations
+ double ffp_raw[3];
+ double ffp_coeff[3];
};
#endif