Refactored to try to split up the defaults from the main code
This is going to get ugly fast if I don't keep on top of it.
This commit is contained in:
		
							parent
							
								
									855e35367d
								
							
						
					
					
						commit
						fe6d3436e9
					
				
					 4 changed files with 198 additions and 52 deletions
				
			
		
							
								
								
									
										101
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,101 @@
 | 
				
			||||||
 | 
					# Byte-compiled / optimized / DLL files
 | 
				
			||||||
 | 
					__pycache__/
 | 
				
			||||||
 | 
					*.py[cod]
 | 
				
			||||||
 | 
					*$py.class
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# C extensions
 | 
				
			||||||
 | 
					*.so
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Distribution / packaging
 | 
				
			||||||
 | 
					.Python
 | 
				
			||||||
 | 
					env/
 | 
				
			||||||
 | 
					build/
 | 
				
			||||||
 | 
					develop-eggs/
 | 
				
			||||||
 | 
					dist/
 | 
				
			||||||
 | 
					downloads/
 | 
				
			||||||
 | 
					eggs/
 | 
				
			||||||
 | 
					.eggs/
 | 
				
			||||||
 | 
					lib/
 | 
				
			||||||
 | 
					lib64/
 | 
				
			||||||
 | 
					parts/
 | 
				
			||||||
 | 
					sdist/
 | 
				
			||||||
 | 
					var/
 | 
				
			||||||
 | 
					wheels/
 | 
				
			||||||
 | 
					*.egg-info/
 | 
				
			||||||
 | 
					.installed.cfg
 | 
				
			||||||
 | 
					*.egg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# PyInstaller
 | 
				
			||||||
 | 
					#  Usually these files are written by a python script from a template
 | 
				
			||||||
 | 
					#  before PyInstaller builds the exe, so as to inject date/other infos into it.
 | 
				
			||||||
 | 
					*.manifest
 | 
				
			||||||
 | 
					*.spec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Installer logs
 | 
				
			||||||
 | 
					pip-log.txt
 | 
				
			||||||
 | 
					pip-delete-this-directory.txt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Unit test / coverage reports
 | 
				
			||||||
 | 
					htmlcov/
 | 
				
			||||||
 | 
					.tox/
 | 
				
			||||||
 | 
					.coverage
 | 
				
			||||||
 | 
					.coverage.*
 | 
				
			||||||
 | 
					.cache
 | 
				
			||||||
 | 
					nosetests.xml
 | 
				
			||||||
 | 
					coverage.xml
 | 
				
			||||||
 | 
					*.cover
 | 
				
			||||||
 | 
					.hypothesis/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Translations
 | 
				
			||||||
 | 
					*.mo
 | 
				
			||||||
 | 
					*.pot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Django stuff:
 | 
				
			||||||
 | 
					*.log
 | 
				
			||||||
 | 
					local_settings.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Flask stuff:
 | 
				
			||||||
 | 
					instance/
 | 
				
			||||||
 | 
					.webassets-cache
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Scrapy stuff:
 | 
				
			||||||
 | 
					.scrapy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Sphinx documentation
 | 
				
			||||||
 | 
					docs/_build/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# PyBuilder
 | 
				
			||||||
 | 
					target/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Jupyter Notebook
 | 
				
			||||||
 | 
					.ipynb_checkpoints
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# pyenv
 | 
				
			||||||
 | 
					.python-version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# celery beat schedule file
 | 
				
			||||||
 | 
					celerybeat-schedule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SageMath parsed files
 | 
				
			||||||
 | 
					*.sage.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# dotenv
 | 
				
			||||||
 | 
					.env
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# virtualenv
 | 
				
			||||||
 | 
					.venv
 | 
				
			||||||
 | 
					venv/
 | 
				
			||||||
 | 
					ENV/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Spyder project settings
 | 
				
			||||||
 | 
					.spyderproject
 | 
				
			||||||
 | 
					.spyproject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Rope project settings
 | 
				
			||||||
 | 
					.ropeproject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# mkdocs documentation
 | 
				
			||||||
 | 
					/site
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# mypy
 | 
				
			||||||
 | 
					.mypy_cache/
 | 
				
			||||||
							
								
								
									
										20
									
								
								LPRDefaultPlotting.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								LPRDefaultPlotting.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					################################################################################
 | 
				
			||||||
 | 
					# Define the prefered plotting defaults.
 | 
				
			||||||
 | 
					# These generally translate to how I want stuff to show up in IEEE papers.
 | 
				
			||||||
 | 
					# Note that when I do my debugging, I override figure.figsize in my testing
 | 
				
			||||||
 | 
					# enviornment.
 | 
				
			||||||
 | 
					################################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from matplotlib import rcParams, pyplot as pp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rcParams['grid.alpha'] = 0.7
 | 
				
			||||||
 | 
					rcParams['grid.linestyle'] = ':'
 | 
				
			||||||
 | 
					rcParams['font.family'] = ['serif']
 | 
				
			||||||
 | 
					rcParams['font.size'] = 9.0
 | 
				
			||||||
 | 
					rcParams['mathtext.fontset'] = 'dejavuserif'
 | 
				
			||||||
 | 
					rcParams['mathtext.it'] = 'serif:italic'
 | 
				
			||||||
 | 
					rcParams['mathtext.bf'] = 'serif:bold'
 | 
				
			||||||
 | 
					rcParams['mathtext.sf'] = 'serif'
 | 
				
			||||||
 | 
					rcParams['mathtext.tt'] = 'monospace'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										49
									
								
								TankGlobals.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								TankGlobals.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,49 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					import numpy as np
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					################################################################################
 | 
				
			||||||
 | 
					# Operating Enviornment
 | 
				
			||||||
 | 
					#####
 | 
				
			||||||
 | 
					f0		= 28
 | 
				
			||||||
 | 
					bw0		= 6.5 # assumed tuning range (GHz)
 | 
				
			||||||
 | 
					bw_plt	= 2 # Plotting range (GHz)
 | 
				
			||||||
 | 
					fbw		= bw0/f0 # fractional bandwidth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					frequency_sweep_steps = 101
 | 
				
			||||||
 | 
					gamma_sweep_steps = 15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gamma = 1 - np.power(f0 / (f0 + bw0/2),2)
 | 
				
			||||||
 | 
					gamma_limit_ratio = 0.99 # how close gamma can get to theoretical extreme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Configuration Of Hardware
 | 
				
			||||||
 | 
					#####
 | 
				
			||||||
 | 
					q1_L	= 10
 | 
				
			||||||
 | 
					q1_C	= 10
 | 
				
			||||||
 | 
					l1		= 100e-3 # nH
 | 
				
			||||||
 | 
					gm1		= 25e-3 # S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Compute frequency sweep
 | 
				
			||||||
 | 
					#####
 | 
				
			||||||
 | 
					w0		= f0*2*np.pi
 | 
				
			||||||
 | 
					fbw_plt	= bw_plt/f0
 | 
				
			||||||
 | 
					delta	= np.linspace(-fbw_plt/2,fbw_plt/2,frequency_sweep_steps)
 | 
				
			||||||
 | 
					w		= w0*(1+delta)
 | 
				
			||||||
 | 
					f		= f0*(1+delta)
 | 
				
			||||||
 | 
					jw		= 1j*w
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##################
 | 
				
			||||||
 | 
					# Compute system 
 | 
				
			||||||
 | 
					#####
 | 
				
			||||||
 | 
					c1		= 1/(w0*w0*l1)
 | 
				
			||||||
 | 
					g1_L	= 1 / (q1_L*w0*l1)
 | 
				
			||||||
 | 
					g1_C	= w0 * c1 / q1_C
 | 
				
			||||||
 | 
					g1		= g1_L + g1_C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Verify gamma is valid
 | 
				
			||||||
 | 
					#####
 | 
				
			||||||
 | 
					gamma_max = g1 * np.sqrt(l1/c1)
 | 
				
			||||||
 | 
					if gamma > (gamma_limit_ratio * gamma_max):
 | 
				
			||||||
 | 
						print("==> WARN: Gamma to large, reset to %.3f (was %.3f) <==" % \
 | 
				
			||||||
 | 
							(gamma_max_cap*gamma_max, gamma))
 | 
				
			||||||
 | 
						gamma = gamma_max_cap*gamma_max
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										80
									
								
								tankPlot.py
									
										
									
									
									
								
							
							
						
						
									
										80
									
								
								tankPlot.py
									
										
									
									
									
								
							| 
						 | 
					@ -1,60 +1,42 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import numpy as np
 | 
					import numpy as np
 | 
				
			||||||
from matplotlib import rcParams, pyplot as pp
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
rcParams['figure.figsize'] = [10,7]
 | 
					from matplotlib import rcParams, pyplot as pp
 | 
				
			||||||
default_window_position='+20+80'
 | 
					import LPRDefaultPlotting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
sys.path.append("./pySmithPlot")
 | 
					sys.path.append("./pySmithPlot")
 | 
				
			||||||
import smithplot
 | 
					import smithplot
 | 
				
			||||||
from smithplot import SmithAxes
 | 
					from smithplot import SmithAxes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
# Operating Enviornment
 | 
					# Define my helper functions.
 | 
				
			||||||
#####
 | 
					def dB20(volt_tf):
 | 
				
			||||||
f0		= 28
 | 
						"""Describe signal gain of a transfer function in dB (i.e. 20log(x))"""
 | 
				
			||||||
bw0		= 6.5 # assumed tuning range (GHz)
 | 
						return 20*np.log10(np.abs(volt_tf))
 | 
				
			||||||
bw_plt	= 1 # Plotting range (GHz)
 | 
					def ang(volt_tf):
 | 
				
			||||||
fbw		= bw0/f0 # fractional bandwidth
 | 
						"""Describe phase of a transfer function in degrees. Not unwrapped."""
 | 
				
			||||||
 | 
						return 180/np.pi*np.angle(volt_tf)
 | 
				
			||||||
 | 
					def ang_unwrap(volt_tf):
 | 
				
			||||||
 | 
						"""Describe phase of a transfer function in degrees. With unwrapping."""
 | 
				
			||||||
 | 
						return 180/np.pi*np.unwrap(np.angle(volt_tf))
 | 
				
			||||||
 | 
					def dB10(pwr_tf):
 | 
				
			||||||
 | 
						"""Describe power gain of a transfer function in dB (i.e. 10log(x))"""
 | 
				
			||||||
 | 
						return 10*np.log10(np.abs(pwr_tf))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
frequency_sweep_steps = 101
 | 
					 | 
				
			||||||
gamma_sweep_steps = 15
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
gamma = 1 - np.power(f0 / (f0 + bw0/2),2)
 | 
					################################################################################
 | 
				
			||||||
gamma_limit_ratio = 0.99 # how close gamma can get to theoretical extreme
 | 
					# Override the defaults for this script
 | 
				
			||||||
 | 
					rcParams['figure.figsize'] = [10,7]
 | 
				
			||||||
 | 
					default_window_position='+20+80'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Configuration Of Hardware
 | 
					################################################################################
 | 
				
			||||||
#####
 | 
					# Operating Enviornment (i.e. circuit parameters)
 | 
				
			||||||
q1_L	= 10
 | 
					from TankGlobals import *
 | 
				
			||||||
q1_C	= 10
 | 
					 | 
				
			||||||
l1		= 100e-3 # nH
 | 
					 | 
				
			||||||
gm1		= 25e-3 # S
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Compute frequency sweep
 | 
					################################################################################
 | 
				
			||||||
#####
 | 
					# Now generate the sweep of resonance tuning (gamma, and capacitance)
 | 
				
			||||||
w0		= f0*2*np.pi
 | 
					 | 
				
			||||||
fbw_plt	= bw_plt/f0
 | 
					 | 
				
			||||||
delta	= np.linspace(-fbw_plt/2,fbw_plt/2,frequency_sweep_steps)
 | 
					 | 
				
			||||||
w		= w0*(1+delta)
 | 
					 | 
				
			||||||
f		= f0*(1+delta)
 | 
					 | 
				
			||||||
jw		= 1j*w
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##################
 | 
					 | 
				
			||||||
# Compute system 
 | 
					 | 
				
			||||||
#####
 | 
					 | 
				
			||||||
c1		= 1/(w0*w0*l1)
 | 
					 | 
				
			||||||
g1_L	= 1 / (q1_L*w0*l1)
 | 
					 | 
				
			||||||
g1_C	= w0 * c1 / q1_C
 | 
					 | 
				
			||||||
g1		= g1_L + g1_C
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Verify gamma is valid
 | 
					 | 
				
			||||||
#####
 | 
					 | 
				
			||||||
gamma_max = g1 * np.sqrt(l1/c1)
 | 
					 | 
				
			||||||
if gamma > (gamma_limit_ratio * gamma_max):
 | 
					 | 
				
			||||||
	print("==> WARN: Gamma to large, reset to %.3f (was %.3f) <==" % \
 | 
					 | 
				
			||||||
		(gamma_max_cap*gamma_max, gamma))
 | 
					 | 
				
			||||||
	gamma = gamma_max_cap*gamma_max
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
gamma_swp = np.linspace(-gamma,gamma,gamma_sweep_steps);
 | 
					gamma_swp = np.linspace(-gamma,gamma,gamma_sweep_steps);
 | 
				
			||||||
# compute correction factor for g1 that will produce common gain at f0
 | 
					# compute correction factor for g1 that will produce common gain at f0
 | 
				
			||||||
| 
						 | 
					@ -72,12 +54,6 @@ print('    Rp = %.3f Ohm' % (1/g1))
 | 
				
			||||||
print('    Max G1 boost %.2fmS (%.1f%% of gm1)' % \
 | 
					print('    Max G1 boost %.2fmS (%.1f%% of gm1)' % \
 | 
				
			||||||
	(1e3*np.max(np.abs(g1_boost)), 100*np.max(g1_ratio)))
 | 
						(1e3*np.max(np.abs(g1_boost)), 100*np.max(g1_ratio)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def db(volt_tf):
 | 
					 | 
				
			||||||
	return 20*np.log10(np.abs(volt_tf))
 | 
					 | 
				
			||||||
def ang(volt_tf):
 | 
					 | 
				
			||||||
	return 180/np.pi*np.angle(volt_tf)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#y_tank=np.zeros((len(delta),len(gamma_swp)))
 | 
					 | 
				
			||||||
h = pp.figure()
 | 
					h = pp.figure()
 | 
				
			||||||
mgr = pp.get_current_fig_manager()
 | 
					mgr = pp.get_current_fig_manager()
 | 
				
			||||||
ax1 = h.add_subplot(2,2,1, projection='smith')
 | 
					ax1 = h.add_subplot(2,2,1, projection='smith')
 | 
				
			||||||
| 
						 | 
					@ -94,8 +70,8 @@ for itune,gamma_tune in enumerate(gamma_swp):
 | 
				
			||||||
	tf = gm1 / g1_tune * \
 | 
						tf = gm1 / g1_tune * \
 | 
				
			||||||
		1j*(1+delta) / \
 | 
							1j*(1+delta) / \
 | 
				
			||||||
		( 1j*(1+delta) + K*(1 - (1+gamma_tune)*np.power(1+delta,2)) )
 | 
							( 1j*(1+delta) + K*(1 - (1+gamma_tune)*np.power(1+delta,2)) )
 | 
				
			||||||
	ax2.plot(np.angle(tf), db(tf))
 | 
						ax2.plot(np.angle(tf), dB20(tf))
 | 
				
			||||||
	ax3.plot(f,db(tf))
 | 
						ax3.plot(f,dB20(tf))
 | 
				
			||||||
	ax4.plot(f,ang(tf))
 | 
						ax4.plot(f,ang(tf))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
| 
						 | 
					@ -105,7 +81,7 @@ ax2.set_title('Transfer Function')
 | 
				
			||||||
ax3.set_title('TF Gain')
 | 
					ax3.set_title('TF Gain')
 | 
				
			||||||
ax3.set_ylabel('Gain (dB)')
 | 
					ax3.set_ylabel('Gain (dB)')
 | 
				
			||||||
ax4.set_title('TF Phase')
 | 
					ax4.set_title('TF Phase')
 | 
				
			||||||
ax3.set_ylabel('Phase (deg)')
 | 
					ax4.set_ylabel('Phase (deg)')
 | 
				
			||||||
for ax_T in [ax3, ax4]:
 | 
					for ax_T in [ax3, ax4]:
 | 
				
			||||||
	ax_T.grid()
 | 
						ax_T.grid()
 | 
				
			||||||
	ax_T.set_xlabel('Freq (GHz)')
 | 
						ax_T.set_xlabel('Freq (GHz)')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue