(%i1) load("/home/vcaeken/Desktop/rfMaxima.mac")$

Result

Gm-C Filter Design

1 3th Order Feed-Forward Filter

See "Analog-to-Digital Conversion", by M. J. M. Pelgrom, 2010, p. 98, Eq. 2.156

1.1 No resistor in series or in parallel with the capacitor -> all poles in origin of s-plane

(%i2) Solution:solve([
    i_out=(gm1*v_1+gm2*v_2+gm3*v_3),
    i_1=gm*v_in,
    i_2=gm*v_1,
    i_3=gm*v_2,
    v_1=1/(s*C)*i_1,
    v_2=1/(s*C)*i_2,
    v_3=1/(s*C)*i_3
],[i_1,i_2,i_3,i_out,v_1,v_2,v_3]);
define(H(s),ratsimp(coeff(expand(ev(i_out,Solution)),v_in,1)));
Zeros:ratsimp(solve(num(factor(H(s)))=0,s));
Poles:ratsimp(solve(denom(factor(H(s)))=0,s));

Result

1.2 Resistor in series with the capacitor -> zeros shift to LHP

(%i6) Solution:solve([
    i_out=(gm1*v_1+gm2*v_2+gm3*v_3),
    i_1=gm*v_in,
    i_2=gm*v_1,
    i_3=gm*v_2,
    v_1=(R+1/(s*C))*i_1,
    v_2=(R+1/(s*C))*i_2,
    v_3=(R+1/(s*C))*i_3
],[i_1,i_2,i_3,i_out,v_1,v_2,v_3]);
define(H(s),ratsimp(coeff(expand(ev(i_out,Solution)),v_in,1)));
Zeros:ratsimp(solve(num(factor(H(s)))=0,s));
Poles:ratsimp(solve(denom(factor(H(s)))=0,s));

Result

1.3 Resistor in parallel with the capacitor -> poles shift to LHP

(%i10) Solution:solve([
    i_out=(gm1*v_1+gm2*v_2+gm3*v_3),
    i_1=gm*v_in,
    i_2=gm*v_1,
    i_3=gm*v_2,
    v_1=1/(1/R+s*C)*i_1,
    v_2=1/(1/R+s*C)*i_2,
    v_3=1/(1/R+s*C)*i_3
],[i_1,i_2,i_3,i_out,v_1,v_2,v_3]);
define(H(s),ratsimp(coeff(expand(ev(i_out,Solution)),v_in,1)));
Zeros:ratsimp(solve(num(factor(H(s)))=0,s));
Poles:ratsimp(solve(denom(factor(H(s)))=0,s));

Result

Example

(%i14) wxplot2d(20*log(abs(ev(H(%i*2*%pi*f),C=1e-12,R=100000,gm=1,gm1=1,gm2=1,gm3=1)))/log(10),
[f,1,2.5e6],
[logx],
[xlabel,"Frequency (Hz)"],
[ylabel,"H(s) (dB)"],
[style,[lines,3,11]],
[gnuplot_preamble,"set grid"]);
wxplot2d(180/%pi*ArgSymbolic(ev(H(%i*2*%pi*f),C=1e-12,R=100000,gm=1,gm1=1,gm2=1,gm3=1)),
[f,1,2.5e6],
[logx],
[xlabel,"Frequency (Hz)"],
[ylabel,"H(s) (Deg)"],
[style,[lines,3,11]],
[gnuplot_preamble,"set grid"]);

Result

2 5th Order Feed-Forward Filter

See "Triple-Mode Continuous-Time Sigma Delta Modulator with Switched-Capacitor Feedback DAC for a GSM-EDGE/CDMA2000/UMTS Receiver" by R. H.
M. van Veldhoven, IEEE JSSC, vol. 38, no. 12, pp. 2069-2076, Dec. 2003

GmC_FILTER

2.1 Differential Half Circuit of First Integrator

(%i16) Solution:solve([
    i_out=-i_in,
    i_out=-Gm*v_in,
    v_out-v_in=(Rz+1/(s*Cint))*(i_out-v_out*1/2*Rp)
],[i_out,v_in,v_out])$
define(H(s),ratsimp(coeff(expand(ev(v_out,Solution)),i_in,1)));
Zeros:ratsimp(solve(num(factor(H(s)))=0,s));
Poles:ratsimp(solve(denom(factor(H(s)))=0,s));

Result

Example

(%i20) float(ev(-ev(s,Zeros)/(2*%pi),Cint=10e-12,Gm=10,Rp=1,Rz=100));
float(ev(-ev(s,Poles)/(2*%pi),Cint=10e-12,Gm=10,Rp=1,Rz=100));

Result

(%i22) wxplot2d(20*log(abs(ev(H(%i*2*%pi*f),Cint=10e-12,Gm=10,Rp=1,Rz=100)))/log(10),
[f,1,2.5e8],
[logx],
[xlabel,"Frequency (Hz)"],
[ylabel,"H(s) (dB)"],
[style,[lines,3,11]],
[gnuplot_preamble,"set grid"]);
wxplot2d(180/%pi*ArgSymbolic(ev(H(%i*2*%pi*f),Cint=10e-12,Gm=10,Rp=1,Rz=100)),
[f,1,2.5e8],
[logx],
[xlabel,"Frequency (Hz)"],
[ylabel,"H(s) (Deg)"],
[style,[lines,3,11]],
[gnuplot_preamble,"set grid"]);

Result

2.2 Differential Half Circuit of Second, Third, Fourth and Fifth Integrator Without Feedback

(%i24) Solution:solve([
    i_out=Gm*v_in,
    v_out=1/(2/Rp+s*2*Cint)*i_out
],[i_out,v_out])$
define(H(s),ratsimp(coeff(expand(ev(v_out,Solution)),v_in,1)));
Zeros:ratsimp(solve(num(factor(H(s)))=0,s));
Poles:ratsimp(solve(denom(factor(H(s)))=0,s));

Result

Example

(%i28) float(ev(-ev(s,Poles)/(2*%pi),Cint=10e-12,Gm=1,Rp=10000));

Result

(%i29) wxplot2d(20*log(abs(ev(H(%i*2*%pi*f),Cint=10e-12,Gm=1,Rp=10000)))/log(10),
[f,1,2.5e6],
[logx],
[xlabel,"Frequency (Hz)"],
[ylabel,"H(s) (dB)"],
[style,[lines,3,11]],
[gnuplot_preamble,"set grid"]);
wxplot2d(180/%pi*ArgSymbolic(ev(H(%i*2*%pi*f),Cint=10e-12,Gm=1,Rp=10000)),
[f,1,2.5e6],
[logx],
[xlabel,"Frequency (Hz)"],
[ylabel,"H(s) (Deg)"],
[style,[lines,3,11]],
[gnuplot_preamble,"set grid"]);

Result

2.3 Differential Half Circuit of Second, Third, Fourth and Fifth Integrator Without Feedback

(%i31) Solution:solve([
    v_in=1/(2/Rp1+s*2*Cint1)*(i_in+i_feedback),
    i_out=Gm*v_in,
    i_feedback=b*v_out,
    v_out=1/(2/Rp2+s*2*Cint2)*i_out
],[i_feedback,i_out,v_in,v_out])$
define(H(s),ratsimp(coeff(expand(ev(v_out,Solution)),i_in,1)));
Zeros:ratsimp(solve(num(factor(H(s)))=0,s));
Poles:ratsimp(solve(denom(factor(H(s)))=0,s));

Result

2.4 Differential Half Circuit of 5th Order Feed-Forward Filter with Feedback Loops Included

(%i35) Solution:solve([
    i_out=i_6+i_7+i_8+i_9+i_10,
    i_1=-i_in,
    i_1=-Gm1*v_in,
    i_2=Gm2*v_1,
    i_3=Gm3*v_2,
    i_4=Gm4*v_3,
    i_5=Gm5*v_4,
    i_6=a1*v_1,
    i_7=a2*v_2,
    i_8=a3*v_3,
    i_9=a4*v_4,
    i_10=a5*v_5,
    i_11=b1*v_3,
    i_12=b2*v_5,
    v_1-v_in=(Rz+1/(s*Cint1))*(i_1-v_1*1/2*Rp1),
    v_2=1/(2/Rp2+s*2*Cint2)*(i_2+i_11),
    v_3=1/(2/Rp3+s*2*Cint3)*i_3,
    v_4=1/(2/Rp4+s*2*Cint4)*(i_4+i_12),
    v_5=1/(2/Rp5+s*2*Cint5)*i_5
],[i_1,i_2,i_3,i_4,i_5,i_6,i_7,i_8,i_9,i_10,i_11,i_12,i_out,v_1,v_2,v_3,v_4,v_5,v_in])$
define(H(s),ratsimp(coeff(expand(ev(i_out,Solution)),i_in,1)))$
coeff(expand(num(H(s))),s,1);
coeff(expand(num(H(s))),s,2);
coeff(expand(num(H(s))),s,3);
coeff(expand(num(H(s))),s,4);
coeff(expand(num(H(s))),s,5);
coeff(expand(denom(H(s))),s,1);
coeff(expand(denom(H(s))),s,2);
coeff(expand(denom(H(s))),s,3);
coeff(expand(denom(H(s))),s,4);
coeff(expand(denom(H(s))),s,5);

Result

(%i47) Zeros:ratsimp(solve(num(factor(H(s)))=0,s));
Poles:ratsimp(solve(denom(factor(H(s)))=0,s));

Result

Simplified

(%i49) define(H(s),ratsimp(coeff(expand(ev(ev(i_out,Solution),Gm2=G,Gm3=G,Gm4=G,Gm5=G,a1=A,a2=A,a3=A,a4=A,a5=A,b1=B,b2=B,Rp2=Rp,Rp3=Rp,Rp4=Rp,Rp5=Rp,Cint2=C,Cint3=C,Cint4=C,Cint5=C)),i_in,1)))$
coeff(expand(num(H(s))),s,1);
coeff(expand(num(H(s))),s,2);
coeff(expand(num(H(s))),s,3);
coeff(expand(num(H(s))),s,4);
coeff(expand(num(H(s))),s,5);
coeff(expand(denom(H(s))),s,1);
coeff(expand(denom(H(s))),s,2);
coeff(expand(denom(H(s))),s,3);
coeff(expand(denom(H(s))),s,4);
coeff(expand(denom(H(s))),s,5);

Result

(%i60) Zeros:ratsimp(solve(num(factor(H(s)))=0,s));
Poles:ratsimp(solve(denom(factor(H(s)))=0,s));

Result


Created with wxMaxima.