Example 5¶
Noise analysis of cascaded resistor V->I and I->V amplifier¶
In this example we are analyzing a balanced resistor V->I converter and a I->V amplifier in cascade. The active element of the I->V amplifier is a noise nullor with imput referred noise sources \(v_{n,1}\) and \(i_{n,1}\).
The goal is to use the symbolic 2-port analysis to calculate gain and input referred noise.
from sympy import *
import numpy, pylab
from pycircuit.circuit import *
Ri,Rfb,Sv1,Si1,mu = symbols('R_i R_{fb} S_{v_{1}} S_{i_{1}} mu', real=True, positive=True)
## Create circuit
cir = SubCircuit(toolkit=symbolic_poly)
cir['Ri1'] = R('vinp', 1, r=Ri, toolkit=symbolic_poly)
cir['Ri2'] = R('vinn', 2, r=Ri, toolkit=symbolic_poly)
cir['Rfb1'] = R(1, 'voutp', r=Rfb, toolkit=symbolic_poly)
cir['Rfb2'] = R(2, 'voutn', r=Rfb, toolkit=symbolic_poly)
cir['Vn'] = VS(1, 3, vac=0, noisePSD = Sv1, toolkit=symbolic_poly)
cir['In'] = IS(3, 2, iac=0, noisePSD = Si1, toolkit=symbolic_poly)
cir['nullor'] = Nullor(3,2,'voutp','voutn', toolkit=symbolic_poly)
## Run symbolic 2-port analysis
twoport_ana = TwoPortAnalysis(cir, 'vinp', 'vinn', 'voutp', 'voutn', method='sparam', noise=True)
result = twoport_ana.solve(freqs=Symbol('s'), complexfreq=True, refnode=Node('vinn'))
## Print ABCD parameter matrix
ABCD = Matrix(result['twoport'].A)
ABCD.simplify()
ABCD
\[\begin{split}\left[\begin{matrix}- \frac{R_{i}}{R_{fb}} & 0\\- \frac{1}{2 R_{fb}} & 0\end{matrix}\right]\end{split}\]
Calculate Voltage gain (mu)
mu_calc = 1 / ABCD[0,0]
mu_calc
\[- \frac{R_{fb}}{R_{i}}\]
Solve for Rfb
mu_solve = solve(mu-abs(mu_calc),Rfb)
mu_solve[0]
\[R_{i} \mu\]
Input referred voltage noise power spectral density
a = expand(result['Svn'])
collect(a,[Sv1,Si1,twoport_ana.par.epar.T*twoport_ana.toolkit.kboltzmann])
\[4 R_{i}^{2} S_{i_{1}} + S_{v_{1}} \left(\frac{R_{i}^{2}}{R_{fb}^{2}} + \frac{2 R_{i}}{R_{fb}} + 1\right) + T k \left(\frac{8 R_{i}^{2}}{R_{fb}} + 8 R_{i}\right)\]
Using Rfb = μ * Ri
collect(expand(a.subs({Rfb:mu_solve[0]})),[Sv1,Si1,twoport_ana.par.epar.T*twoport_ana.toolkit.kboltzmann])
\[4 R_{i}^{2} S_{i_{1}} + S_{v_{1}} \left(1 + \frac{2}{\mu} + \frac{1}{\mu^{2}}\right) + T k \left(8 R_{i} + \frac{8 R_{i}}{\mu}\right)\]
Input referred current noise power spectral density
collect(expand(result['Sin']).subs({Rfb:mu_solve[0]}),[Sv1,Si1,twoport_ana.par.epar.T*twoport_ana.toolkit.kboltzmann])
\[S_{i_{1}} + \frac{2 T k}{R_{i} \mu} + \frac{S_{v_{1}}}{4 R_{i}^{2} \mu^{2}}\]