pp5.mws

>    restart;

>    libname := libname,"d:/Tomas/ČVUT/B071/x31das/semestrálka/PraCAn";

libname :=





Návrh SC pásmové propusti Chebyshev metodou funkční simulace,
fclock = 10 kHz, fm = 1 kHz, deltafp = 1 kHz, deltafs = 2 kHz, ap = 1 dB, as = 30 dB.


Sepsal l. P. 2008 Bc. Tomáš Bořil.



Na motivy metody "porovnávání jmenovatelů přenosových funkcí"
z knihy 'Switched Capacitor Filters - Theory, Analysis and Design'
by
B. Ramachandran - etc. - P.V. Anandamohan - M.N.S. Swamy.



Autor byl inspirován převážně příkladem 7.1 (Design an LDI-type LP ladder filter) z kapitoly 7.1.2,
dále pak kapitolou 7.4.2 (SC band-pass ladder filters based on LDI transformation).



Všechna práva vyhrazena, během semestrální práce nebylo ublíženo žádnému zvířeti.

>   

Spinací perioda

>    T := 1 / 10e3;

T := .1000000000e-3

[Maple Metafile]

Prewarpování jednotlivých frekvencí (podle vztahu dole na str. 149)
Jednotlivé frekvence jsme získali pomocí Syntfilu zadáním našich "delta" frekvencí.

>    prewarp := fpuvodni -> 2/T * sin(2*Pi*fpuvodni * T/2) / (2*Pi);

prewarp := proc (fpuvodni) options operator, arrow; 1/T*sin(Pi*fpuvodni*T)/Pi end proc

>    f_s := evalf(prewarp(414.214));

f_s := 413.0459671

>    f_p := evalf(prewarp(618.034));

f_p := 614.1581499

>    fp := evalf(prewarp(1.618e3));

fp := 1549.218489

>    fs := evalf(prewarp(2.414e3));

fs := 2189.165566

>   

Zadali jsme nové frekvence do Syntfilu a získali tak přenosovou funkci

>    H := p -> (292411879405405*p^4)/(p^8 + 5596.60968212060*p^7 + 200390505.539602*p^6 + 781070617011.267*p^5 + .125591755560536e17*p^4 + .293346944014671e20*p^3 + .282656955267829e24*p^2 + .296482335350600e27*p + .198959678828995e31);

H := proc (p) options operator, arrow; 292411879405405*p^4/(p^8+5596.60968212060*p^7+200390505.539602*p^6+781070617011.267*p^5+.125591755560536e17*p^4+.293346944014671e20*p^3+.282656955267829e24*p^2+.2...
H := proc (p) options operator, arrow; 292411879405405*p^4/(p^8+5596.60968212060*p^7+200390505.539602*p^6+781070617011.267*p^5+.125591755560536e17*p^4+.293346944014671e20*p^3+.282656955267829e24*p^2+.2...

>   

Přenos analogového prototypu

>    plot(20*log10(abs(eval(H(p), p = I*2*Pi*f))), f = 0..5000);

[Maple Plot]

>   

Struktura RLC (získaná ze Syntfilu)

[Maple Metafile]

>   

Funkční simulace - popis obvodovými rovnicemi

[Maple Metafile]

>   

Z rovnic sestavený obvod

[Maple Metafile]

>   

Úprava, aby vstupy do sumátorů byly kladné

[Maple Metafile]

>   

Převrácení vzhůru nohama z důvodu názornější korespondence s následující SC realizací

[Maple Metafile]

>   

Výsledná SC realizace pomocí bezeztrátových a ztrátových integrátorů. Nakonec jsme se z důvodu následující metody "porovnávání koeficientů přenosových funkcí" (viz příklad 7.1 v kapitole 7.1.2 knihy uvedené v literatuře) pro hledání hodnot součástek rozhodli funkční simulaci roztrhnout na dvě sekce čtvrtých řádů (viz kapitola 7.4.2) zapojené do kaskády, protože řešit soustavu osmi nelineárních rovnic o osmi neznámých by bylo náročné.

Všimněme si, že oproti původní struktuře není v sekci 1 použit zatěžovací kapacitor CL a naopak v sekci 2 není použit vstupní kapacitor CS.

Vstup obvodu je v uzlu 1, výstup první sekce v uzlu 6 a výstup celé kaskády filtru v uzlu 26. Jak je dále ukázáno, šipkou označené kapacitory hrají zásadní roli pro nastavení zesílení jednotlivých sekcí.

Tužkou jsou naznačeny skutečné názvy součástek, propiskou čísla uzlů.

[Maple Metafile]

>   

Tímto jsme odvodili výslednou SC strukturu filtru. Nyní přistupme k LDI (loseless discrete integrator) transformaci původní analogové přenosové funkce (získané z prewarpovaného tolerančního schematu pomocí Syntfilu), analýze spinaného obvodu a hledání hodnot součástek porovnáváním koeficientů transformované přenosové funkce s přenosovou funkcí navrženého SC obvodu.

>   

Postup transformace: najdeme nuly a póly analogové funkce, ty přetransformujeme do z-roviny a z nich pak sestavíme novou transformovanou přenosovou funkci.

>   

LDI Transformace čitatele - jen pro dobrý pocit, pro náš algoritmus návrhu není potřeba, jelikož budeme porovnávat pouze koeficienty jmenovatelů.

>    numer(H(p));

292411879405405*p^4

>    solve(numer(H(p)) = 0);

0, 0, 0, 0

>    nuly := 1 + 0*T * (0*T/2 + sqrt(0^2 * T^2 + 4) / 2);

nuly := 1.

>    citatel := coeff(numer(H(p)), p, 4) * expand((z-1)*(z-1)*(z-1)*(z-1));

citatel := 292411879405405*z^4-1169647517621620*z^3+1754471276432430*z^2-1169647517621620*z+292411879405405

>   

LDI transformace jmenovatele

>    poly := solve(denom(H(p)) = 0);

poly := -1181.229505-7364.435717*I, -1181.229505+7364.435717*I, -797.4708244-4971.872612*I, -797.4708244+4971.872612*I, -584.7615737-9652.745167*I, -584.7615737+9652.745167*I, -234.8429385-3876.586871*...
poly := -1181.229505-7364.435717*I, -1181.229505+7364.435717*I, -797.4708244-4971.872612*I, -797.4708244+4971.872612*I, -584.7615737-9652.745167*I, -584.7615737+9652.745167*I, -234.8429385-3876.586871*...

>   

Póly jsme se rozhodli z důvodu přesnosti přepsat přímo ze Syntfilu.

>    polyP[1] := -1181.22950453796-7364.43571690615*I:
polyP[2] := -1181.22950453796+7364.43571690615*I:
polyP[3] := -797.470824402930-4971.87261227509*I:
polyP[4] := -797.470824402930+4971.87261227509*I:
polyP[5] := -584.761573663095-9652.74516722974*I:
polyP[6] := -584.761573663095+9652.74516722974*I:
polyP[7] := -234.842938456321-3876.58687119603*I:
polyP[8] := -234.842938456321+3876.58687119603*I:

>   

Transformace pólů z p-roviny do z-roviny, před sqrt() je buď plus nebo mínus, o znaménku rozhodujeme tak, aby výsledek ležel uvnitř jednotkové kružnice z-roviny.

>    for iiii from 1 to 8 do
  polyZ[iiii] := 1 + polyP[iiii]*T * (polyP[iiii]*T/2 + sqrt(polyP[iiii]^2 * T^2 + 4) / 2); abs(polyZ[iiii]);
end do;

polyZ[1] := .6429089480-.6020606465*I

.8808001689

polyZ[2] := .6429089480+.6020606465*I

.8808001689

polyZ[3] := .8073522472-.4431803032*I

.9209920913

polyZ[4] := .8073522472+.4431803032*I

.9209920913

polyZ[5] := .5001219037-.7905167295*I

.9354349888

polyZ[6] := .5001219037+.7905167295*I

.9354349888

polyZ[7] := .9029947818-.3712857337*I

.9763465942

polyZ[8] := .9029947818+.3712857337*I

.9763465942

Kompletní transformovaná přenosová funkce

Pozor na roznásobování, kdybychom neprovedli vnitřní funkce expand pro každá dvě komplexně sdružená čísla, ale pouze jedno vnější expand, dostali bychom kvůli nepřesnostem floating-point výpočtů jiný výsledek (nesmyslné imaginární členy)!

>    spatneHd := citatel / expand( (z-polyZ[1])*(z-polyZ[2]) * (z-polyZ[3])*(z-polyZ[4]) * (z-polyZ[5])*(z-polyZ[6]) * (z-polyZ[7])*(z-polyZ[8]) );

spatneHd := (292411879405405*z^4-1169647517621620*z^3+1754471276432430*z^2-1169647517621620*z+292411879405405)/(-22.15926183*z^3-25.80352142*z^5+15.47451520*z^6+11.41598493*z^2+28.86694184*z^4+.1e-9*I*...
spatneHd := (292411879405405*z^4-1169647517621620*z^3+1754471276432430*z^2-1169647517621620*z+292411879405405)/(-22.15926183*z^3-25.80352142*z^5+15.47451520*z^6+11.41598493*z^2+28.86694184*z^4+.1e-9*I*...
spatneHd := (292411879405405*z^4-1169647517621620*z^3+1754471276432430*z^2-1169647517621620*z+292411879405405)/(-22.15926183*z^3-25.80352142*z^5+15.47451520*z^6+11.41598493*z^2+28.86694184*z^4+.1e-9*I*...

>   

>    Hd := citatel / expand( expand((z-polyZ[1])*(z-polyZ[2])) * expand((z-polyZ[3])*(z-polyZ[4])) * expand((z-polyZ[5])*(z-polyZ[6])) * expand((z-polyZ[7])*(z-polyZ[8])) );

Hd := (292411879405405*z^4-1169647517621620*z^3+1754471276432430*z^2-1169647517621620*z+292411879405405)/(z^8-5.706755761*z^7+15.47451520*z^6-25.80352142*z^5+28.86694184*z^4-22.15926182*z^3+11.41598492...

Umazání 0*I ze jmenovatele

>    Hd := evalc(Re(Hd));

Hd := (292411879405405*z^4-1169647517621620*z^3+1754471276432430*z^2-1169647517621620*z+292411879405405)/(z^8-5.706755761*z^7+15.47451520*z^6-25.80352142*z^5+28.86694184*z^4-22.15926182*z^3+11.41598492...

Jmenovatel přenosu

>    Hdd := denom(Hd);

Hdd := z^8-5.706755761*z^7+15.47451520*z^6-25.80352142*z^5+28.86694184*z^4-22.15926182*z^3+11.41598492*z^2-3.622073202*z+.5489108707

Rozklad, kvůli obvodové realizaci totiž potřebujeme získat 2 sekce

>    factor(Hdd);

(z^2-1.000243833*z+.8750386484)*(z^2-1.285817665*z+.7758087625)*(z^2-1.614705158*z+.8482269248)*(z^2-1.805989105*z+.9532523004)

1. část jmenovatele (použijeme v 1. sekci obvodu)

>    Hdd1 := collect((z^2-1.000243833*z+.8750386484)*(z^2-1.285817665*z+.7758087625), z);

Hdd1 := .6788626510+z^4-2.286061498*z^3+2.936978600*z^2-1.901138082*z

Dělíme koeficientem u členu z^0 tak, aby ve jmenovateli byl poslední člen 1.

>    c1 := coeff(Hdd1, z, 0);

c1 := .6788626510

>    Hdd1 := Hdd1 / c1;

Hdd1 := 1.000000000+1.473052021*z^4-3.367487510*z^3+4.326322262*z^2-2.800475294*z

2. část jmenovatele (použijeme v 2. sekci obvodu)

>    Hdd2 := collect((z^2-1.614705158*z+.8482269248)*(z^2-1.805989105*z+.9532523004), z);

Hdd2 := .8085742673+z^4-3.420694263*z^3+4.717619148*z^2-3.071109991*z

Dělíme koeficientem u členu z^0 tak, aby ve jmenovateli byl poslední člen 1.

>    c2 := coeff(Hdd2, z, 0);

c2 := .8085742673

>    Hdd2 := Hdd2 / c2;

Hdd2 := 1.000000000+1.236744775*z^4-4.230525757*z^3+5.834490832*z^2-3.798179235*z

>   

Konečný tvar čitatele (pro algoritmus není potřeba)

>    Hdnfactor := factor(numer(Hd)) / c1 / c2;

Hdnfactor := .5327128593e15*(z-1)^4

>   

>    #######

Vyšetřování přenosu 1. sekce obvodu (bez zadaných hodnot kapacit)

>   

Analýzami obvodu se nám podařilo zjistit, že funkce obvodu nezávisí na zvolených hodnotách Cs a Cl, protože hodnoty ostatních kapacitor; jsou z těchto hodnot vypočítávány a výsledná přenosová funkce je pak vždy nakonec shodná. Proto jsme se rozhodli Cs a Cl zvolit stejně jako Cu jednotkové.

>   

>    obvpp:="

>    V1 1 0 1 AC

S1 2 1 1
S2 2 4 2
S3 3 0 1
S4 3 5 2
S5 8 0 1
S6 8 6 2
S7 9 0 1
S8 9 5 2
S9 10 0 1
S10 10 5 2
S11 11 0 1
S12 11 7 2
S13 13 12 1
S14 13 0 2
S15 14 0 1
S16 14 7 2
S17 16 15 1
S18 16 0 2
S19 17 18 1
S20 17 7 2
S21 19 6 1
S22 19 0 2
S23 20 0 1
S24 20 21 2

S25 22 6 1
S26 22 24 2
S27 23 0 1
S28 23 25 2
S29 27 0 1
S30 27 26 2
S31 28 0 1
S32 28 25 2
S33 31 30 1
S34 31 0 2
S35 32 0 1
S36 32 29 2
S37 34 33 1
S38 34 0 2
S39 35 36 1
S40 35 29 2
S41 37 26 1
S42 37 0 2
S43 38 33 1
S44 38 0 2
S45 39 26 1
S46 39 0 2
S47 40 0 1
S48 40 41 2

A1 7 0 0 5
A2 4 0 0 12
A3 6 0 0 15
A4 18 0 0 21

A5 29 0 0 25
A6 24 0 0 30
A7 26 0 0 33
A8 36 0 0 41

Cu1 2 3 1
Cu2 8 9 1
Cu3 13 14 1
Cu4 16 17 1
Cu5 19 20 1
Cs 10 11 1  
Cc1 5 7  
Cl1 4 12  
Cl2 6 15  
Cc2 21 18

Cu6 22 23 1
Cu7 27 28 1
Cu8 31 32 1
Cu9 34 35 1
Cu10 39 40 1
Cl 37 38 1
Cc3 25 29
Cl3 24 30
Cl4 26 33
Cc4 41 36  

.end":

>   

>    vysledky := PraCAn(obvpp, TF, P = 2, SCIDEAL):
prenos := eval(v("6")[1] / v("1")[1], vysledky);

prenos := (1+z^2-2*z)*Cc2*z*Cl1/(-2*Cc2*z^2*Cl1-2*Cc1*Cl1*z^2-Cl1*z^2+Cc1*Cl1*z+Cc2*z^3*Cl2+Cc2*z^4*Cl2*Cc1*Cl1+6*Cc2*z^2*Cl2*Cc1*Cl1-3*Cc2*z^3*Cl2*Cl1+Cc2*z^4*Cl2*Cl1-4*Cc2*z^3*Cl2*Cc1*Cl1-2*Cc2*z^2*C...
prenos := (1+z^2-2*z)*Cc2*z*Cl1/(-2*Cc2*z^2*Cl1-2*Cc1*Cl1*z^2-Cl1*z^2+Cc1*Cl1*z+Cc2*z^3*Cl2+Cc2*z^4*Cl2*Cc1*Cl1+6*Cc2*z^2*Cl2*Cc1*Cl1-3*Cc2*z^3*Cl2*Cl1+Cc2*z^4*Cl2*Cl1-4*Cc2*z^3*Cl2*Cc1*Cl1-2*Cc2*z^2*C...

>   

Jmenovatel přenosu

>    collect(denom(prenos), z);

(Cc2*Cl2*Cc1*Cl1+Cc2*Cl2*Cl1)*z^4+(Cc1*Cl1+Cc2*Cl2-4*Cc2*Cl2*Cc1*Cl1-3*Cc2*Cl2*Cl1+Cc2*Cl1+Cl1)*z^3+(3*Cc2*Cl2*Cl1+6*Cc2*Cl2*Cc1*Cl1-2*Cc2*Cl1-2*Cc2*Cl2+1-2*Cc1*Cl1-Cl1)*z^2+(-4*Cc2*Cl2*Cc1*Cl1-Cc2*Cl2...
(Cc2*Cl2*Cc1*Cl1+Cc2*Cl2*Cl1)*z^4+(Cc1*Cl1+Cc2*Cl2-4*Cc2*Cl2*Cc1*Cl1-3*Cc2*Cl2*Cl1+Cc2*Cl1+Cl1)*z^3+(3*Cc2*Cl2*Cl1+6*Cc2*Cl2*Cc1*Cl1-2*Cc2*Cl1-2*Cc2*Cl2+1-2*Cc1*Cl1-Cl1)*z^2+(-4*Cc2*Cl2*Cc1*Cl1-Cc2*Cl2...

>   

Dělíme koeficientem členu z^0 tak, aby poslední člen jmenovatele byl 1.

>    jmenovatel1 := collect(% / coeff(%, z, 0), z);

jmenovatel1 := 1+(Cc2*Cl2*Cc1*Cl1+Cc2*Cl2*Cl1)/Cc2/Cl2/Cc1/Cl1*z^4+(Cc1*Cl1+Cc2*Cl2-4*Cc2*Cl2*Cc1*Cl1-3*Cc2*Cl2*Cl1+Cc2*Cl1+Cl1)/Cc2/Cl2/Cc1/Cl1*z^3+(3*Cc2*Cl2*Cl1+6*Cc2*Cl2*Cc1*Cl1-2*Cc2*Cl1-2*Cc2*Cl2...
jmenovatel1 := 1+(Cc2*Cl2*Cc1*Cl1+Cc2*Cl2*Cl1)/Cc2/Cl2/Cc1/Cl1*z^4+(Cc1*Cl1+Cc2*Cl2-4*Cc2*Cl2*Cc1*Cl1-3*Cc2*Cl2*Cl1+Cc2*Cl1+Cl1)/Cc2/Cl2/Cc1/Cl1*z^3+(3*Cc2*Cl2*Cl1+6*Cc2*Cl2*Cc1*Cl1-2*Cc2*Cl1-2*Cc2*Cl2...

>   

Jmenovatel funkce, kterou chceme touto sekcí realizovat

>    Hdd1;

1.000000000+1.473052021*z^4-3.367487510*z^3+4.326322262*z^2-2.800475294*z

Porovnání koeficientů - nalezení hodnot součástek

>    hodnoty1 := solve({
coeff(jmenovatel1, z, 4) = coeff(Hdd1, z, 4),
coeff(jmenovatel1, z, 3) = coeff(Hdd1, z, 3),
coeff(jmenovatel1, z, 2) = coeff(Hdd1, z, 2),
coeff(jmenovatel1, z, 1) = coeff(Hdd1, z, 1)
},
{Cc1, Cl1, Cl2, Cc2});

hodnoty1 := {Cc2 = .2197135404, Cl2 = 5.679468038, Cc1 = 2.113932413, Cl1 = .6003879223}

>   

Vyšetřování přenosu 2. sekce obvodu (bez zadaných hodnot kapacit)

>    ###

>    obvpp:="

>    V1 6 0 1 AC

S25 22 6 1
S26 22 24 2
S27 23 0 1
S28 23 25 2
S29 27 0 1
S30 27 26 2
S31 28 0 1
S32 28 25 2
S33 31 30 1
S34 31 0 2
S35 32 0 1
S36 32 29 2
S37 34 33 1
S38 34 0 2
S39 35 36 1
S40 35 29 2
S41 37 26 1
S42 37 0 2
S43 38 33 1
S44 38 0 2
S45 39 26 1
S46 39 0 2
S47 40 0 1
S48 40 41 2

A5 29 0 0 25
A6 24 0 0 30
A7 26 0 0 33
A8 36 0 0 41

Cu6 22 23 1
Cu7 27 28 1
Cu8 31 32 1
Cu9 34 35 1
Cu10 39 40 1
Cl 37 38 1
Cc3 25 29
Cl3 24 30
Cl4 26 33
Cc4 41 36  

.end":

>   

>   

>    vysledky := PraCAn(obvpp, TF, P = 2, SCIDEAL):

>    prenos := eval(v("26")[1] / v("6")[1], vysledky);

prenos := (z-1)^2*Cc4*Cl3*z/(Cc4*z^4*Cc3*Cl3+Cc4*z^4*Cl4*Cc3*Cl3+z^3*Cc3*Cl3-4*Cc4*z^3*Cl4*Cc3*Cl3-3*Cc4*z^3*Cc3*Cl3+Cc4*z^3*Cl3+Cc4*z^3*Cl4+Cc4*z^3-2*z^2*Cc3*Cl3+6*Cc4*z^2*Cl4*Cc3*Cl3+3*Cc4*z^2*Cc3*Cl...
prenos := (z-1)^2*Cc4*Cl3*z/(Cc4*z^4*Cc3*Cl3+Cc4*z^4*Cl4*Cc3*Cl3+z^3*Cc3*Cl3-4*Cc4*z^3*Cl4*Cc3*Cl3-3*Cc4*z^3*Cc3*Cl3+Cc4*z^3*Cl3+Cc4*z^3*Cl4+Cc4*z^3-2*z^2*Cc3*Cl3+6*Cc4*z^2*Cl4*Cc3*Cl3+3*Cc4*z^2*Cc3*Cl...

>   

Jmenovatel přenosu

>    collect(denom(prenos), z);

(Cc4*Cc3*Cl3+Cc4*Cl4*Cc3*Cl3)*z^4+(-3*Cc4*Cc3*Cl3+Cc4*Cl3+Cc3*Cl3-4*Cc4*Cl4*Cc3*Cl3+Cc4*Cl4+Cc4)*z^3+(-Cc4+1-2*Cc3*Cl3+6*Cc4*Cl4*Cc3*Cl3+3*Cc4*Cc3*Cl3-2*Cc4*Cl3-2*Cc4*Cl4)*z^2+(Cc4*Cl4-4*Cc4*Cl4*Cc3*Cl...
(Cc4*Cc3*Cl3+Cc4*Cl4*Cc3*Cl3)*z^4+(-3*Cc4*Cc3*Cl3+Cc4*Cl3+Cc3*Cl3-4*Cc4*Cl4*Cc3*Cl3+Cc4*Cl4+Cc4)*z^3+(-Cc4+1-2*Cc3*Cl3+6*Cc4*Cl4*Cc3*Cl3+3*Cc4*Cc3*Cl3-2*Cc4*Cl3-2*Cc4*Cl4)*z^2+(Cc4*Cl4-4*Cc4*Cl4*Cc3*Cl...

>   

Dělíme posledním členem jmenovatele (bez z) tak, aby poslední člen jmenovatele byl 1.

>    jmenovatel2 := collect(% / coeff(%, z, 0), z);

jmenovatel2 := 1+(Cc4*Cc3*Cl3+Cc4*Cl4*Cc3*Cl3)/Cc4/Cl4/Cc3/Cl3*z^4+(-3*Cc4*Cc3*Cl3+Cc4*Cl3+Cc3*Cl3-4*Cc4*Cl4*Cc3*Cl3+Cc4*Cl4+Cc4)/Cc4/Cl4/Cc3/Cl3*z^3+(-Cc4+1-2*Cc3*Cl3+6*Cc4*Cl4*Cc3*Cl3+3*Cc4*Cc3*Cl3-2...
jmenovatel2 := 1+(Cc4*Cc3*Cl3+Cc4*Cl4*Cc3*Cl3)/Cc4/Cl4/Cc3/Cl3*z^4+(-3*Cc4*Cc3*Cl3+Cc4*Cl3+Cc3*Cl3-4*Cc4*Cl4*Cc3*Cl3+Cc4*Cl4+Cc4)/Cc4/Cl4/Cc3/Cl3*z^3+(-Cc4+1-2*Cc3*Cl3+6*Cc4*Cl4*Cc3*Cl3+3*Cc4*Cc3*Cl3-2...

>   

Jmenovatel funkce, kterou chceme touto sekcí realizovat

>    Hdd2;

1.000000000+1.236744775*z^4-4.230525757*z^3+5.834490832*z^2-3.798179235*z

>   

Porovnání koeficientů - nalezení hodnot součástek

>    hodnoty2 := solve({
coeff(jmenovatel2, z, 4) = coeff(Hdd2, z, 4),
coeff(jmenovatel2, z, 3) = coeff(Hdd2, z, 3),
coeff(jmenovatel2, z, 2) = coeff(Hdd2, z, 2),
coeff(jmenovatel2, z, 1) = coeff(Hdd2, z, 1)
},
{Cc4, Cl4, Cl3, Cc3});

hodnoty2 := {Cc3 = 11.80777718, Cl3 = .4873219825, Cc4 = .9673743961, Cl4 = 4.223958058}

>   

Celý obvod (obě sekce) s vypočtenými hodnotami součástek

>    #######

>   

>    obvpp:="

>    V1 1 0 1 AC

S1 2 1 1
S2 2 4 2
S3 3 0 1
S4 3 5 2
S5 8 0 1
S6 8 6 2
S7 9 0 1
S8 9 5 2
S9 10 0 1
S10 10 5 2
S11 11 0 1
S12 11 7 2
S13 13 12 1
S14 13 0 2
S15 14 0 1
S16 14 7 2
S17 16 15 1
S18 16 0 2
S19 17 18 1
S20 17 7 2
S21 19 6 1
S22 19 0 2
S23 20 0 1
S24 20 21 2

S25 22 6 1
S26 22 24 2
S27 23 0 1
S28 23 25 2
S29 27 0 1
S30 27 26 2
S31 28 0 1
S32 28 25 2
S33 31 30 1
S34 31 0 2
S35 32 0 1
S36 32 29 2
S37 34 33 1
S38 34 0 2
S39 35 36 1
S40 35 29 2
S41 37 26 1
S42 37 0 2
S43 38 33 1
S44 38 0 2
S45 39 26 1
S46 39 0 2
S47 40 0 1
S48 40 41 2

A1 7 0 0 5
A2 4 0 0 12
A3 6 0 0 15
A4 18 0 0 21

A5 29 0 0 25
A6 24 0 0 30
A7 26 0 0 33
A8 36 0 0 41

Cu1 2 3 1
Cu2 8 9 1
Cu3 13 14 1
Cu4 16 17 1
Cu5 19 20 1
Cs 10 11 1  
Cc1 5 7 2.113932413  
Cl1 4 12 .6003879223  
Cl2 6 15 5.679468038  
Cc2 21 18 .2197135404

Cu6 22 23 1
Cu7 27 28 1
Cu8 31 32 1
Cu9 34 35 1
Cu10 39 40 1
Cl 37 38 1
Cc3 25 29 11.80777718
Cl3 24 30 .4873219825  
Cl4 26 33 4.223958058
Cc4 41 36 .9673743961  

.end":

>   

>   

>    vysledky := PraCAn(obvpp, TF, P = 2, SCIDEAL):
prenos := eval(v("26")[1] / v("1")[1], vysledky);

prenos := .7773370597e71*z^2*(z-1.)*(-1.+3.*z-3.*z^2+z^3)/(.4654744820e74-.4839308757e75*z^7-.2188129515e76*z^5+.9680714945e75*z^2+.1312233431e76*z^6+.8479964727e74*z^8-.1879097586e76*z^3-.3071505299e7...
prenos := .7773370597e71*z^2*(z-1.)*(-1.+3.*z-3.*z^2+z^3)/(.4654744820e74-.4839308757e75*z^7-.2188129515e76*z^5+.9680714945e75*z^2+.1312233431e76*z^6+.8479964727e74*z^8-.1879097586e76*z^3-.3071505299e7...

>   

>    prenosf := eval(prenos, {z = exp(I*2*Pi*f * T)});

prenosf := .7773370597e71*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....
prenosf := .7773370597e71*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....
prenosf := .7773370597e71*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....
prenosf := .7773370597e71*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....
prenosf := .7773370597e71*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....

>   

Přenos filtru - tvar charakteristiky je správný, ale bude ještě nutno pořešit vertikální posun.

>    plot(20*log10(abs(prenosf)), f = 0..5000);

[Maple Plot]

Zjistíme potřebné zesílení z hodnoty maxima grafu (které se nachází např. na frekvenci 1198.5 Hz)

>    potrebneZesileni := 1 / evalf(abs(eval(prenos, {z = exp(I*2*Pi*1198.5 * T)})));

potrebneZesileni := 23.63368821

>   

Nejrůznějšími analýzami se nám podařilo zjistit, že je možné celkové zesílení dané sekce nastavit hodnotou vstupního kapacitoru (tedy mezi svorkami 2-3, resp. 22-23) a stejným číslem pak vynásobit hodnotu kapacitoru u druhého OZ v sekci (tedy mezi svorkami 4-12, resp. 24-30). Označme tato zesílení jako Au1 a Au2.

>   

Poznámka k hodnotám součástek: při praktické realizaci můžeme hodnoty všech kapacitorů vynásobit zvolenou konstantou, přenosová funkce se tím nezmění a zajistíme tak realizovatelné hodnoty součástek.

>    #######

>   

>    obvpp:="

>    V1 1 0 1 AC

S1 2 1 1
S2 2 4 2
S3 3 0 1
S4 3 5 2
S5 8 0 1
S6 8 6 2
S7 9 0 1
S8 9 5 2
S9 10 0 1
S10 10 5 2
S11 11 0 1
S12 11 7 2
S13 13 12 1
S14 13 0 2
S15 14 0 1
S16 14 7 2
S17 16 15 1
S18 16 0 2
S19 17 18 1
S20 17 7 2
S21 19 6 1
S22 19 0 2
S23 20 0 1
S24 20 21 2

S25 22 6 1
S26 22 24 2
S27 23 0 1
S28 23 25 2
S29 27 0 1
S30 27 26 2
S31 28 0 1
S32 28 25 2
S33 31 30 1
S34 31 0 2
S35 32 0 1
S36 32 29 2
S37 34 33 1
S38 34 0 2
S39 35 36 1
S40 35 29 2
S41 37 26 1
S42 37 0 2
S43 38 33 1
S44 38 0 2
S45 39 26 1
S46 39 0 2
S47 40 0 1
S48 40 41 2

A1 7 0 0 5
A2 4 0 0 12
A3 6 0 0 15
A4 18 0 0 21

A5 29 0 0 25
A6 24 0 0 30
A7 26 0 0 33
A8 36 0 0 41

Cu1 2 3 1*Au1
Cu2 8 9 1
Cu3 13 14 1
Cu4 16 17 1
Cu5 19 20 1
Cs 10 11 1  
Cc1 5 7 2.113932413  
Cl1 4 12 .6003879223*Au1  
Cl2 6 15 5.679468038  
Cc2 21 18 .2197135404

Cu6 22 23 1*Au2
Cu7 27 28 1
Cu8 31 32 1
Cu9 34 35 1
Cu10 39 40 1
Cl 37 38 1
Cc3 25 29 11.80777718
Cl3 24 30 .4873219825*Au2  
Cl4 26 33 4.223958058
Cc4 41 36 .9673743961  

.end":

>   

>   

>    vysledky:=PraCAn(obvpp, TF, P = 2, SCIDEAL):
prenos := eval(v("26")[1] / v("1")[1], vysledky);

prenos := .7773370597e71*(z-1.)*Au2*z^2*Au1*(-1.+3.*z-3.*z^2+z^3)/(.4654744820e74-.4839308757e75*z^7-.2188129515e76*z^5+.9680714945e75*z^2+.1312233431e76*z^6+.8479964727e74*z^8-.1879097586e76*z^3-.3071...
prenos := .7773370597e71*(z-1.)*Au2*z^2*Au1*(-1.+3.*z-3.*z^2+z^3)/(.4654744820e74-.4839308757e75*z^7-.2188129515e76*z^5+.9680714945e75*z^2+.1312233431e76*z^6+.8479964727e74*z^8-.1879097586e76*z^3-.3071...

>   

Potřebné zesílení známe, rozdělme ho tedy mezi obě sekce spravedlivě skrzevá odmocninu.

>    prenosf := eval(prenos, {z = exp(I*2*Pi*f * T), Au1 = sqrt(potrebneZesileni), Au2 = sqrt(potrebneZesileni)});

prenosf := .1837134170e73*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....
prenosf := .1837134170e73*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....
prenosf := .1837134170e73*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....
prenosf := .1837134170e73*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....
prenosf := .1837134170e73*exp(.2000000000e-3*I*Pi*f)^2*(exp(.2000000000e-3*I*Pi*f)-1.)*(-1.+3.*exp(.2000000000e-3*I*Pi*f)-3.*exp(.2000000000e-3*I*Pi*f)^2+exp(.2000000000e-3*I*Pi*f)^3)/(.4654744820e74-....

>   

Správná charakteristika

>    plot(20*log10(abs(prenosf)), f = 0..5000);

[Maple Plot]

Logaritmická frekvenční osa, vidíme opakování spektra v důsledku spinací frekvence.

>    plots[semilogplot](20*log10(abs(prenosf)), f = 100..10000);

[Maple Plot]

Detail propustného pásma

>    plot(20*log10(abs(prenosf)), f = 618..1618);

[Maple Plot]

>   

Na závěr ještě vyzkoušejme přeladit filtr - změníme spinací frekvenci na dvojnásobek.

>    T := 1 / 20e3;

T := .5000000000e-4

>    prenosf := eval(prenos, {z = exp(I*2*Pi*f * T), Au1 = sqrt(potrebneZesileni), Au2 = sqrt(potrebneZesileni)}):

>    plots[semilogplot](20*log10(abs(prenosf)), f = 100..10000);

[Maple Plot]

>   

>   

Konec dobrý - všechno dobré.

>