knitr::opts_chunk$set(echo = FALSE)
colorOrig <- "gray" colorParity1 <- "orange" colorParity2 <- "violet" node.short <- 18 node.long <- 33 binVector <- function(n, min.length) { result <- integer() i <- 0 while (n != 0) { result <- c(n %% 2, result) n = n %/% 2 i <- i + 1 } zeros <- rep(0, times = min.length) result <- c(zeros, result) return(paste(tail(result,min.length), collapse = "")) } decToBin <- function(x) { if (all(x<2)) x else paste(decToBin(x%/%2), x%%2, sep="") } octalToDec <- function(x) { res <- numeric() for(j in 1:length(x)) { dec <- 0 i <- 0 while (x[j] > 0) { dec <- dec + (x[j] %% 10) * (8^i) i <- i + 1 x[j] <- x[j] %/% 10 } res[j] <- dec } return(res) } # returns an ordering of the state numbers for a nice state diagram ordering <- function(num.states, next.state) { #next.state <- matrix(rep(0:(num.states-1), each = 2), ncol = 2) result <- integer(1) n <- 0 for (i in 2:num.states) { n0 <- next.state[n+1,1] n1 <- next.state[n+1,2] if (n0 %in% result) { n <- n1 } else if (n1 %in% result) { n <- n0 } else { n <- if (n0 > n1) n0 else n1 } result <- c(result, n) } return(result) }
dots <- function (v, node) if (length(v) > node) ", ..." else "" if (params$encoder$rsc == TRUE) { art.coder <- "Rekursiver" } else { art.coder <- "Nicht-Rekursiver" } if (params$encoder$rsc == FALSE) { generator.matrix <- paste0(decToBin(octalToDec(params$encoder$generators)), " \\\\ ", collapse = "") generator.print <- paste0("(", paste(params$encoder$generators, collapse="_8,"), "_8) = \\begin{pmatrix}", generator.matrix, "\\end{pmatrix}") } else { generator.print <- paste0("\\left(1,", paste0("\\frac{", head(params$encoder$generators, length(params$encoder$generators) - 1), "_8}{", tail(params$encoder$generators, 1), "_8}", collapse = ","), "\\right)") }
r art.coder
Kodiererr params$encoder$N
$$r params$encoder$M
$$r generator.print
$$\begin{center}
next.table <- params$encoder$next.state colnames(next.table) <- c("Bit 0", "Bit 1") row.counter <- rep(0:(dim(next.table)[1]-1)) rownames(next.table) <- paste("Zustand ", row.counter) knitr::kable(next.table, format="latex", align="c")
\end{center}
\begin{center}
output.table <- params$encoder$output output.table <- matrix(decToBin(as.vector(output.table)), ncol = ncol(output.table)) colnames(output.table) <- c("Bit 0", "Bit 1") row.counter <- rep(0:(dim(next.table)[1]-1)) rownames(output.table) <- paste("Zustand ", row.counter) knitr::kable(output.table, format="latex", align="c")
\end{center}
num.states <- 2^params$encoder$M state.order <- ordering(num.states, params$encoder$next.state) ## STATE DIAGRAM tikz.diagram <- "" # state diagram nodes for (s in 0:(num.states-1)) { xpos <- 2.5*sin(s*2*pi/num.states) ypos <- 2.5*cos(s*2*pi/num.states) position <- paste0(xpos,",",ypos) name <- paste(binVector(state.order[s+1], params$encoder$M),collapse = "") state <- paste0("\\node[state] (state",state.order[s+1],") at (",position,") {",name,"};") tikz.diagram <- paste(tikz.diagram, state) } # state diagram connections for (s in 0:(num.states-1)) { this.state <- paste0("(state",s,")") n_next.state.0 <- params$encoder$next.state[s+1,1] n_next.state.1 <- params$encoder$next.state[s+1,2] str_next.state.0 <- paste0("(state",n_next.state.0,")") str_next.state.1 <- paste0("(state",n_next.state.1,")") label.value.0 <- paste(binVector(params$encoder$output[s+1,1],params$encoder$N),collapse = "") label.value.1 <- paste(binVector(params$encoder$output[s+1,2],params$encoder$N),collapse = "") # indices of the states in the ordering vector (1 based) this.ordering.index <- which(state.order == s) next.0.ordering.index <- which(state.order == n_next.state.0) next.1.ordering.index <- which(state.order == n_next.state.1) # if edges do not go to neighbour, set label near start # to avoid label crossings near.0 <- "" near.1 <- "" distance.to.0 <- abs(this.ordering.index - next.0.ordering.index) distance.to.1 <- abs(this.ordering.index - next.1.ordering.index) if (distance.to.0 > 1 && distance.to.0 < num.states-1) { near.0 <- ",near start" } if (distance.to.1 > 1 && distance.to.1 < num.states-1) { near.1 <- ",near start" } # 2nd check in previous if clause necessary because if state numbers # are in first and last position of the ordering, they have distance # num.states-1 but are neighbours in the state diagram label.0 <- paste0("node [sloped, above",near.0,"] {",label.value.0,"}") label.1 <- paste0("node [sloped, above",near.1,"] {",label.value.1,"}") # in case of a loop angle <- (90-(this.ordering.index-1)*360/num.states) %% 360 angle.out <- (angle + 15) %% 360 angle.in <- (angle - 15) %% 360 if (n_next.state.0 == s) { # loop with input bit 0 loop <- paste0("[looseness=8,out=",angle.out,",in=",angle.in,"]") if (sin(angle*pi/180) < 0) { label.0 <- paste0("node [sloped, below",near.0,"] {",label.value.0,"}") } edge.0 <- paste("\\draw[->]",this.state,"to",loop,label.0,this.state,";") } else { # 'normal' edge to other node bend <- "" if (params$encoder$next.state[n_next.state.0+1,1] == s || params$encoder$next.state[n_next.state.0+1,2] == s) { # there is a connection back -> bend the edge bend <- "[bend left=15]" } edge.0 <- paste("\\draw[->]",this.state,"to",bend,label.0,str_next.state.0,";") } if (n_next.state.1 == s) { # loop with input bit 1 loop <- paste0("[looseness=8,out=",angle.out,",in=",angle.in,"]") if (sin(angle*pi/180) < 0) { label.1 <- paste0("node [sloped, below",near.1,"] {",label.value.1,"}") } edge.1 <- paste("\\draw[->, dashed]",this.state,"to",loop,label.1,this.state,";") } else { # 'normal' edge to other node bend <- "" if (params$encoder$next.state[n_next.state.1+1,1] == s || params$encoder$next.state[n_next.state.1+1,2] == s) { # there is a connection back -> bend the edge bend <- "[bend left=15]" } edge.1 <- paste("\\draw[->, dashed]",this.state,"to",bend,label.1,str_next.state.1,";") } tikz.diagram <- paste(tikz.diagram, edge.0, edge.1) }
\begin{center} \begin{tikzpicture}[>=stealth, font=\scriptsize] \tikzstyle{state} = [draw, circle, inner sep=1mm, minimum size=8mm, font=\footnotesize]
r tikz.diagram
\end{tikzpicture} \end{center}
r head(params$permutation, node.long)``r dots(params$permutation, node.long)
)
\vspace*{6mm}term.string <- paste0( "- Input ohne Terminierung : (", paste0(head(params$orig, length(params$orig) - params$encoder$M), collapse = ", "), ")", "\\vspace*{6mm}", "\n- Input mit Terminierung : (", paste0(head(params$orig, length(params$orig) - params$encoder$M), collapse = ", "), "\\textcolor{orange}{, ", paste0(tail(params$orig, params$encoder$M), collapse = ", "), "})" ) if (length(params$orig) > node.long) { term.string <- "Da der Input zu lang ist, kann die Terminierung leider nicht angezeigt werden!" }
r term.string
r head(params$orig, node.short)``r dots(params$orig, node.short)
)\begin{center} \begin{tikzpicture}[node distance=8mm, inner sep=2mm, outer sep=0, >=stealth, font=\footnotesize, align=center]
\tikzstyle{encoderStyle} = [rectangle, draw, minimum height=height("Inp")+4.5mm] \tikzstyle{interleaverStyle} = [encoderStyle] \tikzstyle{startEndStyle} = [encoderStyle] \tikzstyle{multiplexerStyle} = [encoderStyle] \tikzstyle{showStyle} = [rectangle, thick, draw=red, text=red, inner sep=1.5mm] \tikzstyle{arrowStyle} = [->] \tikzstyle{showDrawStyle} = [->, red, thick]
\node [interleaverStyle] (interleaver) {Interleaver $I$}; \node [encoderStyle] (encoder1) [above right=of interleaver] {Kodierer 1}; \node [encoderStyle] (encoder2) [below right=of interleaver] {Kodierer 2}; \node [] (multiplexerTemp) [right=of encoder1] {}; \node [multiplexerStyle, rotate=90] (multiplexer) at (multiplexerTemp.east) {Multiplexer}; \node [startEndStyle] (start) [above left=of interleaver] {Input}; \node [startEndStyle] (end) [right=of multiplexerTemp] {Output};
\draw [arrowStyle] (interleaver.south) |- node (afterInterleaver) {}(encoder2.west); \draw [arrowStyle] (encoder1.east) -- node (afterParity1) {} (multiplexer.north); \draw [arrowStyle] (start.east) -| node[midway] (afterInput) {} (interleaver.north); \draw [arrowStyle] (afterInput.center) |- (encoder1.west); \draw [arrowStyle] (encoder2.east) -| ++(0.2,0.7) node (afterParity2) {} |- ($(multiplexer.north)+(0,-.5)$); \draw [arrowStyle] (afterInput.center) |- node[near end] (beforeMultiplexerOrig) {} ($(multiplexer.north)+(0,.5)$); \draw [arrowStyle] (multiplexer.south) -- node (afterMultiplexer) {} (end.west);
\begin{scope}[on background layer] \node [draw, fit=(encoder1) (interleaver) (encoder2) (multiplexer)] (background) {}; \end{scope}
multipl.color <- character() vec <- head(params$result, node.long) for (i in c(0:((length(vec) / 3) - 1))) { temp <- paste0( "\\textcolor{", colorOrig, "}{", vec[i * 3 + 1], "}, ", "\\textcolor{", colorParity1, "}{", vec[i * 3 + 2], "}, ", "\\textcolor{", colorParity2, "}{", vec[i * 3 + 3], "}", collapse = "" ) if (i == ((length(vec) / 3) - 1)) { multipl.color <- paste0(multipl.color, temp, collapse = "") } else { multipl.color <- paste0(multipl.color, temp, ", ", collapse = "") } }
\visible<2>{
\node [showStyle] (showAbove) [above=3mm of background, text=r colorOrig
] {r head(params$orig, node.short)``r dots(params$orig, node.short)
};
\draw [showDrawStyle] (showAbove) -- (afterInput.center);
\draw [showDrawStyle] (showAbove) -- (beforeMultiplexerOrig.center);
\node [showStyle] (showBelow) [below=3mm of background, text=r colorParity1
] {r head(params$parity1, node.short)``r dots(params$parity1, node.short)
};
\draw [showDrawStyle] (showBelow) -- (afterParity1.center);
}
\visible<3>{
\node [showStyle] (showAbove) [above=3mm of background, text=r colorOrig
] {r head(params$orig, node.short)``r dots(params$orig, node.short)
};
\draw [showDrawStyle] (showAbove) -- (afterInput.center);
\draw [showDrawStyle] (showAbove) -- (beforeMultiplexerOrig.center);
\node [showStyle] (showBelow) [below=3mm of background] {r head(params$interl, node.short)``r dots(params$interl, node.short)
};
\draw [showDrawStyle] (showBelow) -- (afterInterleaver.center);
}
\visible<4>{
\node [showStyle] (showAbove) [above=3mm of background, text=r colorParity2
] {r head(params$parity2, node.short)``r dots(params$parity2, node.short)
};
\draw [showDrawStyle] (showAbove) -- (afterParity2.center);
\node [showStyle] (showBelow) [below=3mm of background] {r head(params$interl, node.short)``r dots(params$interl, node.short)
};
\draw [showDrawStyle] (showBelow) -- (afterInterleaver.center);
}
\end{tikzpicture} \end{center}
r multipl.color``r dots(params$result, node.long)
)Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.