rfMaxima 0.2.4, January 2013
--> |
disp("rfMaxima 0.2.4, April 2013")$ disp(" Please download most recent version from http://rfmaxima.sourceforge.net")$ disp(" Please E-Mail bug reports and extensions to vcaeken@umich.edu")$ |
--> |
load("bode")$ log10(x):=log(x)/log(10)$ dB10(x):=10*log10(x)$ dB20(x):=20*log10(x)$ |
declare([%alpha,%beta,%delta,%epsilon,%mu,%sigma,%omega,B,d],[real,scalar])$
declare([%gamma,[complex,scalar])$
declare([k_B,T,Z_0],[constant,real,scalar])$
declare([ABCD,G,H,InverseABCD,M,S,Y,Z],nonscalar)$
assume(%alpha>0)$
assume(%beta>0)$
assume(%delta>0)$
assume(%epsilon>0)$
assume(%mu>0)$
assume(%sigma>0)$
assume(%omega>0)$
assume(B>0)$
assume(d>0)$
assume(k_B>0)$
assume(T>0)$
assume(Z_0>0)$
1 Symbolic Simplification
--> |
AbsSymbolic(H):=block( [FactorH,DenominatorH,NumeratorH], FactorH:factor(H), DenominatorH:expand(denom(FactorH)), NumeratorH:expand(num(FactorH)), sqrt(realpart(NumeratorH)^2+imagpart(NumeratorH)^2)/sqrt(realpart(DenominatorH)^2+imagpart(DenominatorH)^2))$ ArgSymbolic(H):=block( [FactorH,DenominatorH,NumeratorH,ConjugateDenominatorH], FactorH:factor(H), DenominatorH:denom(FactorH), NumeratorH:num(FactorH), ConjugateDenominatorH:conjugate(DenominatorH), atan2(ratsimp(imagpart(expand(NumeratorH*ConjugateDenominatorH))),ratsimp(realpart(expand(NumeratorH*ConjugateDenominatorH)))))$ GroupDelaySymbolic(H):=-ratsimp(diff(ArgSymbolic(H),%omega))$ ImSymbolic(H):=block( [FactorH,DenominatorH,NumeratorH,ConjugateDenominatorH], FactorH:factor(H), DenominatorH:denom(FactorH), NumeratorH:num(FactorH), ConjugateDenominatorH:conjugate(DenominatorH), imagpart(expand(NumeratorH*ConjugateDenominatorH))/(DenominatorH*ConjugateDenominatorH))$ ReSymbolic(H):=block( [FactorH,DenominatorH,NumeratorH,ConjugateDenominatorH], FactorH:factor(H), DenominatorH:denom(FactorH), NumeratorH:num(FactorH), ConjugateDenominatorH:conjugate(DenominatorH), realpart(expand(NumeratorH*ConjugateDenominatorH))/(DenominatorH*ConjugateDenominatorH))$ PolesSymbolic(H):=ratsimp(solve(denom(factor(H))=0,s))$ ZerosSymbolic(H):=ratsimp(solve(num(factor(H))=0,s))$ |
2 Transmission Lines
--> |
%alpha_TL(%gamma_TL):=ReSymbolic(%gamma_TL)$ %beta_TL(%gamma_TL):=ImSymbolic(%gamma_TL)$ %gamma_TL(C,G,L,R,s):=sqrt((R+s*L)*(G+s*C))$ Z_TL(C,G,L,R,s):=sqrt((R+s*L)/(G+s*C))$ R_TL(%gamma_TL,Z_TL):=ReSymbolic(%gamma_TL*Z_TL)$ L_TL(%gamma_TL,Z_TL,%omega):=ImSymbolic(%gamma_TL*Z_TL)/%omega$ G_TL(%gamma_TL,Z_TL):=ReSymbolic(%gamma_TL/Z_TL)$ C_TL(%gamma_TL,Z_TL,%omega):=ImSymbolic(%gamma_TL/Z_TL)/%omega$ v_g(%beta_TL,%omega):=ratsimp(1/diff(%beta_TL,%omega))$ GVD(v_g,%omega):=diff(v_g,%omega)$ |
3 Two-Port Parameters
3.1 Two-Port Parameters of Simple Circuits
--> |
define(ABCD_LosslessTL(%beta_TL,l,Z_TL),matrix([cos(%beta_TL*l),%i*Z_TL*sin(%beta_TL*l)],[%i*sin(%beta_TL*l)/Z_TL,cos(%beta_TL*l)]))$ define(ABCD_LossyTL(%gamma_TL,l,Z_TL),matrix([cosh(%gamma_TL*l),Z_TL*sinh(%gamma_TL*l)],[sinh(%gamma_TL*l)/Z_TL,cosh(%gamma_TL*l)]))$ define(ABCD_SeriesImpedance(z),matrix([1,z],[0,1]))$ define(ABCD_ShuntAdmittance(y),matrix([1,0],[y,1]))$ define(ABCD_Transformer(n),matrix([n,0],[0,1/n]))$ define(ABCD_PiNetwork(y1,y2,y3),matrix([1+y2/y3,1/y3],[y1+y2+(y1*y2)/y3,1+y1/y3]))$ define(ABCD_TNetwork(z1,z2,z3),matrix([1+z1/z3,z1+z2+(z1*z2)/z3],[1/z3,1+z2/z3]))$ ABCD_Nullor:matrix([0,0],[0,0])$ define(Z_Gyrator(r),matrix([0,-r],[r,0]))$ |
3.2 Conversion of Linear Equation Set (KCL, KVL) Solution to Two-Port
Parameters (ABCD-, G-, H-, InverseABCD-, Y-, and Z-Parameters)
--> |
Solution2ABCD(Solution):=block( [ABCD_11,ABCD_12,ABCD_21,ABCD_22], ABCD_11:ratsimp(coeff(expand(ev(v_in,Solution)),v_out,1)), ABCD_12:ratsimp(coeff(expand(ev(v_in,Solution)),i_out,1)), ABCD_21:ratsimp(coeff(expand(ev(i_in,Solution)),v_out,1)), ABCD_22:ratsimp(coeff(expand(ev(i_in,Solution)),i_out,1)), matrix([ABCD_11,ABCD_12],[ABCD_21,ABCD_22]))$ |
--> |
Solution2G(Solution):=block( [G_11,G_12,G_21,G_22], G_11:ratsimp(coeff(expand(ev(i_in,Solution)),v_in,1)), G_12:ratsimp(coeff(expand(ev(i_in,Solution)),i_out,1)), G_21:ratsimp(coeff(expand(ev(v_out,Solution)),v_in,1)), G_22:ratsimp(coeff(expand(ev(v_out,Solution)),i_out,1)), matrix([G_11,G_12],[G_21,G_22]))$ |
--> |
Solution2H(Solution):=block( [H_11,H_12,H_21,H_22], H_11:ratsimp(coeff(expand(ev(v_in,Solution)),i_in,1)), H_12:ratsimp(coeff(expand(ev(v_in,Solution)),v_out,1)), H_21:ratsimp(coeff(expand(ev(i_out,Solution)),i_in,1)), H_22:ratsimp(coeff(expand(ev(i_out,Solution)),v_out,1)), matrix([H_11,H_12],[H_21,H_22]))$ |
--> |
Solution2InverseABCD(Solution):=block( [InverseABCD_11,InverseABCD_12,InverseABCD_21,InverseABCD_22], InverseABCD_11:ratsimp(coeff(expand(ev(v_out,Solution)),v_in,1)), InverseABCD_12:ratsimp(coeff(expand(ev(v_out,Solution)),i_in,1)), InverseABCD_21:ratsimp(coeff(expand(ev(i_out,Solution)),v_in,1)), InverseABCD_22:ratsimp(coeff(expand(ev(i_out,Solution)),i_in,1)), matrix([InverseABCD_11,InverseABCD_12],[InverseABCD_21,InverseABCD_22]))$ |
--> |
Solution2Y(Solution):=block( [Y_11,Y_12,Y_21,Y_22], Y_11:ratsimp(coeff(expand(ev(i_in,Solution)),v_in,1)), Y_12:ratsimp(coeff(expand(ev(i_in,Solution)),v_out,1)), Y_21:ratsimp(coeff(expand(ev(i_out,Solution)),v_in,1)), Y_22:ratsimp(coeff(expand(ev(i_out,Solution)),v_out,1)), matrix([Y_11,Y_12],[Y_21,Y_22]))$ |
--> |
Solution2Z(Solution):=block( [Z_11,Z_12,Z_21,Z_22], Z_11:ratsimp(coeff(expand(ev(v_in,Solution)),i_in,1)), Z_12:ratsimp(coeff(expand(ev(v_in,Solution)),i_out,1)), Z_21:ratsimp(coeff(expand(ev(v_out,Solution)),i_in,1)), Z_22:ratsimp(coeff(expand(ev(v_out,Solution)),i_out,1)), matrix([Z_11,Z_12],[Z_21,Z_22]))$ |
3.3 Two-Port Parameter Conversions (ABCD-, G-, H-, InverseABCD-, S-, Y-, and Z-Parameters)
--> |
ABCD2H(ABCD):=block( [H_11,H_12,H_21,H_22], H_11:ratsimp(ABCD[1,2]/ABCD[2,2]), H_12:ratsimp(-(ABCD[1,1]*ABCD[2,2]-ABCD[1,2]*ABCD[2,1])/ABCD[2,2]), H_21:ratsimp(-1/ABCD[2,2]), H_22:ratsimp(ABCD[2,1]/ABCD[2,2]), matrix([H_11,H_12],[H_21,H_22]))$ |
--> |
ABCD2S(ABCD):=block( [S_11,S_12,S_21,S_22], S_11:ratsimp((ABCD[1,1]+ABCD[1,2]/Z_0-ABCD[2,1]*Z_0-ABCD[2,2])/(ABCD[1,1]+ABCD[1,2]/Z_0+ABCD[2,1]*Z_0+ABCD[2,2])), S_12:ratsimp(2*(ABCD[1,1]*ABCD[2,2]-ABCD[1,2]*ABCD[2,1])/(ABCD[1,1]+ABCD[1,2]/Z_0+ABCD[2,1]*Z_0+ABCD[2,2])), S_21:ratsimp(2/(ABCD[1,1]+ABCD[1,2]/Z_0+ABCD[2,1]*Z_0+ABCD[2,2])), S_22:ratsimp((-ABCD[1,1]+ABCD[1,2]/Z_0-ABCD[2,1]*Z_0+ABCD[2,2])/(ABCD[1,1]+ABCD[1,2]/Z_0+ABCD[2,1]*Z_0+ABCD[2,2])), matrix([S_11,S_12],[S_21,S_22]))$ |
--> |
ABCD2Y(ABCD):=block( [Y_11,Y_12,Y_21,Y_22], Y_11:ratsimp(ABCD[2,2]/ABCD[1,2]), Y_12:ratsimp(-(ABCD[1,1]*ABCD[2,2]-ABCD[1,2]*ABCD[2,1])/ABCD[1,2]), Y_21:ratsimp(-1/ABCD[1,2]), Y_22:ratsimp(ABCD[1,1]/ABCD[1,2]), matrix([Y_11,Y_12],[Y_21,Y_22]))$ |
--> |
ABCD2Z(ABCD):=block( [Z_11,Z_12,Z_21,Z_22], Z_11:ratsimp(ABCD[1,1]/ABCD[2,1]), Z_12:ratsimp((ABCD[1,1]*ABCD[2,2]-ABCD[1,2]*ABCD[2,1])/ABCD[2,1]), Z_21:ratsimp(1/ABCD[2,1]), Z_22:ratsimp(ABCD[2,2]/ABCD[2,1]), matrix([Z_11,Z_12],[Z_21,Z_22]))$ |
--> |
S2ABCD(S):=block( [ABCD_11,ABCD_12,ABCD_21,ABCD_22], ABCD_11:ratsimp(((1+S[1,1])*(1-S[2,2])+S[1,2]*S[2,1])/(2*S[2,1])), ABCD_12:ratsimp(Z_0*((1+S[1,1])*(1+S[2,2])-S[1,2]*S[2,1])/(2*S[2,1])), ABCD_21:ratsimp(1/Z_0*((1-S[1,1])*(1-S[2,2])-S[1,2]*S[2,1])/(2*S[2,1])), ABCD_22:ratsimp(((1-S[1,1])*(1+S[2,2])+S[1,2]*S[2,1])/(2*S[2,1])), matrix([ABCD_11,ABCD_12],[ABCD_21,ABCD_22]))$ |
--> |
Y2ABCD(Y):=block( [ABCD_11,ABCD_12,ABCD_21,ABCD_22], ABCD_11:ratsimp(-Y[2,2]/Y[2,1]), ABCD_12:ratsimp(-1/Y[2,1]), ABCD_21:ratsimp(-determinant(Y)/Y[2,1]), ABCD_22:ratsimp(-Y[1,1]/Y[2,1]), matrix([ABCD_11,ABCD_12],[ABCD_21,ABCD_22]))$ |
--> |
Y2H(Y):=block( [H_11,H_12,H_21,H_22], H_11:ratsimp(1/Y[1,1]), H_12:ratsimp(-Y[1,2]/Y[1,1]), H_21:ratsimp(Y[2,1]/Y[1,1]), H_22:ratsimp(determinant(Y)/Y[1,1]), matrix([H_11,H_12],[H_21,H_22]))$ |
--> |
Y2S(Y):=block( [S_11,S_12,S_21,S_22], S_11:ratsimp(-((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_0^2+(Y[1,1]-Y[2,2])*Z_0-1)/((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_0^2+(Y[2,2]+Y[1,1])*Z_0+1)), S_12:ratsimp(-(2*Y[1,2]*Z_0)/((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_0^2+(Y[2,2]+Y[1,1])*Z_0+1)), S_21:ratsimp(-(2*Y[2,1]*Z_0)/((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_0^2+(Y[2,2]+Y[1,1])*Z_0+1)), S_22:ratsimp(-((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_0^2+(Y[2,2]-Y[1,1])*Z_0-1)/((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_0^2+(Y[2,2]+Y[1,1])*Z_0+1)), matrix([S_11,S_12],[S_21,S_22]))$ |
--> |
Z2ABCD(Z):=block( [ABCD_11,ABCD_12,ABCD_21,ABCD_22], ABCD_11:ratsimp(Z[1,1]/Z[2,1]), ABCD_12:ratsimp(determinant(Z)/Z[2,1]), ABCD_21:ratsimp(1/Z[2,1]), ABCD_22:ratsimp(Z[2,2]/Z[2,1]), matrix([ABCD_11,ABCD_12],[ABCD_21,ABCD_22]))$ |
--> |
ABCD2InverseABCD(ABCD):=ratsimp(invert(ABCD))$ InverseABCD2ABCD(InverseABCD):=ratsimp(invert(InverseABCD))$ |
--> |
G2H(G):=ratsimp(invert(G))$ H2G(H):=ratsimp(invert(H))$ |
--> |
Y2Z(Y):=ratsimp(invert(Y))$ Z2Y(Z):=ratsimp(invert(Z))$ |
--> |
TwoPortMatrices(Solution):=block( define(Y(s),Solution2Y(ev(Solution))), define(ABCD(s),Y2ABCD(Y(s))), define(H(s),Y2H(Y(s))), define(G(s),H2G(H(s))), define(InverseABCD(s),ABCD2InverseABCD(ABCD(s))), define(S(s),ABCD2S(ABCD(s))), define(Z(s),Y2Z(Y(s))), print("ABCD(s) := ", ABCD(s)), print("G(s) := ", G(s)), print("H(s) := ", H(s)), print("InverseABCD(s) := ", InverseABCD(s)), print("S(s) := ", S(s)), print("Y(s) := ", Y(s)), print("Z(s) := ", Z(s)))$ |
3.4 Three-Port Parameter Conversions (ABCD-, G-, H-, InverseABCD-, S-, Y-, and Z-Parameters)
--> |
Y3_2_S3(Y,Z_1,Z_2,Z_3):=block( [S_11,S_12,S_13,S_21,S_22,S_23,S_31,S_32,S_33], S_11:ratsimp(-(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1-Y[2,2]*Y[3,3]+Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1-Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1-Y[2,2])*Z_2+Y[1,1]*Z_1-1)/(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2+Y[1,1]*Z_1+1)), S_12:ratsimp(-((2*Y[1,2]*Y[3,3]-2*Y[1,3]*Y[3,2])*Z_1*Z_3+2*Y[1,2]*Z_1)/(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2+Y[1,1]*Z_1+1)), S_13:ratsimp(((2*Y[1,2]*Y[2,3]-2*Y[1,3]*Y[2,2])*Z_1*Z_2-2*Y[1,3]*Z_1)/(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2+Y[1,1]*Z_1+1)), S_21:ratsimp(-((2*Y[2,1]*Y[3,3]-2*Y[2,3]*Y[3,1])*Z_2*Z_3+2*Y[2,1]*Z_2)/(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2+Y[1,1]*Z_1+1)), S_22:ratsimp(-(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,3]*Y[3,1]-Y[1,1]*Y[3,3])*Z_1-Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2-Y[1,1]*Z_1-1)/(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2+Y[1,1]*Z_1+1)), S_23:ratsimp(-(((2*Y[1,1]*Y[2,3]-2*Y[1,3]*Y[2,1])*Z_1+2*Y[2,3])*Z_2)/(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2+Y[1,1]*Z_1+1)), S_31:ratsimp((((2*Y[2,1]*Y[3,2]-2*Y[2,2]*Y[3,1])*Z_2-2*Y[3,1])*Z_3)/(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2+Y[1,1]*Z_1+1)), S_32:ratsimp(-(((2*Y[1,1]*Y[3,2]-2*Y[1,2]*Y[3,1])*Z_1+2*Y[3,2])*Z_3)/(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2+Y[1,1]*Z_1+1)), S_33:ratsimp(-(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,2]*Y[2,1]-Y[1,1]*Y[2,2])*Z_1-Y[2,2])*Z_2-Y[1,1]*Z_1-1)/(((((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Y[3,3]+(Y[1,3]*Y[2,1]-Y[1,1]*Y[2,3])*Y[3,2]+(Y[1,2]*Y[2,3]-Y[1,3]*Y[2,2])*Y[3,1])*Z_1+Y[2,2]*Y[3,3]-Y[2,3]*Y[3,2])*Z_2+(Y[1,1]*Y[3,3]-Y[1,3]*Y[3,1])*Z_1+Y[3,3])*Z_3+((Y[1,1]*Y[2,2]-Y[1,2]*Y[2,1])*Z_1+Y[2,2])*Z_2+Y[1,1]*Z_1+1)), matrix([S_11,S_12,S_13],[S_21,S_22,S_23],[S_31,S_32,S_33]))$ |
3.5 S-Parameters
--> |
PowerIV(I,V):=1/2*ReSymbolic(V*conjugate(I))$ PowerIZ(I,Z):=1/2*ReSymbolic(Z_0*I*conjugate(I))$ PowerVZ(V,Z):=1/2*ReSymbolic(V*conjugate(V/Z_0))$ define(Z_IN(s),ratsimp(ev(Z_0*(1+S(s)[1,1])/(1-S(s)[1,1]))))$ define(Z_OUT(s),ratsimp(ev(Z_0*(1+S(s)[2,2])/(1-S(s)[2,2]))))$ |
--> |
SParameters(S):=block( define(Abs_S11(%omega),AbsSymbolic(ev(S(%i*%omega)[1,1]))), print("Abs_S11(%omega) := ",Abs_S11(%omega)), define(Arg_S11(%omega),ArgSymbolic(ev(S(%i*%omega)[1,1]))), print("Arg_S11(%omega) := ",Arg_S11(%omega)), define(Abs_S12(%omega),AbsSymbolic(ev(S(%i*%omega)[1,2]))), print("Abs_S12(%omega) := ",Abs_S12(%omega)), define(Arg_S12(%omega),ArgSymbolic(ev(S(%i*%omega)[1,2]))), print("Arg_S12(%omega) := ",Arg_S12(%omega)), define(Abs_S21(%omega),AbsSymbolic(ev(S(%i*%omega)[2,1]))), print("Abs_S21(%omega) := ",Abs_S21(%omega)), define(Arg_S21(%omega),ArgSymbolic(ev(S(%i*%omega)[2,1]))), print("Arg_S21(%omega) := ",Arg_S21(%omega)), /*Poles_S21:PolesSymbolic(S(s)[2,1]), print("Poles S21 = ", Poles_S21), Zeros_S21:ZerosSymbolic(S(s)[2,1]), print("Zeros S21 = ", Zeros_S21),*/ define(tau_g(%omega),GroupDelaySymbolic(ev(S(%i*%omega)[2,1]))), print("tau_g(%omega) := ",tau_g(%omega)), define(Abs_S22(%omega),AbsSymbolic(ev(S(%i*%omega)[2,2]))), print("Abs_S22(%omega) := ",Abs_S22(%omega)), define(Arg_S22(%omega),ArgSymbolic(ev(S(%i*%omega)[2,2]))), print("Arg_S22(%omega) := ",Arg_S22(%omega)), print("ZIN(s) := ", Z_IN(s)), define(R_IN(%omega),num(ReSymbolic(Z_IN(%i*%omega)))/AbsSymbolic(denom(ReSymbolic(Z_IN(%i*%omega))))), print("R_IN(%omega) := ",R_IN(%omega)), define(X_IN(%omega),num(ImSymbolic(Z_IN(%i*%omega)))/AbsSymbolic(denom(ImSymbolic(Z_IN(%i*%omega))))), print("X_IN(%omega) := ",X_IN(%omega)), print("ZOUT(s) := ", Z_OUT(s)), define(R_OUT(%omega),num(ReSymbolic(Z_OUT(%i*%omega)))/AbsSymbolic(denom(ReSymbolic(Z_OUT(%i*%omega))))), print("R_OUT(%omega) := ",R_OUT(%omega)), define(X_OUT(%omega),num(ImSymbolic(Z_OUT(%i*%omega)))/AbsSymbolic(denom(ImSymbolic(Z_OUT(%i*%omega))))), print("X_OUT(%omega) := ",X_OUT(%omega)), UnityGainH21:solve(AbsSymbolic(ev(H(%i*%omega)[2,1]))=1,%omega), print("%omega_T(%omega) := ",UnityGainH21), UnityGainS21:solve(Abs_S21(%omega)=1,%omega), print("%omega_max(%omega) := ",UnityGainS21))$ |
--> |
SParameters3(S3):=block( define(Abs_S11(%omega),AbsSymbolic(ev(S3(%i*%omega)[1,1]))), print("Abs_S11(%omega) := ",Abs_S11(%omega)), define(Arg_S11(%omega),ArgSymbolic(ev(S3(%i*%omega)[1,1]))), print("Arg_S11(%omega) := ",Arg_S11(%omega)), define(Abs_S12(%omega),AbsSymbolic(ev(S3(%i*%omega)[1,2]))), print("Abs_S12(%omega) := ",Abs_S12(%omega)), define(Arg_S12(%omega),ArgSymbolic(ev(S3(%i*%omega)[1,2]))), print("Arg_S12(%omega) := ",Arg_S12(%omega)), define(Abs_S13(%omega),AbsSymbolic(ev(S3(%i*%omega)[1,3]))), print("Abs_S13(%omega) := ",Abs_S13(%omega)), define(Arg_S13(%omega),ArgSymbolic(ev(S3(%i*%omega)[1,3]))), print("Arg_S13(%omega) := ",Arg_S13(%omega)), define(Abs_S21(%omega),AbsSymbolic(ev(S3(%i*%omega)[2,1]))), print("Abs_S21(%omega) := ",Abs_S21(%omega)), define(Arg_S21(%omega),ArgSymbolic(ev(S3(%i*%omega)[2,1]))), print("Arg_S21(%omega) := ",Arg_S21(%omega)), define(Abs_S22(%omega),AbsSymbolic(ev(S3(%i*%omega)[2,2]))), print("Abs_S22(%omega) := ",Abs_S22(%omega)), define(Arg_S22(%omega),ArgSymbolic(ev(S3(%i*%omega)[2,2]))), print("Arg_S22(%omega) := ",Arg_S22(%omega)), define(Abs_S23(%omega),AbsSymbolic(ev(S3(%i*%omega)[2,3]))), print("Abs_S23(%omega) := ",Abs_S23(%omega)), define(Arg_S23(%omega),ArgSymbolic(ev(S3(%i*%omega)[2,3]))), print("Arg_S23(%omega) := ",Arg_S23(%omega)), define(Abs_S31(%omega),AbsSymbolic(ev(S3(%i*%omega)[3,1]))), print("Abs_S31(%omega) := ",Abs_S31(%omega)), define(Arg_S31(%omega),ArgSymbolic(ev(S3(%i*%omega)[3,1]))), print("Arg_S31(%omega) := ",Arg_S31(%omega)), define(Abs_S32(%omega),AbsSymbolic(ev(S3(%i*%omega)[3,2]))), print("Abs_S32(%omega) := ",Abs_S32(%omega)), define(Arg_S32(%omega),ArgSymbolic(ev(S3(%i*%omega)[3,2]))), print("Arg_S32(%omega) := ",Arg_S32(%omega)), define(Abs_S33(%omega),AbsSymbolic(ev(S3(%i*%omega)[3,3]))), print("Abs_S33(%omega) := ",Abs_S33(%omega)), define(Arg_S33(%omega),ArgSymbolic(ev(S3(%i*%omega)[3,3]))), print("Arg_S33(%omega) := ",Arg_S33(%omega)))$ |
--> |
Stability(S):=block( define(MSG(%omega),ev(if (Abs_S12(%omega)=0) then Abs_S21(%omega) else ratsimp(Abs_S21(%omega)/Abs_S12(%omega)))), print("MSG(%omega) := ", MSG(%omega)), define(Delta(%omega),ratsimp(determinant(ev(S(%i*%omega))))), print("Delta(%omega) := ", Delta(%omega)), define(AbsDelta(%omega),AbsSymbolic(Delta(%omega))), define(K(%omega),ratsimp((1-Abs_S11(%omega)^2-Abs_S22(%omega)^2-AbsDelta(%omega)^2)/(2*Abs_S21(%omega)*Abs_S12(%omega)))), print("K(%omega) :=", K(%omega)), define(mu(%omega),ratsimp((1-Abs_S11(%omega)^2)/(AbsSymbolic(S(%i*%omega)[2,2]-conjugate(S(%i*%omega)[1,1])*Delta(%omega))+Abs_S21(%omega)*Abs_S12(%omega)))), print("mu(%omega) := ", mu(%omega)), define(muprime(%omega),ratsimp((1-Abs_S22(%omega)^2)/(AbsSymbolic(S(%i*%omega)[1,1]-conjugate(S(%i*%omega)[2,2])*Delta(%omega))+Abs_S21(%omega)*Abs_S12(%omega)))), print("muprime(%omega) := ", muprime(%omega)))$ |
--> |
PlotSmithChart(PlotCommand):=block( local(Gamma), Gamma(z):=(z-1)/(z+1), wxplot2d([ [parametric,realpart(Gamma(t)),imagpart(Gamma(t)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(t-%i*0.5)),imagpart(Gamma(t-%i*0.5)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(t-%i*2)),imagpart(Gamma(t-%i*2)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(t+%i*0.5)),imagpart(Gamma(t+%i*0.5)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(t+%i*2)),imagpart(Gamma(t+%i*2)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(%i*t)),imagpart(Gamma(%i*t)),[t,-60,60],[nticks,1000]], [parametric,realpart(Gamma(0.5+%i*t)),imagpart(Gamma(0.5+%i*t)),[t,-60,60],[nticks,600]], [parametric,realpart(Gamma(1+%i*t)),imagpart(Gamma(1+%i*t)),[t,-60,60],[nticks,600]], [parametric,realpart(Gamma(2+%i*t)),imagpart(Gamma(2+%i*t)),[t,-60,60],[nticks,600]], PlotCommand], [axes,false], [box,false], [gnuplot_preamble,"set size ratio 1;"], [legend,false], [style,[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,3,2]], [xlabel,""], [ylabel,""]))$ |
--> |
PrintSmithChart(PlotCommand,Format,FileName):=block( local(Gamma), Gamma(z):=(z-1)/(z+1), plot2d([ [parametric,realpart(Gamma(t)),imagpart(Gamma(t)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(t-%i*0.5)),imagpart(Gamma(t-%i*0.5)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(t-%i*2)),imagpart(Gamma(t-%i*2)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(t+%i*0.5)),imagpart(Gamma(t+%i*0.5)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(t+%i*2)),imagpart(Gamma(t+%i*2)),[t,0,120],[nticks,600]], [parametric,realpart(Gamma(%i*t)),imagpart(Gamma(%i*t)),[t,-60,60],[nticks,1000]], [parametric,realpart(Gamma(0.5+%i*t)),imagpart(Gamma(0.5+%i*t)),[t,-60,60],[nticks,600]], [parametric,realpart(Gamma(1+%i*t)),imagpart(Gamma(1+%i*t)),[t,-60,60],[nticks,600]], [parametric,realpart(Gamma(2+%i*t)),imagpart(Gamma(2+%i*t)),[t,-60,60],[nticks,600]], PlotCommand], [axes,false], [box,false], [gnuplot_preamble,"set size ratio 1;"], [legend,false], [style,[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,1,11],[lines,3,2]], [xlabel,""], [ylabel,""], [gnuplot_term,Format], [gnuplot_out_file,FileName]))$ |
4 Four-Port Parameters
4.1 Four-Port Standard S-Parameter to Mixed-Mode S-Parameter Conversion
--> |
M:1/sqrt(2)*matrix([1,-1,0,0],[0,0,1,-1],[1,1,0,0],[0,0,1,1])$ S_STANDARD4PORT:matrix([S11,S12,S13,S14],[S21,S22,S23,S24],[S31,S32,S33,S34],[S41,S42,S43,S44])$ S_MIXEDMODE:M.S_STANDARD4PORT.M$ Inverse[M].matrix([S11,S12,0,0],[S21,S22,0,0],[0,0,S33,S34],[0,0,S43,S44]).M$ |
5 Noise
--> |
NoiseVoltage2OutputWhileInputShorted(NoiseSolutionInputShorted):=block( [v_noise_out_coefficient,i_noise_out_coefficient], v_noise_out_coefficient:ratsimp(coeff(expand(ev(v_out,NoiseSolutionInputShorted)),v_noise,1)), i_noise_out_coefficient:ratsimp(coeff(expand(ev(i_out,NoiseSolutionInputShorted)),v_noise,1)), ratsimp(matrix([v_noise_out_coefficient],[i_noise_out_coefficient]))*v_noise)$ |
--> |
NoiseVoltage2OutputWhileInputOpened(NoiseSolutionInputOpened):=block( [v_noise_out_coefficient,i_noise_out_coefficient], v_noise_out_coefficient:ratsimp(coeff(expand(ev(v_out,NoiseSolutionInputOpened)),v_noise,1)), i_noise_out_coefficient:ratsimp(coeff(expand(ev(i_out,NoiseSolutionInputOpened)),v_noise,1)), ratsimp(matrix([v_noise_out_coefficient],[i_noise_out_coefficient]))*v_noise)$ |
--> |
NoiseCurrent2OutputWhileInputShorted(NoiseSolutionInputShorted):=block( [v_noise_out_coefficient,i_noise_out_coefficient], v_noise_out_coefficient:ratsimp(coeff(expand(ev(v_out,NoiseSolutionInputShorted)),i_noise,1)), i_noise_out_coefficient:ratsimp(coeff(expand(ev(i_out,NoiseSolutionInputShorted)),i_noise,1)), ratsimp(matrix([v_noise_out_coefficient],[i_noise_out_coefficient]))*i_noise)$ |
--> |
NoiseCurrent2OutputWhileInputOpened(NoiseSolutionInputOpened):=block( [v_noise_out_coefficient,i_noise_out_coefficient], v_noise_out_coefficient:ratsimp(coeff(expand(ev(v_out,NoiseSolutionInputOpened)),i_noise,1)), i_noise_out_coefficient:ratsimp(coeff(expand(ev(i_out,NoiseSolutionInputOpened)),i_noise,1)), ratsimp(matrix([v_noise_out_coefficient],[i_noise_out_coefficient]))*i_noise)$ |
--> |
NoiseVoltage2EquivalentInputNoiseVoltage(ABCD,NoiseSolutionInputShorted):=block( [v_noise_out_coefficient,i_noise_out_coefficient], v_noise_out_coefficient:ratsimp(coeff(expand(ev(v_out,NoiseSolutionInputShorted)),v_noise,1)), i_noise_out_coefficient:ratsimp(coeff(expand(ev(i_out,NoiseSolutionInputShorted)),v_noise,1)), ratsimp(expand(ABCD[1,1]*v_noise_out_coefficient+ABCD[1,2]*i_noise_out_coefficient))*v_noise)$ |
--> |
NoiseVoltage2EquivalentInputNoiseCurrent(ABCD,NoiseSolutionInputOpened):=block( [v_noise_out_coefficient,i_noise_out_coefficient], v_noise_out_coefficient:ratsimp(coeff(expand(ev(v_out,NoiseSolutionInputOpened)),v_noise,1)), i_noise_out_coefficient:ratsimp(coeff(expand(ev(i_out,NoiseSolutionInputOpened)),v_noise,1)), ratsimp(expand(ABCD[2,1]*v_noise_out_coefficient+ABCD[2,2]*i_noise_out_coefficient))*v_noise)$ |
--> |
NoiseCurrent2EquivalentInputNoiseVoltage(ABCD,NoiseSolutionInputShorted):=block( [v_noise_out_coefficient,i_noise_out_coefficient], v_noise_out_coefficient:ratsimp(coeff(expand(ev(v_out,NoiseSolutionInputShorted)),i_noise,1)), i_noise_out_coefficient:ratsimp(coeff(expand(ev(i_out,NoiseSolutionInputShorted)),i_noise,1)), ratsimp(expand(ABCD[1,1]*v_noise_out_coefficient+ABCD[1,2]*i_noise_out_coefficient))*i_noise)$ |
--> |
NoiseCurrent2EquivalentInputNoiseCurrent(ABCD,NoiseSolutionInputOpened):=block( [v_noise_out_coefficient,i_noise_out_coefficient], v_noise_out_coefficient:ratsimp(coeff(expand(ev(v_out,NoiseSolutionInputOpened)),i_noise,1)), i_noise_out_coefficient:ratsimp(coeff(expand(ev(i_out,NoiseSolutionInputOpened)),i_noise,1)), ratsimp(expand(ABCD[2,1]*v_noise_out_coefficient+ABCD[2,2]*i_noise_out_coefficient))*i_noise)$ |
--> |
F(EquivalentInputNoiseCurrentVariance,EquivalentInputNoiseVoltageVariance):= 1+EquivalentInputNoiseVoltageVariance/(4*k_B*T*Z_0*B)+EquivalentInputCurrentVariance/(4*k_B*T/Z_0*B)$ NF(F):=float(10*log10(F))$ NoiseTemperature(F,T)=(F-1)*T$ |
5.1 Noise Wave Correlation Matrix (Using Bosma's Theorem, EXPERIMENTAL)
--> | NoiseWaveCorrelationMatrix(S):=k_B*T*(ident(2)-ev(S).transpose(conjugate(ev(S))))$ |
--> |
S(%omega):=matrix([0,1/sqrt(2)],[1/sqrt(2),0])$ NoiseWaveCorrelationMatrix(S(%omega))$ |
--> |
F(S):=block( local(Abs_S21,C), define(Abs_S21(%omega),AbsSymbolic(ev(S(%i*%omega)[2,1]))), define(C(%omega),NoiseWaveCorrelationMatrix(S(%omega))), ratsimp(1+C(%omega)[2,2]/(k_B*T*(Abs_S21(%omega))^2)))$ |
5.2 Gamma_OPT, NF_min (EXPERIMENTAL)
--> |
Gamma_OPT(S):=block( local(Abs_S11,Abs_S21,C,eta_1,eta_2), define(Abs_S11(%omega),AbsSymbolic(ev(S(%i*%omega)[2,1]))), define(Abs_S21(%omega),AbsSymbolic(ev(S(%i*%omega)[2,1]))), C:NoiseWaveCorrelationMatrix(S(0)), eta_1:ratsimp(C[1,1]*(Abs_S21(%omega))^2-2*ReSymbolic(C[1,2]*S(%i*%omega)[2,1]*Conjugate(S(%i*%omega)[1,1])+C[2,2]*(Abs_S11(%omega))^2)), eta_2:ratsimp(1/2*(C[2,2]+eta_1)/(C[2,2]*S(%i*%omega)[1,1]-C[1,2]*S(%i*%omega)[2,1])), ratsimp(eta_2*(1-sqrt(1-(1)/((AbsSymbolic(eta_2))^2)))))$ |
--> |
F_min(%omega):=block( local(Abs_S11,Abs_S21,C,eta_1,eta_2,Gamma_OPT,AbsGamma_OPT), define(Abs_S11(%omega),AbsSymbolic(ev(S(%i*%omega)[2,1]))), define(Abs_S21(%omega),AbsSymbolic(ev(S(%i*%omega)[2,1]))), C:NoiseWaveCorrelationMatrix(S(0)), eta_1:ratsimp(C[1,1]*(Abs_S21(%omega))^2-2*ReSymbolic(C[1,2]*S(%i*%omega)[2,1]*Conjugate(S(%i*%omega)[1,1])+C[2,2]*(Abs_S11(%omega))^2)), eta_2:ratsimp(1/2*(C[2,2]+eta_1)/(C[2,2]*S(%i*%omega)[1,1]-C[1,2]*S(%i*%omega)[2,1])), Gamma_OPT:ratsimp(eta_2*(1-sqrt(1-(1)/((AbsSymbolic(eta_2))^2)))), AbsGamma_OPT:AbsSymbolic(Gamma_OPT), ratsimp(1+(C[2,2]-eta_1*(AbsGamma_OPT)^2)/(k_B*T*(Abs_S21(%omega))^2*(1+(AbsGamma_OPT)^2))))$ |