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
|