diff options
author | Damien Zammit <damien@zamaudio.com> | 2019-01-18 00:43:56 +1100 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2019-01-18 00:45:25 +1100 |
commit | dcbadc8a7bed06053e5959df484e07ecef80a68e (patch) | |
tree | 612bf2c61a64665eead719b75814d29069a2f08a | |
parent | cd14015b9253626d5786d49ba763468eecdf22ce (diff) |
Revert to full solution, this taylor expansion sucks && revert tube params
-rw-r--r-- | plugins/ZamTube/triode.cpp | 44 | ||||
-rw-r--r-- | plugins/ZamTube/triode.h | 8 |
2 files changed, 22 insertions, 30 deletions
diff --git a/plugins/ZamTube/triode.cpp b/plugins/ZamTube/triode.cpp index a847a2f..9796063 100644 --- a/plugins/ZamTube/triode.cpp +++ b/plugins/ZamTube/triode.cpp @@ -23,40 +23,24 @@ T Triode::compute(T a, T R, T Vg, T Vk) { return b; } -T Triode::getIa(T Vgk, T Vpk) { - static bool prepared = false; - static double coeff[3]; - - if (!prepared) { - const double L2 = log(2.0); - const double scale = 1e+6*pow(L2, kx-2.0)/(8.0*pow(kp, kx)); - coeff[0] = 8.0*L2*L2*scale; - coeff[1] = kx*kp*L2*4.0*scale; - coeff[2] = (kp*kp*kx*kx + L2*kp*kp*kx - kp*kp*kx) * scale; - prepared = true; - } - +T Triode::getIa(T Vgk, T Vpk) const { if (Vpk < 0.0) { - //printf("Less than zero!\n"); Vpk = 0.0; } if (Vgk > 0.0) { Vgk = 0.0; } - double A = 1./mu + Vgk / sqrt(kvb + Vpk*Vpk); - return Vpk*(coeff[0] + coeff[1]*A + coeff[2]*A*A) / kg1; - - /* exact solution (takes > 3x longer) - e1 = Vpk*log1p(exp(kp*(1./mu+Vgk/sqrt(kvb+Vpk*Vpk))))/kp; - if (e1 < 0) { - return 0.; - } - return 1e+6*pow(e1, kx) / kg1; - */ + /* exact solution (expensive) */ + T ee1 = Vpk*log1p(exp(kp*(1./mu+Vgk/sqrt(kvb+Vpk*Vpk))))/kp; + if (ee1 < 0) { + return 0.; + } + //printf("Vpk=%f ans=%f e1=%f exact_e1=%f\n", Vpk, ans, e1, ee1); + return 1e+6*pow(ee1, kx) / kg1; } -T Triode::iterateNewtonRaphson(T x, T dx, T Vgk, T a, T R){ +T Triode::iterateNewtonRaphson(T x, T dx, T Vgk, T a, T R) const { T xIak = getIa(Vgk, x); T dxIak = getIa(Vgk, x + dx); T xNew = x - dx*(x + R*xIak - a)/(dx + R*(dxIak - xIak)); @@ -65,10 +49,18 @@ T Triode::iterateNewtonRaphson(T x, T dx, T Vgk, T a, T R){ Triode::Triode() { - //12AX7 RSD-1 + /* good for low gain, broken at high gain kvb = 300.; mu = 103.2; kx = 1.26; kg1 = 446.0; kp = 3.4; + */ + + //12AX7 RSD-1 (custom) + mu = 100.; + kx = 1.4; + kg1 = 446.; + kp = 600.; + kvb = 300.; } diff --git a/plugins/ZamTube/triode.h b/plugins/ZamTube/triode.h index 1d3b927..2f678a0 100644 --- a/plugins/ZamTube/triode.h +++ b/plugins/ZamTube/triode.h @@ -32,13 +32,13 @@ typedef double T; class Triode { public: - T mu, kp, kvb, kg1, kx; - Triode(); T compute(T a, T R, T Vg, T Vk); - T getIa(T Vgk, T Vak); - T iterateNewtonRaphson(T x, T dx, T Vgk, T a, T R); bool insane; +private: + inline T getIa(T Vgk, T Vak) const; + T iterateNewtonRaphson(T x, T dx, T Vgk, T a, T R) const; + T mu, kp, kvb, kg1, kx; }; #endif |