Line data Source code
1 : /**
2 : * \file DempwolfTriodeFunction.h
3 : * http://recherche.ircam.fr/pub/dafx11/Papers/76_e.pdf
4 : */
5 :
6 : #ifndef ATK_PREAMPLIFIER_DEMPWOLFTRIODEFUNCTION_H
7 : #define ATK_PREAMPLIFIER_DEMPWOLFTRIODEFUNCTION_H
8 :
9 : #include <ATK/Utility/fmath.h>
10 :
11 : #include <cmath>
12 :
13 : namespace ATK
14 : {
15 : /// A more complex triode model, used with TriodeFilter
16 : template <typename DataType_>
17 : class DempwolfTriodeFunction
18 : {
19 : private:
20 : const DataType_ G;
21 : const DataType_ mu;
22 : const DataType_ gamma;
23 : const DataType_ C;
24 :
25 : const DataType_ Gg;
26 : const DataType_ eta;
27 : const DataType_ Cg;
28 : const DataType_ Ig0;
29 :
30 : DataType_ CgVbe;
31 : DataType_ lnCgVbe;
32 : DataType_ powlnCgVbe;
33 : DataType_ CVceVbe;
34 : DataType_ lnCVceVbe;
35 : DataType_ powlnCVceVbe;
36 : public:
37 : /// For non static models
38 : const DataType_ Cpg;
39 :
40 : /// Compute grid current
41 14025 : DataType_ Lb(DataType_ Vbe, DataType_ Vce)
42 : {
43 14025 : CgVbe = fmath::exp(Cg * Vbe);
44 14025 : lnCgVbe = fmath::log(1 + CgVbe) / Cg;
45 14025 : powlnCgVbe = fmath::pow(lnCgVbe, eta - 1);
46 14025 : return Ig0 + Gg * lnCgVbe * powlnCgVbe;
47 : }
48 :
49 : /// Compute grid current derivative relative to the grid cathode voltage
50 28050 : DataType_ Lb_Vbe(DataType_ Vbe, DataType_ Vce)
51 : {
52 28050 : return Gg * eta * (CgVbe / (1 + CgVbe)) * powlnCgVbe;
53 : }
54 :
55 : /// Compute grid current derivative relative to the plate cathode voltage
56 14025 : DataType_ Lb_Vce(DataType_ Vbe, DataType_ Vce)
57 : {
58 14025 : return 0;
59 : }
60 :
61 : /// Compute plate current
62 14025 : DataType_ Lc(DataType_ Vbe, DataType_ Vce)
63 : {
64 14025 : CVceVbe = fmath::exp(C * (Vce / mu + Vbe));
65 14025 : lnCVceVbe = fmath::log(1 + CVceVbe) / C;
66 14025 : powlnCVceVbe = fmath::pow(lnCVceVbe, gamma - 1);
67 14025 : return G * lnCVceVbe * powlnCVceVbe - (Ig0 + Gg * lnCgVbe * powlnCgVbe);
68 : }
69 :
70 : /// Compute plate current derivative relative to the grid cathode voltage
71 14025 : DataType_ Lc_Vbe(DataType_ Vbe, DataType_ Vce)
72 : {
73 14025 : return G * gamma * (CVceVbe / (1 + CVceVbe)) * powlnCVceVbe - Lb_Vbe(Vbe, Vce);
74 : }
75 :
76 : /// Compute plate current derivative relative to the plate cathode voltage
77 14025 : DataType_ Lc_Vce(DataType_ Vbe, DataType_ Vce)
78 : {
79 14025 : return G * gamma * (CVceVbe / (1 + CVceVbe)) * powlnCVceVbe / mu;
80 : }
81 :
82 : /// Constructor
83 1 : DempwolfTriodeFunction(DataType_ G, DataType_ mu, DataType_ gamma, DataType_ C, DataType_ Gg, DataType_ eta, DataType_ Cg, DataType_ Ig0, DataType_ Cpg)
84 1 : :G(G), mu(mu), gamma(gamma), C(C), Gg(Gg), eta(eta), Cg(Cg), Ig0(Ig0), Cpg(Cpg)
85 : {
86 1 : }
87 :
88 : /// Build a new triode function for a filter (12AX7/ECC83)
89 1 : static DempwolfTriodeFunction build_standard_function(DataType_ G = 1.371e-3, DataType_ mu = 83.9, DataType_ gamma = 1.349, DataType_ C = 4.56, DataType_ Gg = 3.263e-4, DataType_ eta = 1.156, DataType_ Cg = 11.99, DataType_ Ig0 = 3.917e-8, DataType_ Cpg = 1.7e-12)
90 : {
91 1 : return DempwolfTriodeFunction(G, mu, gamma, C, Gg, eta, Cg, Ig0, Cpg);
92 : }
93 :
94 : /// Build a new triode function for a filter (12AX7/ECC83)
95 : static DempwolfTriodeFunction build_alternate_function_1()
96 : {
97 : return DempwolfTriodeFunction(2.242e-3, 103.2, 1.26, 3.40, 6.177e-4, 1.314, 9.901, 8.025e-8, 1.7e-12);
98 : }
99 :
100 : /// Build a new triode function for a filter (12AX7/ECC83)
101 : static DempwolfTriodeFunction build_alternate_function_2()
102 : {
103 : return DempwolfTriodeFunction(2.173e-3, 100.2, 1.28, 3.19, 5.911e-4, 1.358, 11.76, 4.527e-8, 1.7e-12);
104 : }
105 :
106 : };
107 : }
108 :
109 : #endif
|