diff options
author | Damien Zammit <damien@zamaudio.com> | 2020-12-03 21:28:08 +1100 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2020-12-03 21:28:08 +1100 |
commit | e2fa01a01ec30d6c55783d979c1c8ea541856e46 (patch) | |
tree | 549cb274b61513dd24566ffd06de00eaebef858b | |
parent | e8058b60888280fd4aab47baaec48cdf3a36fb6e (diff) |
ZamTube: Use thevenin equivalent for tube as a voltage generator + variable resistorzamtube-optimise
-rw-r--r-- | plugins/ZamTube/triode.cpp | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/plugins/ZamTube/triode.cpp b/plugins/ZamTube/triode.cpp index ac5ff6e..d48f097 100644 --- a/plugins/ZamTube/triode.cpp +++ b/plugins/ZamTube/triode.cpp @@ -5,7 +5,8 @@ using std::abs; #define DUMP(x) x -T Triode::compute(T a, T R, T Vg, T Vk) { +#if 0 +T Triode::compute_old(T a, T R, T Vg, T Vk) { T VakGuess = 100.; T Vgk = Vg - Vk; T Vak = VakGuess; @@ -22,6 +23,7 @@ T Triode::compute(T a, T R, T Vg, T Vk) { //printf("Vgate=%f Vk=%f Vgk=%f b=%f\n", Vgate, Vk, Vgk, b); return b; } +#endif T Triode::getIa(T Vgk, T Vpk) const { if (Vpk < 0.0) { @@ -47,16 +49,43 @@ T Triode::iterateNewtonRaphson(T x, T dx, T Vgk, T a, T R) const { return xNew; } + +T Triode::compute(T a, T R, T Vg, T Vk) { + T mu1, vp2, vgg, evgg, evgg1, levgg1, powkx, pkxvg; + T dIpVp, ra; + T Vp, Ip, Vpk, Vgk, b; + + Vgk = Vk - Vg; + Vpk = -mu * Vgk; + Ip = getIa(Vgk, Vpk); + + b = Vpk - R*Ip; + Vp = a - R*Ip; + + mu1 = 1.0/mu; + vp2 = sqrt(Vp*Vp + kvb); + vgg = Vg / vp2 + mu1; + evgg = exp(kp*vgg); + evgg1 = 1. + evgg; + levgg1 = log1p(evgg); + powkx = pow(Vp*levgg1/kp, kx - 1.0); + pkxvg = kx*powkx*evgg; + + dIpVp = pkxvg/(vp2*evgg1); + ra = kg1 / dIpVp; + if (ra < 1.) + ra = 1.; + + //dIpVg = Vp*pkxvg*(vgg/(kp*evgg1) - levgg1/(kp*kp)); + //gm = dIpVg / kg1; + + b = Vpk - (R + 0.1/ra)*Ip; + return b; + +} + Triode::Triode() { - /* 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; @@ -64,3 +93,4 @@ Triode::Triode() kp = 600.; kvb = 300.; } + |