Difference between revisions of "Channel Coding/Basics of Convolutional Coding"

From LNTwww
 
(26 intermediate revisions by 2 users not shown)
Line 8: Line 8:
 
== # OVERVIEW OF THE THIRD MAIN CHAPTER # ==
 
== # OVERVIEW OF THE THIRD MAIN CHAPTER # ==
 
<br>
 
<br>
This third main chapter discusses&nbsp; '''Convolutional codes''', first described in 1955 by&nbsp; [https://en.wikipedia.org/wiki/Peter_Elias "Peter Elias"]&nbsp; [Eli55]<ref name='Eli55'>Elias, P.: ''Coding for Noisy Channels''. In: IRE Conv. Rec. Part 4,pp. 37-47, 1955.</ref>. While for linear block codes (see&nbsp; [[Channel_Coding/Objective_of_Channel_Coding#.23_Overview_on_The_First_Main_Chapter_.23|"First Main Chapter"]])&nbsp; and Reed-Solomon codes&nbsp; (see [[Channel_Coding/Some_Basics_of_Algebra#. 23_OVERVIEW_OF_THE_SECOND_MAIN_CHAPTER_.23|"Second main chapter"]])&nbsp; the codeword length is&nbsp; $n$&nbsp; in each case, the theory of convolutional cdes is based on "semi-infinite" information and code sequences. Similarly, maximum likelihood decoding using the Viterbi algorithm per se yields the entire sequence.
+
This third main chapter discusses &nbsp; &raquo;'''convolutional codes'''&laquo;, &nbsp; first described in 1955 by&nbsp; [https://en.wikipedia.org/wiki/Peter_Elias $\text{Peter Elias}$]&nbsp; [Eli55]<ref name='Eli55'>Elias, P.:&nbsp; Coding for Noisy Channels.&nbsp; In:&nbsp; IRE Conv. Rec. Part 4, pp. 37-47, 1955.</ref>.&nbsp;  
  
Specifically, this chapter discusses:
+
*While for linear block codes&nbsp; $($see&nbsp; [[Channel_Coding/Objective_of_Channel_Coding#.23_OVERVIEW_OF_THE_FIRST_MAIN_CHAPTER_.23|$\text{first main chapter}$]]$)$&nbsp; and Reed-Solomon codes&nbsp; $($see&nbsp; [[Channel_Coding/Some_Basics_of_Algebra#.23_OVERVIEW_OF_THE_SECOND_MAIN_CHAPTER_.23|$\text{second main chapter}$]]$)$&nbsp; the code word length is&nbsp; $n$&nbsp; in each case,&nbsp;
 +
 
 +
*the theory of convolutional codes is based on&nbsp; "semi-infinite"&nbsp; information and encoded sequences.&nbsp; Similarly,&nbsp; "maximum likelihood decoding"&nbsp; using the&nbsp; [[Channel_Coding/Decoding_of_Convolutional_Codes#Viterbi_algorithm_based_on_correlation_and_metrics|$\text{Viterbi algorithm}$]]&nbsp; per se yields the entire sequence.
 +
 
 +
 
 +
Specifically,&nbsp; this chapter discusses:
 +
 
 +
#Important definitions for convolutional codes: &nbsp;  &raquo;code rate&laquo;,&nbsp; &raquo;memory&laquo;,&nbsp; &raquo; influence length&laquo;, &nbsp;&raquo; free distance&laquo;,
 +
#&raquo;similarities&laquo;&nbsp; and &nbsp;&raquo;differences&laquo;&nbsp; to linear block codes,
 +
#&raquo;generator matrix&laquo;&nbsp; and &nbsp;&raquo;transfer function matrix&laquo;&nbsp; of a convolutional code,
 +
#&raquo;fractional-rational transfer functions&laquo;&nbsp; for systematic convolutional codes,
 +
#description with&nbsp; &raquo;state transition diagram&laquo;&nbsp; and &nbsp;&raquo;trellis diagram&laquo;,
 +
#&raquo;termination&laquo;&nbsp; and &nbsp;&raquo;puncturing&laquo;&nbsp; of convolutional codes,
 +
#&raquo;decoding&laquo;&nbsp; of convolutional codes &nbsp; ⇒ &nbsp; &raquo;Viterbi algorithm&laquo;,
 +
#&raquo;weight enumerator functions&laquo;&nbsp; and approximations for the &nbsp;&raquo;bit error probability&laquo;.
  
*Important ''definitions''&nbsp; for convolutional codes: &nbsp; code rate, memory, influence length, free distance.
 
*''Similarities''&nbsp; and ''differences''&nbsp; to linear block codes,
 
*''generator matrix''&nbsp; and ''transfer function matrix''&nbsp; of a convolutional code,
 
*''Fractional-rational transfer functions''&nbsp; for systematic convolutional codes,
 
*Description with ''state transition diagram''&nbsp; and ''trellis diagram'',
 
*''termination''&nbsp; and ''puncturing''&nbsp; of convolutional codes,
 
*''decoding''&nbsp; of convolutional codes &nbsp; ⇒ &nbsp; ''Viterbi algorithm'',
 
*''weight enumerator functions''&nbsp; and approximations for the ''bit error probability''.
 
  
  
Line 26: Line 32:
 
We consider in this chapter an infinite binary information sequence&nbsp; $\underline{u}$&nbsp; and divide it into information blocks&nbsp; $\underline{u}_i$&nbsp; of&nbsp; $k$&nbsp; bits each. One can formalize this fact as follows:
 
We consider in this chapter an infinite binary information sequence&nbsp; $\underline{u}$&nbsp; and divide it into information blocks&nbsp; $\underline{u}_i$&nbsp; of&nbsp; $k$&nbsp; bits each. One can formalize this fact as follows:
  
::<math>\underline{\it u} = \left ( \underline{\it u}_1, \underline{\it u}_2, \hspace{0.05cm} \text{...} \hspace{0.05cm}, \underline{\it u}_i , \hspace{0.05cm} \text{...} \hspace{0.05cm}\right ) \hspace{0.3cm}{\rm mit}\hspace{0.3cm} \underline{\it u}_i = \left ( u_i^{(1)}, u_i^{(2)}, \hspace{0.05cm} \text{...} \hspace{0.05cm}, u_i^{(k)}\right )\hspace{0.05cm},</math>
+
::<math>\underline{\it u} = \left ( \underline{\it u}_1, \underline{\it u}_2, \hspace{0.05cm} \text{...} \hspace{0.05cm}, \underline{\it u}_i , \hspace{0.05cm} \text{...} \hspace{0.05cm}\right ) \hspace{0.3cm}{\rm with}\hspace{0.3cm} \underline{\it u}_i = \left ( u_i^{(1)}, u_i^{(2)}, \hspace{0.05cm} \text{...} \hspace{0.05cm}, u_i^{(k)}\right )\hspace{0.05cm},</math>
  
 
::<math>u_i^{(j)}\in {\rm GF(2)}\hspace{0.3cm}{\rm for} \hspace{0.3cm}1 \le j \le k  
 
::<math>u_i^{(j)}\in {\rm GF(2)}\hspace{0.3cm}{\rm for} \hspace{0.3cm}1 \le j \le k  
 
\hspace{0.5cm}\Rightarrow \hspace{0.5cm} \underline{\it u}_i \in {\rm GF}(2^k)\hspace{0.05cm}.</math>
 
\hspace{0.5cm}\Rightarrow \hspace{0.5cm} \underline{\it u}_i \in {\rm GF}(2^k)\hspace{0.05cm}.</math>
  
In English, such a sequence without negative indices is called <i>semi&ndash;infinite</i>&nbsp;.<br>
+
Such a sequence without negative indices is called&nbsp; &raquo;'''semi&ndash;infinite'''&laquo;.<br>
  
 
{{BlaueBox|TEXT=   
 
{{BlaueBox|TEXT=   
$\text{Definition:}$&nbsp; In a&nbsp; <b>Binary Convolutional Code</b>, a codeword&nbsp; $\underline{x}_i$&nbsp; consisting of&nbsp; $n$&nbsp; code bit is output at time&nbsp; $i$&nbsp;:
+
$\text{Definition:}$&nbsp; In a&nbsp; &raquo;<b>binary convolutional code</b>&laquo;,&nbsp; a code word&nbsp; $\underline{x}_i$&nbsp; consisting of&nbsp; $n$&nbsp; code bit is output at time&nbsp; $i$:
  
 
::<math>\underline{\it x}_i = \left ( x_i^{(1)}, x_i^{(2)}, \hspace{0.05cm} \text{...} \hspace{0.05cm}, x_i^{(n)}\right )\in {\rm GF}(2^n)\hspace{0.05cm}.</math>
 
::<math>\underline{\it x}_i = \left ( x_i^{(1)}, x_i^{(2)}, \hspace{0.05cm} \text{...} \hspace{0.05cm}, x_i^{(n)}\right )\in {\rm GF}(2^n)\hspace{0.05cm}.</math>
Line 43: Line 49:
 
*the&nbsp; $m$&nbsp; previous information blocks&nbsp; $\underline{u}_{i-1}$, ... , $\underline{u}_{i-m}$.<br>}}<br>
 
*the&nbsp; $m$&nbsp; previous information blocks&nbsp; $\underline{u}_{i-1}$, ... , $\underline{u}_{i-m}$.<br>}}<br>
  
[[File:P ID2590 KC T 3 1 S1 v1.png|right|frame|Dependencies for a convolutional encoder with&nbsp; $m = 2$|class=fit]]
+
[[File:EN_KC_T_3_1_S1_neu.png|right|frame|Dependencies for a convolutional encoder with&nbsp; $m = 2$|class=fit]]
  
The diagram opposite illustrates this fact for the parameters&nbsp; $k = 4, \ n = 7, \ m = 2$&nbsp; and&nbsp; $i = 4$.
+
The diagram opposite illustrates this fact for the parameters&nbsp;  
 +
:$$k = 4, \ n = 7, \ m = 2,\ i = 4.$$  
  
The&nbsp; $n = 7$&nbsp; code bits generated at time&nbsp; $i = 4$&nbsp; $x_4^{(1)}$, ... , $x_4^{(7)}$&nbsp; may depend (directly) on the&nbsp; $k \cdot (m+1) = 12$&nbsp; information bits marked in red and are generated by modulo 2 additions.<br>
+
The&nbsp; $n = 7$&nbsp; code bits&nbsp; $x_4^{(1)}$, ... , $x_4^{(7)}$&nbsp; generated at time&nbsp; $i = 4$&nbsp; may depend&nbsp; $($directly$)$&nbsp; on the&nbsp; $k \cdot (m+1) = 12$&nbsp; information bits marked in red and are generated by modulo-2 additions.<br>
  
Also drawn in yellow is a&nbsp; $(n, k)$ convolutional encoder. Note that the vector&nbsp; $\underline{u}_i$&nbsp; and the sequence&nbsp; $\underline{u}^{(i)}$&nbsp; are fundamentally different:  
+
Drawn in yellow is a&nbsp; $(n, k)$&nbsp; convolutional encoder.&nbsp; Note that the vector&nbsp; $\underline{u}_i$&nbsp; and the sequence&nbsp; $\underline{u}^{(i)}$&nbsp; are fundamentally different:  
*While&nbsp; $\underline{u}_i = (u_i^{(1)}, u_i^{(2)}$, ... , $u_i^{(k)})$&nbsp; summarizes&nbsp; $k$&nbsp; at time&nbsp; $i$&nbsp; parallel information bits,
+
*While&nbsp; $\underline{u}_i = (u_i^{(1)}, u_i^{(2)}$, ... , $u_i^{(k)})$&nbsp; summarizes&nbsp; $k$&nbsp; parallel information bits at time&nbsp; $i$,
* denotes&nbsp; $\underline{u}^i = (u_1^{(i)}$, $u_2^{(i)}, \ \text{...})$&nbsp; the (horizontal) sequence at&nbsp; $i$&ndash;th input of the convolutional encoder.  
+
 
 +
* $\underline{u}^i = (u_1^{(i)}$, $u_2^{(i)}, \ \text{...})$&nbsp; denotes the&nbsp; $($horizontal$)$&nbsp; sequence at&nbsp; $i$&ndash;th input of the convolutional encoder.  
  
  
 
{{BlaueBox|TEXT=   
 
{{BlaueBox|TEXT=   
$\text{Definitions related to convolutional codes:}$&nbsp;   
+
$\text{Some definitions related to convolutional codes:}$&nbsp;   
*The&nbsp; <b>code rate</b>&nbsp; results as for the block codes to&nbsp; $R = k/n$.<br>
+
*The &nbsp; &raquo;<b>code rate</b>&laquo; &nbsp; results as for the block codes to&nbsp; $R = k/n$.<br>
  
*Perceive &nbsp; $m$&nbsp; as the&nbsp; <b>memory</b>&nbsp; of the code and the <i>convolutional code</i>&nbsp; itself with&nbsp; ${\rm CC} \ (n, k, m)$.<br>
+
*Perceive &nbsp; $m$&nbsp; as the&nbsp; &raquo;<b>memory</b>&laquo;&nbsp; of the code and the&nbsp; "convolutional code"&nbsp; itself with&nbsp; ${\rm CC} \ (n, k, m)$.<br>
  
*This gives the&nbsp; <b>constraint length</b>&nbsp; $\nu = m + 1$.<br>
+
*This gives the&nbsp; &raquo;<b>constraint length</b>&laquo;&nbsp; $\nu = m + 1$&nbsp; of the convolutional code.<br>
  
*For&nbsp; $k > 1$&nbsp; one often gives these parameters also in bits: &nbsp; $m_{\rm Bit} = m \cdot k$ &nbsp; &nbsp;resp.&nbsp; &nbsp; $\nu_{\rm Bit} = (m + 1) \cdot k$.<br>}}
+
*For&nbsp; $k > 1$&nbsp; one often gives these parameters also in bits: &nbsp; $m_{\rm bit} = m \cdot k$ &nbsp; &nbsp;resp.&nbsp; &nbsp; $\nu_{\rm bit} = (m + 1) \cdot k$.<br>}}
  
 
== Similarities and differences compared to block codes ==
 
== Similarities and differences compared to block codes ==
 
<br>
 
<br>
From the&nbsp; [[Channel_Coding/Basics_of_Convolutional_Coding#Requirements_and_definitions| "definition"]]&nbsp; on the previous page, it is evident that a binary convolutional code with&nbsp; $m = 0$&nbsp; (i.e., without memory) would be identical to a binary block code as described in the first main chapter. We exclude this limiting case and therefore always assume for the following:
+
From the&nbsp; [[Channel_Coding/Basics_of_Convolutional_Coding#Requirements_and_definitions| $\text{definition}$]]&nbsp; in the previous section,&nbsp; it is evident that a binary convolutional code with&nbsp; $m = 0$&nbsp; $($i.e., without memory$)$&nbsp; would be identical to a binary block code as described in the first main chapter.&nbsp; We exclude this limiting case and therefore assume always for the following:
 
*The memory&nbsp; $m$&nbsp; be greater than or equal to&nbsp; $1$.<br>
 
*The memory&nbsp; $m$&nbsp; be greater than or equal to&nbsp; $1$.<br>
  
Line 72: Line 80:
  
 
{{GraueBox|TEXT=   
 
{{GraueBox|TEXT=   
$\text{Example 1:}$&nbsp; For a&nbsp; $(7, 4)$ block code, the codeword&nbsp; $\underline {x}_4$&nbsp; depends only on the information word&nbsp; $\underline{u}_4$&nbsp; but not on&nbsp; $\underline{u}_2$&nbsp; and&nbsp; $\underline{u}_3$, as in the&nbsp; [[Channel_Coding/Basics_of_Convolutional_Coding#Requirements_and_definitions| "example convolutional codes"]]&nbsp; $($with&nbsp; $m = 2)$&nbsp; on the last page.<br>
+
$\text{Example 1:}$&nbsp; For a&nbsp; $(7, 4)$&nbsp; block code,&nbsp; the code word&nbsp; $\underline {x}_4$&nbsp; depends only on the information word&nbsp; $\underline{u}_4$&nbsp; but not on&nbsp; $\underline{u}_2$&nbsp; and&nbsp; $\underline{u}_3$, as in the&nbsp; [[Channel_Coding/Basics_of_Convolutional_Coding#Requirements_and_definitions| $\text{example convolutional codes}$]]&nbsp; $($with&nbsp; $m = 2)$&nbsp; in the last section.<br>
  
[[File:P ID2592 KC T 3 1 S2 v2.png|right|frame|Dependencies on a&nbsp; $(7, 4)$ block code at time&nbsp; $i = 4$|class=fit]]
+
[[File:EN_KC_T_3_1_S2.png|right|frame|Dependencies on a&nbsp; $(7, 4)$&nbsp; block code at time&nbsp; $i = 4$|class=fit]]
  
 
For example, if
 
For example, if
 
:$$x_4^{(1)} = u_4^{(1)}, \ x_4^{(2)} = u_4^{(2)},$$
 
:$$x_4^{(1)} = u_4^{(1)}, \ x_4^{(2)} = u_4^{(2)},$$
 
:$$x_4^{(3)} = u_4^{(3)}, \ x_4^{(4)} = u_4^{(4)}$$  
 
:$$x_4^{(3)} = u_4^{(3)}, \ x_4^{(4)} = u_4^{(4)}$$  
sowie
+
as well as
 
:$$x_4^{(5)} = u_4^{(1)}+ u_4^{(2)}+u_4^{(3)}\hspace{0.05cm},$$  
 
:$$x_4^{(5)} = u_4^{(1)}+ u_4^{(2)}+u_4^{(3)}\hspace{0.05cm},$$  
 
:$$x_4^{(6)} = u_4^{(2)}+ u_4^{(3)}+u_4^{(4)}\hspace{0.05cm},$$
 
:$$x_4^{(6)} = u_4^{(2)}+ u_4^{(3)}+u_4^{(4)}\hspace{0.05cm},$$
 
:$$x_4^{(7)} = u_4^{(1)}+ u_4^{(2)}+u_4^{(4)}\hspace{0.05cm},$$
 
:$$x_4^{(7)} = u_4^{(1)}+ u_4^{(2)}+u_4^{(4)}\hspace{0.05cm},$$
  
applies then it is a so-called&nbsp; [[Channel_Coding/Examples_of_Binary_Block_Codes#Hamming_Codes| "systematic Hamming code"]]&nbsp; $\text{HS (7, 4, 3)}$. In the graph, these special dependencies for&nbsp; $x_4^{(1)}$&nbsp; and&nbsp; $x_4^{(7)}$&nbsp; are drawn in red.}}<br>
+
applies then it is a so-called&nbsp; [[Channel_Coding/Examples_of_Binary_Block_Codes#Hamming_Codes| $\text{systematic Hamming code}$]]&nbsp; $\text{HS (7, 4, 3)}$.&nbsp; In the graph,&nbsp; these special dependencies for&nbsp; $x_4^{(1)}$&nbsp; and&nbsp; $x_4^{(7)}$&nbsp; are drawn in red.}}<br>
  
In a sense, one could also interpret a&nbsp; $(n, k)$ convolutional code with memory&nbsp; $m &#8805; 1$&nbsp; as a block code whose code parameters&nbsp; $n\hspace{0.05cm}' \gg n$&nbsp; and&nbsp; $k\hspace{0.05cm}' \gg k$&nbsp; however, would have to assume much larger values than those of the present convolutional code. However, because of the large differences in description, properties, and especially decoding, we consider convolutional codes to be something completely new in this learning tutorial. The reasons for this are as follows:
+
In a sense,&nbsp; one could also interpret a&nbsp; $(n, k)$&nbsp; convolutional code with memory&nbsp; $m &#8805; 1$&nbsp; as a block code whose code parameters&nbsp; $n\hspace{0.05cm}' \gg n$&nbsp; and&nbsp; $k\hspace{0.05cm}' \gg k$&nbsp; would have to assume much larger values than those of the present convolutional code.&nbsp;  
*A block coder converts information words of length&nbsp; $k$&nbsp; bits into code words of length&nbsp; $n$&nbsp; bits each, block by block. In this case, the larger its codeword length&nbsp; $n$&nbsp; is, the more powerful the block code is. For a given code rate&nbsp; $R = k/n$&nbsp; this also requires a large information word length&nbsp; $k$.<br>
 
  
*In contrast, the correction capability of a convolutional code is essentially determined by its memory&nbsp; $m$&nbsp;. The code parameters&nbsp; $k$&nbsp; and&nbsp; $n$&nbsp; are mostly chosen very small here&nbsp; $(1, \ 2, \ 3, \ \text{...})$. Thus, only very few and, moreover, very simple convolutional codes are of practical importance.<br>
+
However,&nbsp; because of the large differences in description,&nbsp; properties,&nbsp; and especially decoding,&nbsp; we consider convolutional codes to be something completely new in this learning tutorial.&nbsp; The reasons for this are as follows:
 
+
# &nbsp; A block encoder  converts block-by-block information words of length&nbsp; $k$&nbsp; bits into code words of length&nbsp; $n$&nbsp; bits each.&nbsp; In this case,&nbsp; the larger its code word length&nbsp; $n$,&nbsp; the more powerful the block code is.&nbsp; For a given code rate&nbsp; $R = k/n$&nbsp; this also requires a large information word length&nbsp; $k$.<br>
*Even with small values for&nbsp; $k$&nbsp; and&nbsp; $n$&nbsp; a convolutional encoder transfers a whole sequence of information bits&nbsp; $(k\hspace{0.05cm}' &#8594; &#8734;)$&nbsp; into a very long sequence of code bits&nbsp; $(n\hspace{0.05cm}' = k\hspace{0.05cm}'/R)$. Such a code thus often provides a large correction capability as well.<br>
+
# &nbsp; In contrast,&nbsp; the correction capability of a convolutional code is essentially determined by its memory&nbsp; $m$.&nbsp; The code parameters&nbsp; $k$&nbsp; and&nbsp; $n$&nbsp; are mostly chosen very small here&nbsp; $(1, \ 2, \ 3, \ \text{...})$.&nbsp; Thus,&nbsp; only very few and,&nbsp; moreover,&nbsp; very simple convolutional codes are of practical importance.<br>
 
+
# &nbsp; Even with small values for&nbsp; $k$&nbsp; and&nbsp; $n$,&nbsp; a convolutional encoder transfers a whole sequence of information bits&nbsp; $(k\hspace{0.05cm}' &#8594; &#8734;)$&nbsp; into a very long sequence of code bits&nbsp; $(n\hspace{0.05cm}' = k\hspace{0.05cm}'/R)$.&nbsp;  Such a code thus often provides a large correction capability as well.<br>
*There are efficient convolutional decoders, for example the&nbsp; [[Channel_Coding/Decodierung_von_Faltungscodes#Viterbi.E2.80.93Algorithmus.2C_basierend_auf_Korrelation_und_Metriken| "Viterbi algorithm"]]&nbsp; and the&nbsp; [[Channel_Coding/Soft%E2%80%93in_Soft%E2%80%93out_Decoder#BCJR.E2.80.93Decodierung:_Vorw.C3.A4rts.E2.80.93R.C3.BCckw.C3.A4rts.E2.80.93Algorithmus| "BCJR algorithm"]], which can process reliability information about the channel &nbsp; &rArr; &nbsp; ''Soft&ndash;Decision&ndash;Input''&nbsp; and provide reliability information about the decoding result &nbsp; &rArr; &nbsp; <i>Soft&ndash;Decision&ndash;Output</i>&nbsp;.<br>
+
# &nbsp; There are efficient convolutional decoders,&nbsp; for example the&nbsp; [[Channel_Coding/Decoding_of_Convolutional_Codes#Viterbi_algorithm_based_on_correlation_and_metrics|$\text{Viterbi algorithm}$]]&nbsp; and the&nbsp; [[Channel_Coding/Soft-in_Soft-Out_Decoder#BCJR_decoding:_Forward-backward_algorithm| $\text{BCJR algorithm}$]],&nbsp; which can process reliability information about the channel &nbsp; &rArr; &nbsp; "soft decision input"&nbsp; and provide reliability information about the decoding result &nbsp; &rArr; &nbsp; "soft decision output".<br>
 +
# &nbsp; Please note:&nbsp; The terms&nbsp; "convolutional code"&nbsp; and&nbsp; "convolutional encoder"&nbsp; should not be confused:
 +
::*The&nbsp; "convolutional code"&nbsp; ${\rm CC} \ (n, \ k, \ m)$ &nbsp; &#8658; &nbsp; $R = k/n$&nbsp; is understood as&nbsp; "the set of all possible encoded sequences&nbsp; $\underline{x}$&nbsp; $($at the output$)$&nbsp; that can be generated with this code considering all possible information sequences&nbsp; $\underline{u}$&nbsp; $($at the input$)$".
 +
 +
::*There are several&nbsp; "convolutional encoders"&nbsp; that realize the same&nbsp; "convolutional code".<br>
  
 
== Rate 1/2 convolutional encoder ==
 
== Rate 1/2 convolutional encoder ==
 
<br>
 
<br>
[[File:EN_KC_T_3_1_S3a.png|right|frame|Convolutional encoder&nbsp; $(n = 2, \hspace{0.05cm} k = 1)$&nbsp; for one information bit&nbsp; $u_i$|class=fit]]
+
[[File:EN_KC_T_3_1_S3ab.png|right|frame|Convolutional encoder&nbsp; $(n = 2, \hspace{0.05cm} k = 1)$&nbsp; for one bit&nbsp; $u_i$&nbsp; $($upper graphic$)$&nbsp; and for  the information sequence&nbsp; $\underline{u}$&nbsp;  $($lower graphic$)$|class=fit]]  
  
 +
The upper graph shows a&nbsp; $(n = 2, \hspace{0.05cm} k = 1)$&nbsp; convolutional encoder.&nbsp;
  
*By a convolutional code&nbsp; ${\rm CC} \ (n, \ k, \ m)$ &nbsp; &#8658; &nbsp; $R = k/n$&nbsp; is understood as the set of all possible code sequences&nbsp; $\underline{x}$ that can be generated with this code considering all possible information sequences&nbsp; $\underline{u}$&nbsp; (at the input).  
+
*At clock time&nbsp; $i$&nbsp; the information bit&nbsp; $u_i$&nbsp; is present at the encoder input and the&nbsp; $2$&ndash;bit code block&nbsp; $\underline{x}_i = (x_i^{(1)}, \ x_i^{(2)})$&nbsp; is output.&nbsp;
*There are several convolutional encoders that realize the same convolutional code.<br>
 
  
 
+
*To generate two code bits&nbsp; $x_i^{(1)}$&nbsp; and&nbsp; $x_i^{(2)}$&nbsp; from a single information bit,&nbsp; the convolutional encoder must include at least one memory element:
[[File:EN_KC_T_3_1_S3b.png|right|frame|Convolutional encoder&nbsp; $(n = 2, \hspace{0.05cm} k = 1)$&nbsp; for the information sequence.&nbsp; $\underline{u}$|class=fit]]
 
The top graph shows a&nbsp; $(n = 2, \hspace{0.05cm} k = 1)$ convolutional encoder.
 
 
 
*At the clock time&nbsp; $i$&nbsp; the information bit&nbsp; $u_i$&nbsp; is present at the encoder input and the 2 bit code block&nbsp; $\underline{x}_i = (x_i^{(1)}, \ x_i^{(2)})$&nbsp; is output.
 
*Taking into account the (half&ndash;infinite) long information sequence&nbsp; $\underline{u}$&nbsp; the model results according to the second graph.<br>
 
*To generate two codebits&nbsp; $x_i^{(1)}$&nbsp; and&nbsp; $x_i^{(2)}$&nbsp; from a single bit of information, the convolutional encoder must include at least one memory element:  
 
 
:$$k = 1\hspace{0.05cm}, \ n = 2 \hspace{0.3cm}\Rightarrow \hspace{0.3cm} m \ge 1
 
:$$k = 1\hspace{0.05cm}, \ n = 2 \hspace{0.3cm}\Rightarrow \hspace{0.3cm} m \ge 1
 
  \hspace{0.05cm}.$$
 
  \hspace{0.05cm}.$$
  
 +
*Taking into account the&nbsp; $($half&ndash;infinite$)$&nbsp; long information sequence&nbsp; $\underline{u}$&nbsp; the model results according to the lower graph.
 +
<br clear=all>
 
{{GraueBox|TEXT=   
 
{{GraueBox|TEXT=   
$\text{Example 2:}$&nbsp; Below is shown a convolutional encoder for the parameters&nbsp; $k = 1, \ n = 2$&nbsp; and&nbsp; $m = 1$&nbsp;. The square with yellow background indicates a memory element. Dessen Beschriftung&nbsp; $D$&nbsp; is derived from <i>delay</i>.<br>
+
$\text{Example 2:}$&nbsp; The graphic shows a convolutional encoder for the parameters&nbsp; $k = 1, \ n = 2$&nbsp; and&nbsp; $m = 1$.&nbsp;
  
[[File:EN_KC_T_3_1_S3c.png|right|frame|Convolutional encoder with&nbsp; $k = 1, \ n = 2, \ m = 1$&nbsp; and example sequences|class=fit]]
+
[[File:EN_KC_T_3_1_S3c.png|right|frame|Convolutional encoder with&nbsp; $k = 1, \ n = 2, \ m = 1$&nbsp; and example sequences; &nbsp; the square with label&nbsp; $D$&nbsp;  $($"delay"$)$&nbsp; indicates a memory element. |class=fit]]
  
*This is a <i>systematic</i>&nbsp; convolutional encoder, characterized by&nbsp; $x_i^{(1)} = u_i$.
+
*This is a&nbsp; "systematic"&nbsp; convolutional encoder,&nbsp; characterized by&nbsp;  
 +
:$$x_i^{(1)} = u_i.$$  
 
*The second output returns&nbsp; $x_i^{(2)} = u_i + u_{i-1}$.  
 
*The second output returns&nbsp; $x_i^{(2)} = u_i + u_{i-1}$.  
  
*In the example output sequence&nbsp; $\underline{x}$&nbsp; after&nbsp; <i>multiplexing</i>&nbsp; all&nbsp; $x_i^{(1)}$&nbsp; are labeled red and all&nbsp; $x_i^{(2)}$&nbsp; are labeled blue.}}<br>
 
  
[[File:EN_KC_T_3_1_S3d.png|right|frame|Faltungscoder&nbsp; $(k = 1, \ n = 2, \ m = 2)$&nbsp; in zwei verschiedenen Darstellungen|class=fit]]
+
*In the example output sequence&nbsp; $\underline{x}$&nbsp; after multiplexing 
 +
:*all&nbsp; $x_i^{(1)}$&nbsp; are labeled red,
 +
 
 +
:*all&nbsp; $x_i^{(2)}$&nbsp; are labeled blue.}}<br>
 +
 
 
{{GraueBox|TEXT=   
 
{{GraueBox|TEXT=   
 
$\text{Example 3:}$&nbsp;  
 
$\text{Example 3:}$&nbsp;  
The diagram shows a&nbsp; $(n = 2, \ k = 1)$ convolutional encoder with&nbsp; $m = 2$&nbsp; memory elements:
+
The graphic shows a&nbsp; $(n = 2, \ k = 1)$&nbsp; convolutional encoder with&nbsp; $m = 2$&nbsp; memory elements:
 +
 
 
*On the left is shown the equivalent circuit.
 
*On the left is shown the equivalent circuit.
*On the right is a realization form of this encoder.  
+
 
 +
*On the right you see a realization form of this encoder.  
  
 
*The two information bits are:
 
*The two information bits are:
 +
[[File:EN_KC_T_3_1_S3d_neu.png|right|frame|Convolutional encoder&nbsp; $(k = 1, \ n = 2, \ m = 2)$&nbsp; in two different representations|class=fit]]
 +
 
::<math>x_i^{(1)} = u_{i} + u_{i-1}+ u_{i-2} \hspace{0.05cm},</math>
 
::<math>x_i^{(1)} = u_{i} + u_{i-1}+ u_{i-2} \hspace{0.05cm},</math>
 
::<math>x_i^{(2)} = u_{i} + u_{i-2} \hspace{0.05cm}.</math>
 
::<math>x_i^{(2)} = u_{i} + u_{i-2} \hspace{0.05cm}.</math>
  
 
*Because&nbsp; $x_i^{(1)} &ne; u_i$&nbsp; this is not a systematic code.
 
*Because&nbsp; $x_i^{(1)} &ne; u_i$&nbsp; this is not a systematic code.
<br clear=all>
 
It can be seen:
 
*The information sequence&nbsp; $\underline{u}$&nbsp; is stored in a shift register of length&nbsp; $L = m + 1 = 3$&nbsp;.<br>
 
  
*At the clock time&nbsp; $i$&nbsp; the left memory element contains the current information bit&nbsp; $u_i$, which is shifted one place to the right at each of the next clock times.<br>
 
  
*The number of yellow squares again gives the memory&nbsp; $m = 2$&nbsp; of the encoder.<br><br>
+
It can be seen:
 +
# The input sequence&nbsp; $\underline{u}$&nbsp; is stored in a shift register of length&nbsp; $L = m + 1 = 3$&nbsp;.<br>
 +
#At clock time&nbsp; $i$&nbsp; the left memory element contains the current information bit&nbsp; $u_i$,&nbsp; which is shifted one place to the right at each of the next clock times.<br>
 +
#The number of yellow squares gives the memory&nbsp; $m = 2$&nbsp; of the encoder.<br><br>
  
From the two plots it is clear that&nbsp; $x_i^{(1)}$&nbsp; and&nbsp; $x_i^{(2)}$&nbsp; can each be interpreted as the output of a&nbsp; [[Theory_of_Stochastic_Signals/Digital_Filters|"digital filter"]]&nbsp; over the Galois field&nbsp; ${\rm GF(2)}$&nbsp; where both filters operate in parallel with the same input sequence&nbsp; $\underline{u}$&nbsp;.  
+
&rArr; &nbsp; From these plots it is clear that&nbsp; $x_i^{(1)}$&nbsp; and&nbsp; $x_i^{(2)}$&nbsp; can each be interpreted as the output of a&nbsp; [[Theory_of_Stochastic_Signals/Digital_Filters|$\text{digital filter}$]]&nbsp; over the Galois field&nbsp; ${\rm GF(2)}$&nbsp; where both filters operate in parallel with the same input sequence&nbsp; $\underline{u}$&nbsp;.  
  
Since (in general terms) the output signal of a filter results from the&nbsp; [[Signal_Representation/The_Convolution_Theorem_and_Operation#Convolution_in_the_time_domain| "convolution"]]&nbsp; of the input signal with the filter impulse response, this is referred to as&nbsp; <i>convolutional coding</i>.<br>}}
+
&rArr; &nbsp; Since&nbsp; $($in general terms$)$,&nbsp; the output signal of a filter results from the&nbsp; [[Signal_Representation/The_Convolution_Theorem_and_Operation#Convolution_in_the_time_domain|$\text{convolution}$]]&nbsp; of the input signal with the filter impulse response,&nbsp; this is referred to as&nbsp; "convolutional coding".<br>}}
  
 
== Convolutional encoder with two inputs ==
 
== Convolutional encoder with two inputs ==
 
<br>  
 
<br>  
 
[[File:P ID2598 KC T 3 1 S4 v1.png|right|frame|Convolutional encoder with&nbsp; $k = 2$&nbsp; and&nbsp; $n = 3$]]
 
[[File:P ID2598 KC T 3 1 S4 v1.png|right|frame|Convolutional encoder with&nbsp; $k = 2$&nbsp; and&nbsp; $n = 3$]]
Now consider a convolutional encoder that generates code bits from&nbsp; $k = 2$&nbsp; information bits&nbsp; $n = 3$&nbsp;.
+
Now consider a convolutional encoder that generates&nbsp; $n = 3$&nbsp; code bits from&nbsp; $k = 2$&nbsp; information bits.
*The information sequence&nbsp; $\underline{u}$&nbsp; is divided into blocks of two bits each.  
+
*The information sequence&nbsp; $\underline{u}$&nbsp; is divided into blocks of two bits each.
*At the clock time&nbsp; $i$&nbsp; bit&nbsp; $u_i^{(1)}$&nbsp; is present at the upper input and&nbsp; $u_i^{(2)}$ is present at the lower input.  
+
*For the&nbsp; $n = 3$&nbsp; code bits at time&nbsp; $i$&nbsp; then holds:
+
*At the clock time&nbsp; $i$: &nbsp; The bit&nbsp; $u_i^{(1)}$&nbsp; is present at the upper input and&nbsp; $u_i^{(2)}$ at the lower input.  
 +
 
 +
*Then holds for the&nbsp; $n = 3$&nbsp; code bits at time&nbsp; $i$:
 
::<math>x_i^{(1)} = u_{i}^{(1)} + u_{i-1}^{(1)}+ u_{i-1}^{(2)} \hspace{0.05cm},</math>
 
::<math>x_i^{(1)} = u_{i}^{(1)} + u_{i-1}^{(1)}+ u_{i-1}^{(2)} \hspace{0.05cm},</math>
 
::<math>x_i^{(2)} = u_{i}^{(2)} + u_{i-1}^{(1)} \hspace{0.05cm},</math>
 
::<math>x_i^{(2)} = u_{i}^{(2)} + u_{i-1}^{(1)} \hspace{0.05cm},</math>
 
::<math>x_i^{(3)} = u_{i}^{(1)} + u_{i}^{(2)}+ u_{i-1}^{(1)} \hspace{0.05cm}.</math>
 
::<math>x_i^{(3)} = u_{i}^{(1)} + u_{i}^{(2)}+ u_{i-1}^{(1)} \hspace{0.05cm}.</math>
  
In the graph, the info&ndash;bits&nbsp; $u_i^{(1)}$&nbsp; and&nbsp; $u_i^{(2)}$&nbsp; are marked red and blue, respectively, and the previous info&ndash;bits&nbsp; $u_{i-1}^{(1)}$&nbsp; and&nbsp; $u_{i-1}^{(2)}$&nbsp; are marked green and brown, respectively.
+
In the graph,&nbsp; the info&ndash;bits&nbsp; $u_i^{(1)}$&nbsp; and&nbsp; $u_i^{(2)}$&nbsp; are marked red resp. blue,&nbsp; and the previous info&ndash;bits&nbsp; $u_{i-1}^{(1)}$&nbsp; resp.&nbsp; $u_{i-1}^{(2)}$&nbsp; are marked green and brown, respectively  
  
 
To be noted:
 
To be noted:
*The <i>memory</i>&nbsp; $m$&nbsp; is is equal to the maximum memory cell count in a branch &nbsp;&nbsp;&#8658;&nbsp;&nbsp; here&nbsp; $m = 1$.
+
# &nbsp; The&nbsp; "memory"&nbsp; $m$&nbsp; is equal to the maximum memory cell count in a branch &nbsp;&nbsp;&#8658;&nbsp;&nbsp; here&nbsp; $m = 1$.
 +
# &nbsp; The&nbsp; "influence length"&nbsp; $\nu$&nbsp; is equal to the sum of all memory elements &nbsp;&nbsp;&#8658;&nbsp;&nbsp; here&nbsp; $\nu = 2$.<br>
 +
# &nbsp;All memory elements are set to zero at the beginning of the coding&nbsp; $($"initialization"$)$.
 +
# &nbsp;The code defined herewith is the set of all possible encoded sequences&nbsp; $\underline{x}$,&nbsp; which result when all possible information sequences&nbsp; $\underline{u}$&nbsp; are entered.
 +
# &nbsp;Both&nbsp; $\underline{u}$&nbsp; and&nbsp; $\underline{x}$&nbsp; are thereby (temporally) unbounded.<br>
  
*The <i>influence length</i>&nbsp; $\nu$&nbsp; is equal to the sum of all memory elements. &nbsp;&nbsp;&#8658;&nbsp;&nbsp; hier&nbsp; $\nu = 2$.<br>
 
  
*All memory elements are set to zero at the beginning of the coding (<i>initialization</i>&nbsp;).<br><br>
+
{{GraueBox|TEXT= 
 +
$\text{Example 4:}$&nbsp; Let the information sequence be &nbsp;$\underline{u} = (0, 1, 1, 0, 0, 0, 1, 1, \ \text{ ...})$.&nbsp; This gives the subsequences&nbsp;  
 +
*$\underline{u}^{(1)} = (0, 1, 0, 1, \ \text{ ...})$,
 +
*$\underline{u}^{(2)} = (1, 0, 0, 1, \ \text{ ...})$.  
  
The code defined herewith is the set of all possible code sequences&nbsp; $\underline{x}$, which result when all possible information sequences&nbsp; $\underline{u}$&nbsp; are entered. Both&nbsp; $\underline{u}$&nbsp; and&nbsp; $\underline{x}$&nbsp; are thereby (temporally) unbounded.<br>
 
 
{{GraueBox|TEXT= 
 
$\text{Example 4:}$&nbsp; Let the information sequence be &nbsp;$\underline{u} = (0, 1, 1, 0, 0, 0, 1, 1, \ \text{ ...})$. This gives the subsequences&nbsp; $\underline{u}^{(1)} = (0, 1, 0, 1, \ \text{ ...})$ &nbsp;and&nbsp; $\underline{u}^{(2)} = (1, 0, 0, 1, \ \text{ ...})$.
 
  
 
With the specification&nbsp; $u_0^{(1)} = u_0^{(2)} = 0$&nbsp; it follows from the above equations for the&nbsp; $n = 3$&nbsp; code bits.
 
With the specification&nbsp; $u_0^{(1)} = u_0^{(2)} = 0$&nbsp; it follows from the above equations for the&nbsp; $n = 3$&nbsp; code bits.
*in the first coding step&nbsp; $(i = 1)$:  
+
*at the first coding step&nbsp; $(i = 1)$:  
 
 
  
 
::<math>x_1^{(1)} = u_{1}^{(1)} = 0  \hspace{0.05cm},\hspace{0.4cm}
 
::<math>x_1^{(1)} = u_{1}^{(1)} = 0  \hspace{0.05cm},\hspace{0.4cm}
Line 180: Line 197:
 
x_1^{(3)} = u_{1}^{(1)} + u_{1}^{(2)} = 0+1 = 1 \hspace{0.05cm},</math>
 
x_1^{(3)} = u_{1}^{(1)} + u_{1}^{(2)} = 0+1 = 1 \hspace{0.05cm},</math>
  
*in the second coding step&nbsp; $(i = 2)$:
+
*at the second coding step&nbsp; $(i = 2)$:
  
 
::<math>x_2^{(1)} =u_{2}^{(1)} + u_{1}^{(1)}+ u_{1}^{(2)} = 1 + 0 + 1 = 0\hspace{0.05cm},\hspace{0.4cm}
 
::<math>x_2^{(1)} =u_{2}^{(1)} + u_{1}^{(1)}+ u_{1}^{(2)} = 1 + 0 + 1 = 0\hspace{0.05cm},\hspace{0.4cm}
Line 192: Line 209:
 
x_3^{(3)} =u_{3}^{(1)} + u_{3}^{(2)}+ u_{2}^{(1)} = 0+0+1 =1\hspace{0.05cm},</math>
 
x_3^{(3)} =u_{3}^{(1)} + u_{3}^{(2)}+ u_{2}^{(1)} = 0+0+1 =1\hspace{0.05cm},</math>
  
*and finally in the fourth coding step&nbsp; $(i = 4)$:
+
*and finally at the fourth coding step&nbsp; $(i = 4)$:
  
 
::<math>x_4^{(1)} = u_{4}^{(1)} + u_{3}^{(1)}+ u_{3}^{(2)} = 1+0+0 = 1\hspace{0.05cm},\hspace{0.4cm}
 
::<math>x_4^{(1)} = u_{4}^{(1)} + u_{3}^{(1)}+ u_{3}^{(2)} = 1+0+0 = 1\hspace{0.05cm},\hspace{0.4cm}
Line 198: Line 215:
 
x_4^{(3)}= u_{4}^{(1)} + u_{4}^{(2)}+ u_{3}^{(1)} = 1+1+0 =0\hspace{0.05cm}.</math>
 
x_4^{(3)}= u_{4}^{(1)} + u_{4}^{(2)}+ u_{3}^{(1)} = 1+1+0 =0\hspace{0.05cm}.</math>
  
Thus the code sequence is after the multiplexer: &nbsp; &nbsp; $\underline{x} = (0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, \ \text{...})$.}}<br>
+
Thus the encoded sequence is after the multiplexer: &nbsp; &nbsp; $\underline{x} = (0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, \ \text{...})$.}}<br>
  
 
== Exercises for the chapter==
 
== Exercises for the chapter==

Latest revision as of 17:02, 7 December 2022

# OVERVIEW OF THE THIRD MAIN CHAPTER #


This third main chapter discusses   »convolutional codes«,   first described in 1955 by  $\text{Peter Elias}$  [Eli55][1]

  • the theory of convolutional codes is based on  "semi-infinite"  information and encoded sequences.  Similarly,  "maximum likelihood decoding"  using the  $\text{Viterbi algorithm}$  per se yields the entire sequence.


Specifically,  this chapter discusses:

  1. Important definitions for convolutional codes:   »code rate«,  »memory«,  » influence length«,  » free distance«,
  2. »similarities«  and  »differences«  to linear block codes,
  3. »generator matrix«  and  »transfer function matrix«  of a convolutional code,
  4. »fractional-rational transfer functions«  for systematic convolutional codes,
  5. description with  »state transition diagram«  and  »trellis diagram«,
  6. »termination«  and  »puncturing«  of convolutional codes,
  7. »decoding«  of convolutional codes   ⇒   »Viterbi algorithm«,
  8. »weight enumerator functions«  and approximations for the  »bit error probability«.


Requirements and definitions


We consider in this chapter an infinite binary information sequence  $\underline{u}$  and divide it into information blocks  $\underline{u}_i$  of  $k$  bits each. One can formalize this fact as follows:

\[\underline{\it u} = \left ( \underline{\it u}_1, \underline{\it u}_2, \hspace{0.05cm} \text{...} \hspace{0.05cm}, \underline{\it u}_i , \hspace{0.05cm} \text{...} \hspace{0.05cm}\right ) \hspace{0.3cm}{\rm with}\hspace{0.3cm} \underline{\it u}_i = \left ( u_i^{(1)}, u_i^{(2)}, \hspace{0.05cm} \text{...} \hspace{0.05cm}, u_i^{(k)}\right )\hspace{0.05cm},\]
\[u_i^{(j)}\in {\rm GF(2)}\hspace{0.3cm}{\rm for} \hspace{0.3cm}1 \le j \le k \hspace{0.5cm}\Rightarrow \hspace{0.5cm} \underline{\it u}_i \in {\rm GF}(2^k)\hspace{0.05cm}.\]

Such a sequence without negative indices is called  »semi–infinite«.

$\text{Definition:}$  In a  »binary convolutional code«,  a code word  $\underline{x}_i$  consisting of  $n$  code bit is output at time  $i$:

\[\underline{\it x}_i = \left ( x_i^{(1)}, x_i^{(2)}, \hspace{0.05cm} \text{...} \hspace{0.05cm}, x_i^{(n)}\right )\in {\rm GF}(2^n)\hspace{0.05cm}.\]

This results according to

  • the  $k$  bit of the current information block  $\underline{u}_i$, and
  • the  $m$  previous information blocks  $\underline{u}_{i-1}$, ... , $\underline{u}_{i-m}$.


Dependencies for a convolutional encoder with  $m = 2$

The diagram opposite illustrates this fact for the parameters 

$$k = 4, \ n = 7, \ m = 2,\ i = 4.$$

The  $n = 7$  code bits  $x_4^{(1)}$, ... , $x_4^{(7)}$  generated at time  $i = 4$  may depend  $($directly$)$  on the  $k \cdot (m+1) = 12$  information bits marked in red and are generated by modulo-2 additions.

Drawn in yellow is a  $(n, k)$  convolutional encoder.  Note that the vector  $\underline{u}_i$  and the sequence  $\underline{u}^{(i)}$  are fundamentally different:

  • While  $\underline{u}_i = (u_i^{(1)}, u_i^{(2)}$, ... , $u_i^{(k)})$  summarizes  $k$  parallel information bits at time  $i$,
  • $\underline{u}^i = (u_1^{(i)}$, $u_2^{(i)}, \ \text{...})$  denotes the  $($horizontal$)$  sequence at  $i$–th input of the convolutional encoder.


$\text{Some definitions related to convolutional codes:}$ 

  • The   »code rate«   results as for the block codes to  $R = k/n$.
  • Perceive   $m$  as the  »memory«  of the code and the  "convolutional code"  itself with  ${\rm CC} \ (n, k, m)$.
  • This gives the  »constraint length«  $\nu = m + 1$  of the convolutional code.
  • For  $k > 1$  one often gives these parameters also in bits:   $m_{\rm bit} = m \cdot k$    resp.    $\nu_{\rm bit} = (m + 1) \cdot k$.

Similarities and differences compared to block codes


From the  $\text{definition}$  in the previous section,  it is evident that a binary convolutional code with  $m = 0$  $($i.e., without memory$)$  would be identical to a binary block code as described in the first main chapter.  We exclude this limiting case and therefore assume always for the following:

  • The memory  $m$  be greater than or equal to  $1$.
  • The influence length  $\nu$  be greater than or equal to  $2$.

$\text{Example 1:}$  For a  $(7, 4)$  block code,  the code word  $\underline {x}_4$  depends only on the information word  $\underline{u}_4$  but not on  $\underline{u}_2$  and  $\underline{u}_3$, as in the  $\text{example convolutional codes}$  $($with  $m = 2)$  in the last section.

Dependencies on a  $(7, 4)$  block code at time  $i = 4$

For example, if

$$x_4^{(1)} = u_4^{(1)}, \ x_4^{(2)} = u_4^{(2)},$$
$$x_4^{(3)} = u_4^{(3)}, \ x_4^{(4)} = u_4^{(4)}$$

as well as

$$x_4^{(5)} = u_4^{(1)}+ u_4^{(2)}+u_4^{(3)}\hspace{0.05cm},$$
$$x_4^{(6)} = u_4^{(2)}+ u_4^{(3)}+u_4^{(4)}\hspace{0.05cm},$$
$$x_4^{(7)} = u_4^{(1)}+ u_4^{(2)}+u_4^{(4)}\hspace{0.05cm},$$

applies then it is a so-called  $\text{systematic Hamming code}$  $\text{HS (7, 4, 3)}$.  In the graph,  these special dependencies for  $x_4^{(1)}$  and  $x_4^{(7)}$  are drawn in red.


In a sense,  one could also interpret a  $(n, k)$  convolutional code with memory  $m ≥ 1$  as a block code whose code parameters  $n\hspace{0.05cm}' \gg n$  and  $k\hspace{0.05cm}' \gg k$  would have to assume much larger values than those of the present convolutional code. 

However,  because of the large differences in description,  properties,  and especially decoding,  we consider convolutional codes to be something completely new in this learning tutorial.  The reasons for this are as follows:

  1.   A block encoder converts block-by-block information words of length  $k$  bits into code words of length  $n$  bits each.  In this case,  the larger its code word length  $n$,  the more powerful the block code is.  For a given code rate  $R = k/n$  this also requires a large information word length  $k$.
  2.   In contrast,  the correction capability of a convolutional code is essentially determined by its memory  $m$.  The code parameters  $k$  and  $n$  are mostly chosen very small here  $(1, \ 2, \ 3, \ \text{...})$.  Thus,  only very few and,  moreover,  very simple convolutional codes are of practical importance.
  3.   Even with small values for  $k$  and  $n$,  a convolutional encoder transfers a whole sequence of information bits  $(k\hspace{0.05cm}' → ∞)$  into a very long sequence of code bits  $(n\hspace{0.05cm}' = k\hspace{0.05cm}'/R)$.  Such a code thus often provides a large correction capability as well.
  4.   There are efficient convolutional decoders,  for example the  $\text{Viterbi algorithm}$  and the  $\text{BCJR algorithm}$,  which can process reliability information about the channel   ⇒   "soft decision input"  and provide reliability information about the decoding result   ⇒   "soft decision output".
  5.   Please note:  The terms  "convolutional code"  and  "convolutional encoder"  should not be confused:
  • The  "convolutional code"  ${\rm CC} \ (n, \ k, \ m)$   ⇒   $R = k/n$  is understood as  "the set of all possible encoded sequences  $\underline{x}$  $($at the output$)$  that can be generated with this code considering all possible information sequences  $\underline{u}$  $($at the input$)$".
  • There are several  "convolutional encoders"  that realize the same  "convolutional code".

Rate 1/2 convolutional encoder


Convolutional encoder  $(n = 2, \hspace{0.05cm} k = 1)$  for one bit  $u_i$  $($upper graphic$)$  and for the information sequence  $\underline{u}$  $($lower graphic$)$

The upper graph shows a  $(n = 2, \hspace{0.05cm} k = 1)$  convolutional encoder. 

  • At clock time  $i$  the information bit  $u_i$  is present at the encoder input and the  $2$–bit code block  $\underline{x}_i = (x_i^{(1)}, \ x_i^{(2)})$  is output. 
  • To generate two code bits  $x_i^{(1)}$  and  $x_i^{(2)}$  from a single information bit,  the convolutional encoder must include at least one memory element:
$$k = 1\hspace{0.05cm}, \ n = 2 \hspace{0.3cm}\Rightarrow \hspace{0.3cm} m \ge 1 \hspace{0.05cm}.$$
  • Taking into account the  $($half–infinite$)$  long information sequence  $\underline{u}$  the model results according to the lower graph.


$\text{Example 2:}$  The graphic shows a convolutional encoder for the parameters  $k = 1, \ n = 2$  and  $m = 1$. 

Convolutional encoder with  $k = 1, \ n = 2, \ m = 1$  and example sequences;   the square with label  $D$  $($"delay"$)$  indicates a memory element.
  • This is a  "systematic"  convolutional encoder,  characterized by 
$$x_i^{(1)} = u_i.$$
  • The second output returns  $x_i^{(2)} = u_i + u_{i-1}$.


  • In the example output sequence  $\underline{x}$  after multiplexing
  • all  $x_i^{(1)}$  are labeled red,
  • all  $x_i^{(2)}$  are labeled blue.


$\text{Example 3:}$  The graphic shows a  $(n = 2, \ k = 1)$  convolutional encoder with  $m = 2$  memory elements:

  • On the left is shown the equivalent circuit.
  • On the right you see a realization form of this encoder.
  • The two information bits are:
Convolutional encoder  $(k = 1, \ n = 2, \ m = 2)$  in two different representations
\[x_i^{(1)} = u_{i} + u_{i-1}+ u_{i-2} \hspace{0.05cm},\]
\[x_i^{(2)} = u_{i} + u_{i-2} \hspace{0.05cm}.\]
  • Because  $x_i^{(1)} ≠ u_i$  this is not a systematic code.


It can be seen:

  1. The input sequence  $\underline{u}$  is stored in a shift register of length  $L = m + 1 = 3$ .
  2. At clock time  $i$  the left memory element contains the current information bit  $u_i$,  which is shifted one place to the right at each of the next clock times.
  3. The number of yellow squares gives the memory  $m = 2$  of the encoder.

⇒   From these plots it is clear that  $x_i^{(1)}$  and  $x_i^{(2)}$  can each be interpreted as the output of a  $\text{digital filter}$  over the Galois field  ${\rm GF(2)}$  where both filters operate in parallel with the same input sequence  $\underline{u}$ .

⇒   Since  $($in general terms$)$,  the output signal of a filter results from the  $\text{convolution}$  of the input signal with the filter impulse response,  this is referred to as  "convolutional coding".

Convolutional encoder with two inputs


Convolutional encoder with  $k = 2$  and  $n = 3$

Now consider a convolutional encoder that generates  $n = 3$  code bits from  $k = 2$  information bits.

  • The information sequence  $\underline{u}$  is divided into blocks of two bits each.
  • At the clock time  $i$:   The bit  $u_i^{(1)}$  is present at the upper input and  $u_i^{(2)}$ at the lower input.
  • Then holds for the  $n = 3$  code bits at time  $i$:
\[x_i^{(1)} = u_{i}^{(1)} + u_{i-1}^{(1)}+ u_{i-1}^{(2)} \hspace{0.05cm},\]
\[x_i^{(2)} = u_{i}^{(2)} + u_{i-1}^{(1)} \hspace{0.05cm},\]
\[x_i^{(3)} = u_{i}^{(1)} + u_{i}^{(2)}+ u_{i-1}^{(1)} \hspace{0.05cm}.\]

In the graph,  the info–bits  $u_i^{(1)}$  and  $u_i^{(2)}$  are marked red resp. blue,  and the previous info–bits  $u_{i-1}^{(1)}$  resp.  $u_{i-1}^{(2)}$  are marked green and brown, respectively

To be noted:

  1.   The  "memory"  $m$  is equal to the maximum memory cell count in a branch   ⇒   here  $m = 1$.
  2.   The  "influence length"  $\nu$  is equal to the sum of all memory elements   ⇒   here  $\nu = 2$.
  3.  All memory elements are set to zero at the beginning of the coding  $($"initialization"$)$.
  4.  The code defined herewith is the set of all possible encoded sequences  $\underline{x}$,  which result when all possible information sequences  $\underline{u}$  are entered.
  5.  Both  $\underline{u}$  and  $\underline{x}$  are thereby (temporally) unbounded.


$\text{Example 4:}$  Let the information sequence be  $\underline{u} = (0, 1, 1, 0, 0, 0, 1, 1, \ \text{ ...})$.  This gives the subsequences 

  • $\underline{u}^{(1)} = (0, 1, 0, 1, \ \text{ ...})$,
  • $\underline{u}^{(2)} = (1, 0, 0, 1, \ \text{ ...})$.


With the specification  $u_0^{(1)} = u_0^{(2)} = 0$  it follows from the above equations for the  $n = 3$  code bits.

  • at the first coding step  $(i = 1)$:
\[x_1^{(1)} = u_{1}^{(1)} = 0 \hspace{0.05cm},\hspace{0.4cm} x_1^{(2)} = u_{1}^{(2)} = 1 \hspace{0.05cm},\hspace{0.4cm} x_1^{(3)} = u_{1}^{(1)} + u_{1}^{(2)} = 0+1 = 1 \hspace{0.05cm},\]
  • at the second coding step  $(i = 2)$:
\[x_2^{(1)} =u_{2}^{(1)} + u_{1}^{(1)}+ u_{1}^{(2)} = 1 + 0 + 1 = 0\hspace{0.05cm},\hspace{0.4cm} x_2^{(2)} = u_{2}^{(2)} + u_{1}^{(1)} = 0+0 = 0\hspace{0.05cm},\hspace{0.4cm} x_2^{(3)} = u_{2}^{(1)} + u_{2}^{(2)}+ u_{1}^{(1)} = 1 + 0+0 =1\hspace{0.05cm},\]
  • at the third coding step  $(i = 3)$:
\[x_3^{(1)} =u_{3}^{(1)} + u_{2}^{(1)}+ u_{2}^{(2)} = 0+1+0 = 1\hspace{0.05cm},\hspace{0.4cm} x_3^{(2)} = u_{3}^{(2)} + u_{2}^{(1)} = 0+1=1\hspace{0.05cm},\hspace{0.4cm} x_3^{(3)} =u_{3}^{(1)} + u_{3}^{(2)}+ u_{2}^{(1)} = 0+0+1 =1\hspace{0.05cm},\]
  • and finally at the fourth coding step  $(i = 4)$:
\[x_4^{(1)} = u_{4}^{(1)} + u_{3}^{(1)}+ u_{3}^{(2)} = 1+0+0 = 1\hspace{0.05cm},\hspace{0.4cm} x_4^{(2)} = u_{4}^{(2)} + u_{3}^{(1)} = 1+0=1\hspace{0.05cm},\hspace{0.4cm} x_4^{(3)}= u_{4}^{(1)} + u_{4}^{(2)}+ u_{3}^{(1)} = 1+1+0 =0\hspace{0.05cm}.\]

Thus the encoded sequence is after the multiplexer:     $\underline{x} = (0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, \ \text{...})$.


Exercises for the chapter


Exercise 3.1: Analysis of a Convolutional Encoder

Exercise 3.1Z: Convolution Codes of Rate 1/2

References

  1. Elias, P.:  Coding for Noisy Channels.  In:  IRE Conv. Rec. Part 4, pp. 37-47, 1955.