Example 5

Noise analysis of cascaded resistor V->I and I->V amplifier

../../_images/viiv.png

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}}\]