diff --git a/Amplifier_BJT/auto_match.py b/Amplifier_BJT/auto_match.py new file mode 100644 index 0000000000000000000000000000000000000000..06f00ff77de5c3453ba9dc1304a43d4117899916 --- /dev/null +++ b/Amplifier_BJT/auto_match.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +""" +Space Baron Team +nats` + +Transistor Auto Matcher + +Take S parameters file input +""" + +import os +import sys +import math +import cmath + +''' Open S2P Files and extract data ''' +def parse_spar(file, freq): + f = open(file, "r") + tmpspars = [] + for line in f: + tmpspars.append(line.strip().split()) + + spars = {}#[] # 1: Freq 2: S11 3: S21 4: S12 5: S22 + for l in tmpspars: + if(l[0] != "!" and l[0] != "#"): + tmp = [] + #tmp.append(float(l[0])) # FREQ + tmp.append(complex(float(l[1]), float(l[2]))) # S11 + tmp.append(complex(float(l[3]), float(l[4]))) # S21 + tmp.append(complex(float(l[5]), float(l[6]))) # S12 + tmp.append(complex(float(l[7]), float(l[8]))) # S22 + #spars.append(tmp) + spars[float(l[0])] = tmp + return spars + +''' Calculate John Rollett stability factor ''' +def calc_stab(Ds, S): + K = (1 + cmath.polar(Ds)[0] ** 2 - cmath.polar(S[11])[0] ** 2 - \ + cmath.polar(S[22])[0] ** 2) / (2 * cmath.polar(S[21])[0] * cmath.polar(S[12])[0]) + return K + +''' Caculate Maximum Available Gain ''' +def calc_mag(Ds, S, K): + B1 = 1 + cmath.polar(S[11])[0] ** 2 - cmath.polar(S[22])[0] ** 2 - cmath.polar(Ds)[0] ** 2 + + ksq = 0.0 + if B1 < 0 : + ksq = math.sqrt(K**2 - 1) + else : + ksq = math.sqrt(k**2 - 1) * -1 + + MAG = 10 * math.log(cmath.polar(S[11])[0] / cmath.polar(S[12])[0]) + \ + 10 * math.log(K + ksq) + + return MAG + +def calc_value(freq, spars, config): + sparam = spars[freq] + S = {} + S[11] = sparam[0] + S[21] = sparam[1] + S[12] = sparam[2] + S[22] = sparam[3] + + Ds = S[11] * S[22] - S[12] * S[21] + K = calc_stab(Ds, S) + + if K < 1 : + print("Warning ! K factor %f < 1.0 , amplifier could be unstable" % K) + print("Undefined Maximum Available Gain") + else : + print("Stable amplifier design. K factor %f >= 1" % K) + MAG = calc_mag(Ds, S, K) + print("Maximum Available Gain: %fdB" % MAG) + + #Select the kind of configuration for the amplifier + if config == 'SCM' : + # Simultaneous Conjugate Match + print("Simulaneous Conjugate Match") + + elif config == 'ONF' : + # Optimum Noise Figure + print("Not yet available") + else : + print("Unknown mode") + +if __name__ == '__main__': + if(len(sys.argv) < 4): + print("Error: usage\nauto_match.py spar_file.s2p frequency configuration\n") + exit(-1) + fname = sys.argv[1] + freq = float(sys.argv[2]) + config = sys.argv[3] + spars = parse_spar(fname, freq) + calc_value(freq, spars, config) + \ No newline at end of file