(%i1) | load("/home/vcaeken/Desktop/rfMaxima.mac")$ |
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)); |
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)); |
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)); |
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"]); |
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
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)); |
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)); |
(%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"]); |
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)); |
Example
(%i28) | float(ev(-ev(s,Poles)/(2*%pi),Cint=10e-12,Gm=1,Rp=10000)); |
(%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"]); |
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)); |
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); |
(%i47) |
Zeros:ratsimp(solve(num(factor(H(s)))=0,s)); Poles:ratsimp(solve(denom(factor(H(s)))=0,s)); |
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); |
(%i60) |
Zeros:ratsimp(solve(num(factor(H(s)))=0,s)); Poles:ratsimp(solve(denom(factor(H(s)))=0,s)); |