import matplotlib.patches as mpp
from scipy.fftpack import fft, ifft
##########################################3
# Konstanty
fs=8000
Ts=1./fs
length=1
fmin=5.
Tmin=1./fmin
# časová osa
t = arange(0,length,1./fs)
u = 1*sin(2*pi*5*t)+1.2*sin(2*pi*6*t)+0.9*cos(2*pi*7*t)+\
0.99*cos(2*pi*8*t)+0.7*cos(2*pi*9*t)+1*cos(2*pi*10*t)+\
0.6*cos(2*pi*11*t)+0.8*cos(2*pi*12*t)+0.6*cos(2*pi*13*t)+\
0.55*cos(2*pi*14*t)+0.45*cos(2*pi*15*t)+0.35*cos(2*pi*16*t)
# Spektrum
Ck= fft(u)
absCk = 2./len(u) * numpy.abs(Ck)[:len(Ck)/2]
f = arange(0,fs/2,float(fs)/len(Ck))
# analogový signál
fig=figure()
subplot(211)
plot(t,u)
title(u'Analogový signál')
grid('on')
xlabel(r't\,[s] $\rightarrow$', x=0.9)
ylabel('$\mathrm u$\,[V] $\uparrow$', y=0.9, rotation=0)
ylim([-3, 3])
xlim([0,3*Tmin])
subplot(212)
title(ur'Analogový signál -- amplitudové spektrum')
plot(f,absCk,'.-')
xlabel(r'f\,[Hz] $\rightarrow$', x=0.9)
ylabel('$\mathrm U$\,[V] $\uparrow$', y=0.9, rotation=0)
ylim([0,1.1*max(absCk)]);
xlim([0,100])
grid(1)
text(4,-0.15 , '$f_\mathrm{min}$', size=16)
text(15,-0.15 ,'$f_\mathrm{max}$', size=16)
#figtext(0,1 , '$\mathrm f_m$', size=16)
tight_layout()
faktor=200 # kolikrát je vzorkovácí frekvence menší než fs
# jehlový vzorek
uj=u.copy()
for i,data in enumerate(uj):
if i%faktor!=0:
uj[i]=0
Sj= fft(uj)
absSj =2.*faktor/len(uj) * numpy.abs(Sj)[:len(Sj)/2]
#různě široký vzorek
uvz=u.copy()
zmena=False
for i,data in enumerate(uvz):
sirka = 30 # šířka vzorkovacího impulzu
if i%faktor==0:
continue
for s in range(1,sirka):
if ((i-s)%faktor)==0:
uvz[i] = uvz[i-s]
zmena = True
if not zmena :
uvz[i]=0
zmena = False
## Spektrum
Svz= fft(uvz)
absSvz =2.*faktor/len(uvz)/sirka * numpy.abs(Svz)[:len(Svz)/2]
fig=figure()
subplot(211)
plot(t,u,':r',label=u'původní signál')
#stem(t[::faktor], uvz[::faktor],'b-','ro','x')
plot(t,uvz,label=u'navzorkovaný signál')
title(u'Vzorkovaný signál')
grid('on')
xlabel(r't\,[s] $\rightarrow$', x=0.9)
ylabel('$\mathrm u$\,[V] $\uparrow$', y=0.9, rotation=0)
ylim([-3,3])
xlim([0,2*Tmin])
legend()
subplot(212)
title(ur'Vzorkovaný signál -- amplitudové spektrum')
plot(f,absSj,'r.:', label=u'původní signál')
plot(f,absSvz,'b.-',label=u'navzorkovaný signál' )
xlabel(r'f\,[Hz] $\rightarrow$', x=0.9)
ylabel('$\mathrm U$\,[V] $\uparrow$', y=0.9, rotation=0)
ylim([0,1.3]);
xlim([0,100])
grid(1)
#legend()
axvline(20, linestyle='--', linewidth=2, color='m')
axvline(40, linestyle='--', linewidth=2, color='m')
axvline(60, linestyle='--', linewidth=2, color='m')
axvline(80, linestyle='--', linewidth=2, color='m')
text(19,-0.25 , '$\mathbf{f_s \over 2}$', size=16)
text(39,-0.25 , '$\mathbf{f_s }$', size=16)
#figtext(0,1 , '$\mathrm f_m$', size=16)
tight_layout()
fig=figure()
subplot(211)
plot(t,u,'b',label=u'')
#stem(t[::faktor], uvz[::faktor],'b-','ro','x')
#plot(t,uvz,label=u'navzorkovaný signál')
title(u'Analogový signál')
grid('on')
xlabel(r't\,[s] $\rightarrow$', x=0.9)
ylabel('$\mathrm u$\,[V] $\uparrow$', y=0.9, rotation=0)
ylim([-3,3])
xlim([0,2*Tmin])
#legend()
fig=figure()
ax=subplot(211)
plot(t,u,':r',label=u'původní signál')
#stem(t[::faktor], uvz[::faktor],'b-','ro','x')
plot(t,uvz,label=u'navzorkovaný signál')
title(u'Vzorkovaný signál')
grid('on')
xlabel(r't\,[s] $\rightarrow$', x=0.9)
ylabel('$\mathrm u$\,[V] $\uparrow$', y=0.9, rotation=0)
ylim([-3,3])
xlim([0,2*Tmin])
#legend()
ax.add_patch( mpp.FancyArrowPatch((0.14,-2), (0.20,-2), arrowstyle='-',
lw=2, linestyle='solid', mutation_scale=15,
color='blue', alpha=1, shrinkA=0, shrinkB=0 ), )
ax.add_patch( mpp.FancyArrowPatch((0.14,-2), (0.15,-2), arrowstyle='->',
lw=2, linestyle='solid', mutation_scale=15,
color='blue', alpha=1, shrinkA=0, shrinkB=0 ), )
ax.add_patch( mpp.FancyArrowPatch((0.175,-2), (0.20,-2), arrowstyle='<-',
lw=2, linestyle='solid', mutation_scale=15,
color='blue', alpha=1, shrinkA=0, shrinkB=0 ), )
text(0.185,-2.8, ur'$\mathrm{T_s}$',size=16)
axvspan(0.15, 0.175, facecolor='g', alpha=0.2, ymin=0.166, ymax=0.5)
<matplotlib.patches.Polygon at 0x3499ed0>
figure()
sx=subplot(212)
title(ur'Obnova původního signálu')
plot(f,absSj,'b.-', label=u'původní signál')
#plot(f,absSvz,'b.-',label=u'navzorkovaný signál' )
xlabel(r'f\,[Hz] $\rightarrow$', x=0.9)
ylabel('$\mathrm U$\,[V] $\uparrow$', y=0.9, rotation=0)
ylim([0,1.1*max(absCk)]);
xlim([0,100])
grid(1)
axvspan(0, 20, facecolor='g', alpha=0.2, ymin=0, ymax=.99)
text(19,-0.25 , '${1\over 2}f_\mathrm{s}$', size=16)
text(39,-0.25 , '$f_\mathrm{s}$', size=16)
<matplotlib.text.Text at 0x3928450>