Um=1
DCL=0.25
f=linspace(0,1000,1001)
U=2.*Um*DCL*sinc(f*DCL)
U[0]=U[0]/2.

figure(figsize=(10,7))
minorticks_on()
xlabel(r'$\rightarrow$ \\f [Hz]',fontsize=16, x=0.9 )
ylabel(r'U [V] $\uparrow$',fontsize=16, y=0.9, rotation=0)
title(u"Amplitudové frekvenční spektrum -- obdélník DCL=25\%)")
grid(True, 'major', linewidth=1)
grid(True, 'minor', linewidth=0.5)
# Amplitudové spekturm
stem(f[0:40],abs(U[0:40]),'b-','ro')
# ještě obálková finkce
x=linspace(0,40,1000)
plot(x,abs(2*Um*DCL*sinc(x*DCL)),':k')
grid(1)

"""
Explanation: Význam nízkých a vysokých harmonických složek
Obdélníkový časový průběh
Amplitudy jednotlivých hramonických složek obdélníkového časového průběhu lze vyjádřit vztahem:
$$U_n = 2U_{max} \mathrm{DCL}\cdot \mathrm{sinc}(n \pi \mathrm{DCL})$$
Kde $\mathrm{DCL}$ je čnitel plnění a  $\mathrm{sinc}$ je tzv. 
kardinální sinus 
$\mathrm{sinc}(x) = \frac{\sin(x)}{x}$.
Amplitudové spektrum obdélníkového napětí $U_{max}=1 V$, $\mathrm{DCL}=25%$, $f=1 Hz$, tedy vypadá například takto:
End of explanation
"""


############################################
def soucet(U,titulek,f1=1):
    T1=1./f1
    t = linspace(0,3*T1,1000)
    u = zeros(1000)
    for f,A in enumerate(U):
        u+=A*cos(2*pi*f*f1*t)
    figure(figsize=(10,7))
        
    subplot(211)
    title(titulek) 
    xlim(0,60)
    stem(arange(len(U)),abs(U),'b-','r.')
    xlabel(r'f [Hz] $\rightarrow$ ',fontsize=16, x=0.9 )
    ylabel(r'U [V] $\uparrow$',fontsize=16, y=0.9, rotation=0)
    grid(True, 'major', linewidth=1)
    grid(True, 'minor', linewidth=0.5)
    
    
    subplot(212)
    minorticks_on()
    xlabel(r'$\rightarrow$ \\t [s]',fontsize=16, x=0.9 )
    ylabel(r'u [V] $\uparrow$',fontsize=16, y=0.9, rotation=0)

    grid(True, 'major', linewidth=1)
    grid(True, 'minor', linewidth=0.5)
    plot(t,u,lw=2)
    ylim( (-1.1*abs(min(u)) if abs(min(u))>0.1 else -0.2  ,  1.1*max(u) ) )
###########################################
soucet(U,u"Obdélníkové napětí -- DCL=25\%")


"""
Explanation: Součet všech harmonických složek
End of explanation
"""


import copy
Q=copy.deepcopy(U)
Q[31:]=0
soucet(Q,u'Obdélníkové napětí -- prvních 30 harmonických složek')

Q=copy.deepcopy(U)
Q[21:]=0
soucet(Q,u'Obdélníkové napětí -- prvních 20 harmonických složek')

Q=copy.deepcopy(U)
Q[11:]=0
soucet(Q,u'Obdélníkové napětí -- prvních 10 harmonických složek')

Q=copy.deepcopy(U)
Q[6:]=0
soucet(Q,u'Obdélníkové napětí -- prvních 5 harmonických složek')

"""
Explanation: Nižší harmonické složky -- základní tvar
Nižší harmonické složky určují základní tvar. Pokud zachováme nižší harmonické složky
a odstraníme vyšší harmonické složky
přesto, že tvar nebude přesný bude rozeznatelný.
Čím méně harmonických složek zahrneme tím bude tvar méně přesný, ale jeho zákldní rysy zůstanou zachovýny.
Všímněte si teké strmosti hran. Čím více vyššíh hramonických složek je zachováno, tím jsou hrany strměší.
End of explanation
"""


Q=copy.deepcopy(U)
Q[:11]=0
soucet(Q,u'Obdélníkové napětí -- Jen vyšší harmonicé složky')

Q=copy.deepcopy(U)
Q[:31]=0
soucet(Q,u'Obdélníkové napětí -- Jen vyšší harmonicé složky')

Q=copy.deepcopy(U)
Q[:51]=0
soucet(Q,u'Obdélníkové napětí -- Jen vyšší harmonicé složky')

Q=copy.deepcopy(U)
Q[:30]=0
Q[51:]=0
soucet(Q,u'Obdélníkové napětí -- Jen vyšší harmonicé složky')

"""
Explanation: Vyšší harmonické složky -- rychlé změny
Vyšší harmonické složky představují rychlé změny.
Na předchozích obrázcích je patrné, že čím více vyššíh hramonických složek je zachováno, tím jsou hrany strměší.
Pokud odfiltrujeme nižsí harmonické složky a ponecháme pouze vyšší harmonické složky původní tvar už nebude možné 
rozeznat, ale zůstanou nám práve rychlé změny -- v místě původní strmé hrany se oběvý zákmit.
End of explanation
"""


