summaryrefslogtreecommitdiffstats
path: root/volume_pot/volume.f
blob: 7a22ed16c40a9b91ca96539acdb34c2f3ab019f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
        FUNCTION LOGPOT(X)
        REAL*4 X, LOGPOT
        REAL*4 YM, A, B
        
        DATA  YM /0.2/
        
        B = ((1. / YM) - 1.) ** 2.
        
        A = 1. / (B - 1.)

        LOGPOT = A * (B ** X) - A
        END FUNCTION


        FUNCTION LOGPRO(V, T1, T2)
        REAL*4 V, T1, T2, LOGPRO
        REAL*4 LOGPOT
        REAL*4 LV, LT1, LT2

        LV = LOGPOT(V)
        LT1 = LOGPOT(T1)
        LT2 = LOGPOT(T2)

        LOGPRO = (LV - LT1) / (LT2 - LT1)
        END FUNCTION

        FUNCTION PAR(A, B)
        COMPLEX*8 A, B, PAR

        PAR = 1. / ((1. / A) + (1. / B))
        END FUNCTION

        FUNCTION CAP(C, F)
        REAL*4 C, F, PI
        COMPLEX*8 CAP

        DATA PI /3.14159265358979/
        
        CAP = (0, -1) / ( C * 2 * PI * F)
        END FUNCTION

        FUNCTION GAIN(F, K)
        REAL*4 F, K, GAIN

        REAL*4 LOGPOT
        REAL*4 LOGPRO
        COMPLEX*8 PAR
        COMPLEX*8 CAP

        REAL*4 TE, TD, RAC
        REAL*4 RAE, RAD, RED, RDC, TOT
        COMPLEX*8 LD, LE

        COMPLEX*8 ERAE, ERAD, ERED, ERAC, ERDC, ETOT
        COMPLEX*8 PE, PD, PA, PED, PDA, G
        REAL*4 V

        DATA TE /0.4/
        DATA TD /0.6/
        DATA RAC /470.E3/

        LD = 18.E3 + CAP( 47.E-9, F)
        LE = 4.7E3 + CAP( 250.E-9, F)

        
        RAE = RAC * LOGPOT(TE)
        RAD = RAC * LOGPOT(TD)

        RED = RAD - RAE
        RDC = RAC - RAD

        TOT = RAE + RED + RDC

        WRITE(*,*) "TRACK RESISTANCES: ", RAE, "+", RED, "+", 
     C      RDC, "=", TOT

        ERAE = PAR(RAE * (1, 0.), LE)
        ERAD = PAR(ERAE + RED, LD)
        ERED = ERAD - ERAE
        ERAC = ERAD + RDC
        ERDC = ERAC - ERAD

        ETOT = ERAC + 150000. + CAP(15.E-9, F) + 
     C      PAR((1100., 0.), CAP(120.E-9, F))

        WRITE(*, *) "EFFECTIVE TOTAL IMPEDANCE", ERAE, "+",
     C      ERED, "+", ERDC, "=", ERAC

        PE  = ERAE / ETOT
        PD  = ERAD / ETOT
        PA  = ERAC / ETOT
        PED = PD - PE
        PDA = PA - PD
    
        V = K / 10.

        IF (V.LT.TE) THEN
          G = PE * LOGPRO(V, 0., TE)
        ELSEIF (V.LT.TD) THEN
          G = PE + (PED * LOGPRO(V, TE, TD))
        ELSE
          G = PD + ( PDA * LOGPRO( V, TD, 1. ) )
        ENDIF

        GAIN = ABS(G)
        END FUNCTION


        PROGRAM MAIN
        INTEGER*4 K
        REAL*4 F, G, GMAX
        CHARACTER*13 FN
        CHARACTER*1 FNA
        INTEGER*1 INA
        DIMENSION FNA(13), INA(13)
        EQUIVALENCE(FN,FNA,INA)
        DATA FNA /'V','O','L','U','M','E','-','0','0','.','D','A','T'/


        OPEN (UNIT = 10, FILE = 'VOLUME.PLT', ACCESS = 'SEQUENTIAL', 
     C      STATUS = 'UNKNOWN')

        WRITE(10, *) 'set term png size 1280,1024'
        WRITE(10, *) 'set output "volume.png"'
        WRITE(10, *) 'set logscale x'
        WRITE(10, *) 'set logscale y'
        WRITE(10, *) 'set yrange [:1.1]'
        WRITE(10, *) 'set xlabel "frequency/Hz"'
        WRITE(10, *) 'set ylabel "gain"'
        WRITE(10, *) 'plot \';

        DO 40 K = 1, 10
 
        FNA(8) = '0'
        INA(8) = INA(8) + (K / 10)
        FNA(9) = '0'
        INA(9) = INA(9) + MOD(K, 10)

        WRITE(10, *) '    "', FN, '" using 1:2 with lines title "',
     C      K,'", \'

        OPEN (UNIT = 11, FILE = FN, ACCESS = 'SEQUENTIAL', 
     C      STATUS = 'UNKNOWN')


        GMAX = 0.

        F = 20.
10      G = GAIN(F, 1. * K)
        IF (G.GT.GMAX) THEN
          GMAX = G
        END IF
        F = F * 1.1
        IF (F - 20.E3) 10,10,20
20      F = 20.
30      G = GAIN(F, 1. * K)
        WRITE(11, *) F, G, G / GMAX
        F = F * 1.1
        IF (F - 20.E3) 30,30,40
40      CONTINUE

        CLOSE(10)

        WRITE(11,*) ''
        CLOSE(11)

        CALL SYSTEM('gnuplot VOLUME.PLT')

        END PROGRAM