AS - example 4 - noise of current converter

Figure 1: C:\jobs\Maxima\AS\ex\_img\ex4.png
Result

Figure above (embedded only in *.wxmx file) shows a linear model of a current converter.
Transfer functions are processed below to calculate output noise.

(%i94) /* working directory must be explicitly defined HERE ! */
kill(all) $
file_search_maxima : append(["c:/jobs/Maxima/AS/ex/libs/###.{mac,mc}"],file_search_maxima ) $
load("_myUnits") $
load("_myFunctions") $
/* suppress ratsimp warnings */
ratprint: false $
algebraic:true $
keepfloat:true $
fpprintprec: 4 $
/* GNU plot (default) or wxplot for 0 */
GNUPLOTFLAG: 0 $
wxplot_size:[800,400] $
/* Debug level 0 - none 3 - all */
DBG: 0 $
/* By default, all symbols, are considered to represent real numbers */
declare(s, complex) $

Result

(%i12) /* AS */
/* U=Kn*vn+M*I+Mn*in+My*iy */
Da: (s^(2)*(C1*C+C2*C)+s*(C*Y2+C2*g)+Y2*g) $
DbKn: (g)*(s*(C1+C2)+Y2) $
Kn:DbKn/Da $
DbM: (g)*(1) $
M:DbM/Da $
DbMn: (g)*(1) $
Mn:DbMn/Da $
DbMy: (g)*(1) $
My:DbMy/Da $
/* ------ */
Kn(s):=ratsimp(Kn) $
M(s):=ratsimp(M) $
Mn(s):=ratsimp(Mn) $
My(s):=ratsimp(My) $
/* circuit parameters */
R2: 100*kOhm $
Y2: 1/R2 $
C1: 5.8*pF $
C2: 0.76*pF $
/* OP-AMP */
ft: 16*MHz $
C: 3*pF $
GBW: 2*(%pi)*ft $
/* GBW = g/C */
g:GBW*C $
/* OP-AMP noise */
e_n: 16*nV $
F_ce: 1000*Hz $
i_n: 0.001 * pA $
F_ci: 1000*Hz $
/* noise bandwidth - limits for integration of noise density functions */
f_n1: 1 $
f_n2: 100*ft $
/* reference voltage noise density is a R noise */
e_R: sqrt(4*kT*R2) $

(%i40) /* OP-AMP VOLTAGE NOISE CONTRIBUTION */
Se(f) := e_n^2*(1+F_ce/f) $
define(K_n(s),float(ratsimp(ev(Kn(s),[C=float(C), g=float(g), Y2=float(Y2), C2=float(C2), C1=float(C1)])))) $
DBG_2("Kn(s) = ",Kn(s)) $
DBG_2("K_n(s) = ",K_n(s)) $
gainK_n(f) := cabs(K_n(%i*2*%pi*f)) $
define(GK_n(f), float(ratsimp(gainK_n(f)))) $
DBE_2("GK_n(f) = ", GK_n(f)) $
define(S_e(f),float(ratsimp(ev(Se(f),[e_n=float(e_n),F_ce=float(F_ce)])))) $
DBG_2("S_e(f) = ", S_e(f)) $
Soe(f) := S_e(f) * (GK_n(f))^2 $
define(S_oe(f),float(ratsimp(Soe(f)))) $
DBG_2("S_oe(f) = ", S_oe(f)) $
/* OP-AMP CURRENT and Y CURRENT NOISE NOISE CONTRIBUTION */
Si(f) := i_n^2*(1+F_ci/f) $
Sy(f) := 4*kT*Y2 $
define(M_n(s),float(ratsimp(ev(Mn(s),[C=float(C), g=float(g), Y=float(Y), Y2=float(Y2), C2=float(C2), C1=float(C1)])))) $
DBG_2("M_n(s) = ",M_n(s)) $
gainM_n(f) := cabs(M_n(%i*2*%pi*f)) $
define(GM_n(f), float(ratsimp(gainM_n(f)))) $
DBG_2("GM_n(f) = ", GM_n(f)) $
define(S_i(f),float(ratsimp(ev(Si(f),[i_n=float(i_n),F_ci=float(F_ci)])))) $
define(S_y(f),float(ratsimp(ev(Sy(f),[kT=float(kT),Y2=float(Y2)])))) $
DBG_2("S_i(f) = ", S_i(f)) $
DBG_2("S_y(f) = ", S_y(f)) $
Soi(f) := S_i(f) * (GM_n(f))^2 $
define(S_oi(f),float(ratsimp(Soi(f)))) $
DBG_2("S_oi(f) = ", S_oi(f)) $
Soy(f) := S_y(f) * (GM_n(f))^2 $
define(S_oy(f),float(ratsimp(Soy(f)))) $
DBG_2("S_oy(f) = ", S_oy(f)) $

(%i69) /* power noise density integration */
key:1 $
intE:quad_qag(S_oe(f),f,f_n1,f_n2,key) $
ve_uV:float(sqrt(ev(intE[1]))/uV) $
intI1:quad_qag(S_oi(f),f,f_n1,f_n2,key) $
vi_uV:float(sqrt(ev(intI1[1]))/uV) $
intY1:quad_qag(S_oy(f),f,f_n1,f_n2,key) $
vy_uV:float(sqrt(ev(intY1[1]))/uV) $
/* total voltage noise i_n f_n2-f_n1 bandwidth */
vo_uV:float(sqrt(vy_uV^2 + vi_uV^2 + ve_uV^2)) $

(%i77) print("R2 = ", R2/kOhm, "[kOhm]") $
print("C1 = ", C1/pF, "[pF]") $
print("C2 = ", C2/pF, "[pF]") $
print("ft = ", ft/MHz, "[MHz]") $
print("C = ", C/pF, "[pF]") $
print("g = ", float(g/mS), "[mS]") $
print("e_n = ", e_n/nV, "[nV/sqrt(Hz)]") $
print("F_ce = ", F_ce, "[Hz]") $
print("i_n = ", i_n/pA, "[pA/sqrt(Hz)]") $
print("F_ci = ", F_ci, "[Hz]") $

Result

(%i87) print("vo = sqrt(ve^2+vi^2+vy^2) = ", vo_uV, "[uV]") $
print("vE = ", ve_uV, "[uV]") $
print("vI = ", vi_uV, "[uV]") $
print("vY = ", vy_uV, "[uV]") $

Result

(%i91) XplotdB( [10*log10(S_oe(f)/(e_R^2)), 10*log10(S_oi(f)/(e_R^2)),
10*log10(S_oy(f)/(e_R^2))], f_n1,f_n2 ,
["10*log10(S_oe(f)/(e_R^2))", "10*log10(S_oi(f)/(e_R^2))", "10*log10(S_oy(f)/(e_R^2))"] ) $

Result

(%i92) XplotdB( [20*log10(GK_n(f)), 20*log10(GM_n(f)/R2)],
f_n1,f_n2 , ["20*log10(GK_n(f))", "20*log10(GM_n(f)/R2)"] ) $

Result

(%i93) XplotdB( [10*log10(S_e(f)/(e_R^2)), 10*log10(S_i(f)/((e_R/R2)^2)),
10*log10(S_y(f)/((e_R/R2)^2))], f_n1,f_n2,
["10*log10(S_e(f)/(e_R2^2))","10*log10(S_i(f)/((e_n/R2)^2))", "10*log10(S_y(f)/((e_R/R2)^2))"] ) $

Result


Created with wxMaxima.