summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2019-01-18 00:43:56 +1100
committerDamien Zammit <damien@zamaudio.com>2019-01-18 00:45:25 +1100
commitdcbadc8a7bed06053e5959df484e07ecef80a68e (patch)
tree612bf2c61a64665eead719b75814d29069a2f08a
parentcd14015b9253626d5786d49ba763468eecdf22ce (diff)
Revert to full solution, this taylor expansion sucks && revert tube params
-rw-r--r--plugins/ZamTube/triode.cpp44
-rw-r--r--plugins/ZamTube/triode.h8
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