##############################
#                            #
#  Cvičení č. 4 - Konvoluce  #
#                            #
##############################

## Příklady 1 a 2: Spočtěte konvoluci následujcích posloupností:
# x1 = {1, 2, 3, 2, 1} a 
# x2 = {1, 2, ‒1}

x1<-c(1,2,3,2,1)
x2<-c(1,2,-1)

(konvoluce<-round(convolve(x1,rev(x2),type="open"),3) )

# výsledek je vhodné zaokrouhlit, R počítá konvoluci pomocí FFT
# a tedy nepřesně s numerickou reprezentací na 16 desetinných míst.



## Příklad 3: Maticová metoda výpočtu
M<-matrix(rep(c(x2,0,0,0,0,0),5),5,7,byrow=TRUE)
# matici „vyrobíme“ opakováním vektoru a pěti nul za ním
# z celkem 40 prvků takto získaného vektoru využijeme prvních 35
# obdržíme varovnou hlášku, nicméně výpočet je v pořádku

(konvoluce<-as.numeric(x1 %*% M))



## Příklad 4: Spočtěte konvoluci dvou spojitých funkcí
x1<-function(x,T=4,A=1/T,del=0.001) {
  result<-rep(0,length(x))
  result[which(x> (0-del/2)&x<=(0+del/2))]<-  A/del*(x[which(x> (0-del/2)&x<=(0+del/2))]-0+del/2)
  result[which(x> (0+del/2)&x<=(T-del/2))]<-A
  result[which(x> (T-del/2)&x<=(T+del/2))]<-A-A/del*(x[which(x> (T-del/2)&x<=(T+del/2))]-T+del/2)
  return(result)
}
x2<-x1
# Aby byla funkce integrovatelná, musí být spojitá. Proto si ji definujeme nikoliv jako obdélník (podle zadání)
# nýbrž jako velmi strmý lichoběžník (parametr del):

plot(seq(-1,5,by=0.01),x1(seq(-1,5,by=0.01)),type="l",col="blue",lwd=3)

# V balíku bayesmeta je příkaz stejného názvu jako naš convolve, po načtení balíku jej proto budeme volat
# pomocí dvou dvojteček:

install.packages("bayesmeta")
library("bayesmeta")

x<-bayesmeta::convolve(x1,x2)$density

# Příkaz bayesmeta::convolve() je určen primárně pro rozdělení pravděpodobnosti, proto se výsledná funkce
# jmenuje „density“.

plot(seq(-1,5,by=0.01),x$density(seq(-1,5,by=0.01)),type="l",col="red",lwd=3)



## Příklad 5:
x1<-rep(2,5)
x2<-rep(2,5)

x<-convolve(x1,rev(x2),type="open")

plot(x,type="point",pch=19,col="indianred",cex=2)



## Příklad 6:
x1<-rep(1,5)
x2<-rep(1,3)

x<-convolve(x1,rev(x2),type="open")

plot(x,type="point",pch=19,col="royalblue1",cex=2)



## Příklad 7:
x1<-rep(1,3)
x2<-rep(1,5)

x<-convolve(x1,rev(x2),type="open")

plot(x,type="point",pch=19,col="tan2",cex=2)



## Příklad 8:
x1<-c(rep(0,10),rep(1,10)) #skok vč. nul na začátku
x2<-c(rep(0,10),rep(1,10)) #skok vč. nul na začátku

x<-convolve(x1,rev(x2),type="open")

plot(x[10:30],type="point",pch=19,col="orchid4",cex=2)
# zobrazíme pouze část neovlivněnou ukončením časových řad dříve než v nekonečnu



## Příklad 9:
x1<-c(rep(0,10),rep(1,10))        #skok vč. nul na začátku
x2<-c(rep(0,8),rep(1,3),rep(0,9)) #časová řada vč nul na začátku a na konci

x<-convolve(x1,rev(x2),type="open")

plot(x[10:25],type="point",pch=19,col="sandybrown",cex=2)
# zobrazíme pouze část neovlivněnou ukončením časových řad dříve než v nekonečnu



## Příklad 10:
x1<-c(rep(0,10),rep(1,10)) #skok vč. nul na začátku
x2<-c(1,-1)                #časová řada vč. nul na začátku a na konci

x<-convolve(x1,rev(x2),type="open")

plot(x[1:20],type="point",pch=19,col="olivedrab",cex=2)
# zobrazíme pouze část neovlivněnou ukončením časových řad dříve než v nekonečnu



# Příklad 11:
x1<-rep(c(1,0,-1,0),10)
x2<-c(1,0,0,0,1)

x<-convolve(x1,rev(x2),type="open")

plot(x[1:20],type="line")                    # Přidáme tenkou černou čáru pro přehlednost.
points(x[1:20],pch=19,col="olivedrab",cex=2)



# Příklad 12:
x1<-rep(c(1,0,-1,0),10)
x2<-c(1,0,0,0,-1)

x<-convolve(x1,rev(x2),type="open")

plot(x[1:20],type="points",pch=19,col="red2",cex=2) # Přidáme tenkou černou čáru pro přehlednost.




# Příklad 13:
x1<-rep(c(1,0,-1,0),10)
x2a<-c(1,0,1)
x2b<-c(1,0,-1)
x2c<-c(-1,0,1)
x2d<-c(0,0,0,-1)

xa<-convolve(x1,rev(x2a),type="open")
xb<-convolve(x1,rev(x2b),type="open")
xc<-convolve(x1,rev(x2c),type="open")
xd<-convolve(x1,rev(x2d),type="open")

plot(xa[1:20],cex=0,ylim=c(-2,2))                                             # Body v grafu se nezobrazí.
points(xa[1:20],pch=19,cex=2,col=rgb(t(col2rgb("azure4"))/255,alpha=0.4))   # Příkazy rgb() a col2rgb() s argumentem alpha pro průhlednost.
points(xb[1:20],pch=18,cex=2,col=rgb(t(col2rgb("yellow4"))/255,alpha=0.4))
points(xc[1:20],pch=17,cex=2,col=rgb(t(col2rgb("hotpink4"))/255,alpha=0.4))
points(xd[1:20],pch=16,cex=2,col=rgb(t(col2rgb("cyan4"))/255,alpha=0.4))

lines(xa[1:20],lwd=3,col=rgb(t(col2rgb("azure4"))/255,alpha=0.4))   # Příkazy rgb() a col2rgb() s argumentem alpha pro průhlednost.
lines(xb[1:20],lwd=3,col=rgb(t(col2rgb("yellow4"))/255,alpha=0.4))
lines(xc[1:20],lwd=3,col=rgb(t(col2rgb("hotpink4"))/255,alpha=0.4))
lines(xd[1:20],lwd=3,col=rgb(t(col2rgb("cyan4"))/255,alpha=0.4))



# Příklad 14:
x1<-c(1:20)
x2a<-c(1,1)
x2b<-c(1,1,1)
x2c<-c(1,-1)

xa<-convolve(x1,rev(x2a),type="open")
xb<-convolve(x1,rev(x2b),type="open")
xc<-convolve(x1,rev(x2c),type="open")

plot(xa[1:20],cex=0,ylim=c(0,60))                                             # Body v grafu se nezobrazí.
points(xa[1:20],pch=19,cex=2,col=rgb(t(col2rgb("mediumspringgreen"))/255,alpha=0.4))   # Příkazy rgb() a col2rgb() s argumentem alpha pro průhlednost.
points(xb[1:20],pch=18,cex=2,col=rgb(t(col2rgb("dodgerblue3"))/255,alpha=0.4))
points(xc[1:20],pch=17,cex=2,col=rgb(t(col2rgb("tomato3"))/255,alpha=0.4))

lines(xa[1:20],lwd=3,col=rgb(t(col2rgb("mediumspringgreen"))/255,alpha=0.4))   # Příkazy rgb() a col2rgb() s argumentem alpha pro průhlednost.
lines(xb[1:20],lwd=3,col=rgb(t(col2rgb("dodgerblue3"))/255,alpha=0.4))
lines(xc[1:20],lwd=3,col=rgb(t(col2rgb("tomato3"))/255,alpha=0.4))



## Příklad 15:
x11<-rep(c(0,1,0,-1),5)
x12<-rep(c(1,-1),10)
x1<-x11+x12
x2a<-c(1,0,-1,0)
x2b<-c(1,-1)

xa<-convolve(x1,rev(x2a),type="open")
xb<-convolve(x1,rev(x2b),type="open")

# Grafy ze zadání
par(mfrow=c(3,1),mar=c(2,4,4,2))
plot(x1 [1:10],type="line",lwd=5,col="coral1",ylim=c(-3,2))
lines(c(0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0),c(-3,-3,NA,-2,-2,NA,-1,-1,NA,0,0,NA,1,1,NA,2,2,NA,3,3,NA),col="gray")
plot(x11[1:10],type="line",lwd=5,col="deepskyblue3",ylim=c(-2,2))
lines(c(0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0),c(-3,-3,NA,-2,-2,NA,-1,-1,NA,0,0,NA,1,1,NA,2,2,NA,3,3,NA),col="gray")
plot(x12[1:10],type="line",lwd=5,col="forestgreen",ylim=c(-2,2))
lines(c(0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0),c(-3,-3,NA,-2,-2,NA,-1,-1,NA,0,0,NA,1,1,NA,2,2,NA),col="gray")

par(mfrow=c(3,1),mar=c(2,4,4,2))
plot(xa[1:10],type="line",lwd=5,col="gold",ylim=c(-3,3))
lines(c(0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0),c(-3,-3,NA,-2,-2,NA,-1,-1,NA,0,0,NA,1,1,NA,2,2,NA,3,3,NA),col="gray")
plot(xb[1:10],type="line",lwd=5,col="mediumslateblue",ylim=c(-4,4))
lines(c(0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0),c(-4,-4,NA,-3,-3,NA,-2,-2,NA,-1,-1,NA,0,0,NA,1,1,NA,2,2,NA,3,3,NA,4,4,NA),col="gray")
plot(x1[1:10],type="line",lwd=5,col="coral1",ylim=c(-3,2))
lines(c(0,12,0,0,12,0,0,12,0,0,12,0,0,12,0,0,12,0),c(-3,-3,NA,-2,-2,NA,-1,-1,NA,0,0,NA,1,1,NA,2,2,NA),col="gray")

