Equivalent Input Noise Generators
Generated from NOISE.wxm with rfMaxima 0.2.5 on Maxima 5.46.0.
All results were computed by executing the notebook; none is transcribed.
/* Put rfMaxima.mac in the same directory as this notebook, or add its
directory to file_search_maxima. */
load("rfMaxima.mac")$
See "Analysis and Design of Analog Integrated Circuits", 4th Ed., by P. R. Gray, P. J. Hurst, S. H. Lewis, R. G. Meyer, Wiley, 2001, p. 768-773
declare([r_b,r_pi,C_pi,g_m,r_o],[constant,real,scalar])$
assume(r_b>0)$
assume(r_pi>0)$
assume(C_pi>0)$
assume(g_m>0)$
assume(r_o>0)$
Sign conventions in this notebook:
* The NOMINAL equation set below writes i_out flowing INTO the network, which is what Solution2Y() expects. * The NOISE equation sets write -i_out, i.e. i_out flowing OUT of the network, which is what the ABCD referral below expects.
That difference is deliberate, and 0.2.4 never said so.
Referral of an internal noise source to the input:
v_eq = A*v_out|(i_out=0) + B*i_out|(v_out=0) i_eq = C*v_out|(i_out=0) + D*i_out|(v_out=0)
A single linsolve can only deliver ONE of v_out and i_out -- with the input terminated, the two-port still has one free degree of freedom at the output. So "...1" (solved for i_out) gives the B/D term and "...2" (solved for v_out) gives the A/C term, and the two must be SUMMED. 0.2.4 printed the four partial results side by side without saying so, which reads as four independent answers.
ABCD Matrix
Solution:linsolve([v_in-v_1=r_b*i_in,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),i_in=i_1+i_2,i_out=i_3+g_m*v_1,v_out=r_o*i_3],[i_in,i_out,i_1,i_2,i_3,v_1]);
define(ABCD(s),Y2ABCD(Solution2Y(Solution)));
r_b Contribution (|v_noise|^2=|v_b|^2=4*k*T*r_b*B)
NoiseSolutionInputShorted1:linsolve([v_noise-v_1=r_b*i_in,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),i_in=i_1+i_2,-i_out=i_3+g_m*v_1,v_out=r_o*i_3],[i_out,i_1,i_2,i_3,v_1,i_in]);
NoiseSolutionInputOpened1:linsolve([v_in-v_1=r_b*i_noise,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),i_noise=i_1+i_2,-i_out=i_3+g_m*v_1,v_out=r_o*i_3],[i_out,i_1,i_2,i_3,v_1,v_in]);
NoiseSolutionInputShorted2:linsolve([v_noise-v_1=r_b*i_in,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),i_in=i_1+i_2,-i_out=i_3+g_m*v_1,v_out=r_o*i_3],[v_out,i_1,i_2,i_3,v_1,i_in]);
NoiseSolutionInputOpened2:linsolve([v_in-v_1=r_b*i_noise,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),i_noise=i_1+i_2,-i_out=i_3+g_m*v_1,v_out=r_o*i_3],[v_out,i_1,i_2,i_3,v_1,v_in]);
v_eq_rb:ratsimp(
NoiseVoltage2EquivalentInputNoiseVoltage(ABCD(s),NoiseSolutionInputShorted1)
+NoiseVoltage2EquivalentInputNoiseVoltage(ABCD(s),NoiseSolutionInputShorted2));
i_eq_rb:ratsimp(
NoiseVoltage2EquivalentInputNoiseCurrent(ABCD(s),NoiseSolutionInputOpened1)
+NoiseVoltage2EquivalentInputNoiseCurrent(ABCD(s),NoiseSolutionInputOpened2));
i_b Contribution (|i_noise|^2=|i_b|^2=2*q*I_B*B+K_1*I_Ba/f*B)
NoiseSolutionInputShorted1:linsolve([-v_1=r_b*i_in,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),i_in=i_1+i_2+i_noise,-i_out=i_3+g_m*v_1,v_out=r_o*i_3],[i_out,i_1,i_2,i_3,v_1,i_in]);
NoiseSolutionInputShorted2:linsolve([-v_1=r_b*i_in,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),i_in=i_1+i_2+i_noise,-i_out=i_3+g_m*v_1,v_out=r_o*i_3],[v_out,i_1,i_2,i_3,v_1,i_in]);
NoiseSolutionInputOpened1:linsolve([v_in=v_1,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),0=i_1+i_2+i_noise,-i_out=i_3+g_m*v_1,v_out=r_o*i_3],[i_out,i_1,i_2,i_3,v_1,v_in]);
NoiseSolutionInputOpened2:linsolve([v_in=v_1,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),0=i_1+i_2+i_noise,-i_out=i_3+g_m*v_1,v_out=r_o*i_3],[v_out,i_1,i_2,i_3,v_1,v_in]);
v_eq_ib:ratsimp(
NoiseCurrent2EquivalentInputNoiseVoltage(ABCD(s),NoiseSolutionInputShorted1)
+NoiseCurrent2EquivalentInputNoiseVoltage(ABCD(s),NoiseSolutionInputShorted2));
i_eq_ib:ratsimp(
NoiseCurrent2EquivalentInputNoiseCurrent(ABCD(s),NoiseSolutionInputOpened1)
+NoiseCurrent2EquivalentInputNoiseCurrent(ABCD(s),NoiseSolutionInputOpened2));
i_c Contribution (|i_noise|^2=|i_c|^2=2*q*I_C*B)
NoiseSolutionInputShorted1:linsolve([-v_1=r_b*i_in,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),i_in=i_1+i_2,-i_out=i_noise+i_3+g_m*v_1,v_out=r_o*i_3],[i_out,i_1,i_2,i_3,v_1,i_in]);
NoiseSolutionInputShorted2:linsolve([-v_1=r_b*i_in,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),i_in=i_1+i_2,-i_out=i_noise+i_3+g_m*v_1,v_out=r_o*i_3],[v_out,i_1,i_2,i_3,v_1,i_in]);
NoiseSolutionInputOpened1:linsolve([v_in=v_1,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),0=i_1+i_2,-i_out=i_noise+i_3+g_m*v_1,v_out=r_o*i_3],[i_out,i_1,i_2,i_3,v_1,v_in]);
NoiseSolutionInputOpened2:linsolve([v_in=v_1,v_1=r_pi*i_1,v_1=i_2/(s*C_pi),0=i_1+i_2,-i_out=i_noise+i_3+g_m*v_1,v_out=r_o*i_3],[v_out,i_1,i_2,i_3,v_1,v_in]);
v_eq_ic:ratsimp(
NoiseCurrent2EquivalentInputNoiseVoltage(ABCD(s),NoiseSolutionInputShorted1)
+NoiseCurrent2EquivalentInputNoiseVoltage(ABCD(s),NoiseSolutionInputShorted2));
i_eq_ic:ratsimp(
NoiseCurrent2EquivalentInputNoiseCurrent(ABCD(s),NoiseSolutionInputOpened1)
+NoiseCurrent2EquivalentInputNoiseCurrent(ABCD(s),NoiseSolutionInputOpened2));
Total Equivalent Input Noise Generators
The three sources (r_b thermal, i_b shot + 1/f, i_c shot) are uncorrelated, so the equivalent input VARIANCES add. Substitute the per-source spectral densities from the section headings before evaluating.
v_eq_total_squared:ratsimp(
(coeff(v_eq_rb,v_noise,1)*v_noise)^2
+(coeff(v_eq_ib,i_noise,1)*i_noise)^2
+(coeff(v_eq_ic,i_noise,1)*i_noise)^2);
i_eq_total_squared:ratsimp(
(coeff(i_eq_rb,v_noise,1)*v_noise)^2
+(coeff(i_eq_ib,i_noise,1)*i_noise)^2
+(coeff(i_eq_ic,i_noise,1)*i_noise)^2);