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)")
}

Faltungskodierer Informationen

Faltungskodierer Matrix : Nächster Zustand

\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}

Faltungskodierer Matrix : Ausgangsbits

\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}

Faltungskodierer Matrix : Zustandsdiagramm

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}

Turbo-Kodierer Informationen

Terminierung

  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

Turbokodierung ohne Punktierung

\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}



DaniWi/Channelcoding documentation built on May 6, 2019, 1:23 p.m.