Line data Source code
1 : /**
2 : * \file ModifiedMunroPiazzaTriodeFunction.h
3 : * From http://www.duncanamps.com/spice/valves/dm12ax7s.inc
4 : */
5 :
6 : #ifndef ATK_PREAMPLIFIER_MODIFIEDMUNROPIAZZATRIODEFUNCTION_H
7 : #define ATK_PREAMPLIFIER_MODIFIEDMUNROPIAZZATRIODEFUNCTION_H
8 :
9 : #include <ATK/Utility/fmath.h>
10 :
11 : #include <cmath>
12 : #include <iostream>
13 :
14 : namespace ATK
15 : {
16 : /// Tube model, used with TriodeFilter from Munro and Piazza
17 : template <typename DataType_>
18 : class ModifiedMunroPiazzaTriodeFunction
19 : {
20 : private:
21 : const DataType_ mu;
22 : const DataType_ K;
23 : const DataType_ Kp;
24 : const DataType_ Kvb;
25 : const DataType_ Kg;
26 : const DataType_ sigma;
27 : const DataType_ sqrt_sigma;
28 :
29 : DataType_ sqrt_muvbe;
30 : DataType_ E1;
31 : DataType_ sqrt_E1;
32 :
33 : public:
34 : /// For non static models
35 : const DataType_ Cpg;
36 :
37 : /// Compute grid current
38 0 : DataType_ Lb(DataType_ Vbe, DataType_ Vce)
39 : {
40 0 : if(mu + Vbe > 0)
41 : {
42 0 : sqrt_muvbe = std::sqrt(sigma + (mu + Vbe) * (mu + Vbe) * (mu + Vbe));
43 0 : return K * (sqrt_muvbe - sqrt_sigma);
44 : }
45 0 : return 0;
46 : }
47 :
48 : /// Compute grid current derivative relative to the grid cathode voltage
49 0 : DataType_ Lb_Vbe(DataType_ Vbe, DataType_ Vce)
50 : {
51 0 : if(mu + Vbe > 0)
52 : {
53 0 : return 3 * K * (mu + Vbe) * (mu + Vbe) / (2 * sqrt_muvbe);
54 : }
55 0 : return 0;
56 : }
57 :
58 : /// Compute grid current derivative relative to the plate cathode voltage
59 0 : DataType_ Lb_Vce(DataType_ Vbe, DataType_ Vce)
60 : {
61 0 : return 0;
62 : }
63 :
64 : /// Compute plate current
65 0 : DataType_ Lc(DataType_ Vbe, DataType_ Vce)
66 : {
67 0 : E1 = Kp + Vce + Kg * Vbe;
68 0 : if (E1 > 0 && Vbe >= 0 && Vbe <= 5)
69 : {
70 0 : sqrt_E1 = std::sqrt(E1);
71 0 : return Vce / 5 * Kvb * sqrt_E1 * E1;
72 : }
73 0 : return 0;
74 : }
75 :
76 : /// Compute plate current derivative relative to the grid cathode voltage
77 0 : DataType_ Lc_Vbe(DataType_ Vbe, DataType_ Vce)
78 : {
79 0 : if (E1 > 0 && Vbe >= 0 && Vbe <= 5)
80 : {
81 0 : return Kg * Vce / 5 * Kvb * sqrt_E1 * 1.5F;
82 : }
83 0 : return 0;
84 : }
85 :
86 : /// Compute plate current derivative relative to the plate cathode voltage
87 0 : DataType_ Lc_Vce(DataType_ Vbe, DataType_ Vce)
88 : {
89 0 : if (E1 > 0 && Vbe >= 0 && Vbe <= 5)
90 : {
91 0 : return Kvb * sqrt_E1 * E1 / 5 + Vce / 5 * Kvb * sqrt_E1 * 1.5F;
92 : }
93 0 : return 0;
94 : }
95 :
96 : /// Constructor
97 : ModifiedMunroPiazzaTriodeFunction(DataType_ mu, DataType_ K, DataType_ Kp, DataType_ Kvb, DataType_ Kg, DataType_ sigma, DataType_ Cpg)
98 : :mu(mu), K(K), Kp(Kp), Kvb(Kvb), Kg(Kg), sigma(sigma), sqrt_sigma(std::sqrt(sigma)), Cpg(Cpg)
99 : {
100 : }
101 :
102 : /// Build a new triode function for a filter (12AX7/ECC83)
103 : static ModifiedMunroPiazzaTriodeFunction build_standard_function(DataType_ mu = 0.2, DataType_ K = 5e-6, DataType_ Kp = 45, DataType_ Kvb = 1.147e-6, DataType_ Kg = 95.43, DataType_ sigma = 1, DataType_ Cpg = 1.7e-12)
104 : {
105 : return ModifiedMunroPiazzaTriodeFunction(mu, K, Kp, Kvb, Kg, sigma, Cpg);
106 : }
107 : };
108 : }
109 :
110 : #endif
|