Viterbi Decoder
Viterbi Decoder
Coding is a technique where redundancy is added to original bit sequence to increase the reliability of
the communication. Lets discuss a simple binary convolutional coding scheme at the transmitter and the
associated Viterbi (maximum likelihood) decoding scheme at the receiver.
Update: For some reason, the blog is unable to display the article which discuss both Convolutional
coding and Viterbi decoding. As a work around, the article was broken upto into two posts.
This post descrbes the Viterbi decoding algorithm for a simple Binary Convolutional Code with rate 1/2,
constraint length and having generator polynomial . For more details on the Binary
convolutional code, please refer to the post Convolutional code
Viterbi algorithm
As explained in Chapter 5.1.4 of Digital Communications by John Proakis for optimal decoding
for a modulation scheme with memory (as is the case here), if there are coded bits, we need
to search from possible combinations. This becomes prohibitively complex as becomes
large. However, Mr. Andrew J Viterbi in his landmark paper Error bounds for convolutional
codes and an asymptotically optimum decoding algorithm, IEEE Transactions on Information
Theory 13(2):260269, April 1967 described a scheme for reducing the complexity to more
managable levels. Some of the key assumptions are as follows:
(a) As shown in Table 1 and Figure 2 (in the article Convoutional Code) any state can be
reached from only 2 possible previous state.
(b) Though we reach each state from 2 possible states, only one of the transition in valid. We can
find the transition which is more likely (based on the received coded bits) and ignore the other
transition.
(c) The errors in the received coded sequence are randomly distributed and the probability of
error is small.
Based on the above assumptions, the decoding scheme proceed as follows: Assume that there are
coded bits. Take two coded bits at a time for processing and compute Hamming distance,
Branch Metric, Path Metric and Survivor Path index for times. Let be the index
varying from 1 till .
Hamming Distance Computation
For decoding, consider two received coded bits at a time and compute the Hamming distance
between all possible combinations of two bits. The number of differing bits can be computed by
XOR-ing with 00, 01, 10, 11 and then counting the number of ones.
is the number of 1s in
is the number of 1s in
is the number of 1s in
is the number of 1s in
As stated prior, each state can be reached from two possible states (shown by red and blue lines
respectively). Branch metric is the sum of the path metric of the previous state and the hamming
distance required for the transition. From the two avaiable branch metrices, the one with
minimum branch metric value is chosen. This operation is also referred to as Add Compare and
Select (ACS) unit.
Note:
1. Typically, Convolutional coder always starts from State 00. The Viterbi decoder also assumes
the same.
2. For index = 1, branch metric for State 00 (from State 00) branch and State 10 (from State 00)
can only be computed. In this case, path metric for each state is equal to branch metric as the
other branch is not valid.
3. For index = 2, branch metric for State 00 (from State 00) branch, State 01 (from State 10),
State 10 (from State 00) and State 11 (from State 10) can only be computed. In this case too, path
metric for each state is equal to branch metric as the other branch is not valid.
4. Starting from index =3, each state has two branches and the need to do Add Compare and
Select arises.
5. Its possible that two branch metrices might have the same value. In that scenario, we can
chose one among the the branches and proceed.
Branch Metric and Path Metric computation for Viterbi decoder
Figure: Branch Metric and Path Metric computation for Viterbi decoder
(a) State 00 with output 00. The branch metric for this transition is,
(b) State 01 with output 11. The branch metric for this transition is,
The path metric for state 00 is chosen based which is minimum out of the two.
(c) State 10 with output 10. The branch metric for this transition is,
(d) State 11 with output 01. The branch metric for this transition is,
The path metric for state 01 is chosen based which is minimum out of the two.
(e) State 00 with output 11. The branch metric for this transition is,
(f) State 01 with output 00. The branch metric for this transition is,
The path metric for state 10 is chosen based which is minimum out of the two.
(g) State 10 with output 01. The branch metric for this transition is,
(h) State 11 with output 10. The branch metric for this transition is,
The path metric for state 11 is chosen based which is minimum out of the two.
The survivor path for state 11 is stored in survivor path metric.
Traceback Unit
Once the survivor path is computed times, the decoding algorithm can start trying to
estimate the input sequence. Thanks to presence of tail bits (additional zeros) , it is known
that the final state following Convolutional code is State 00.
So, start from the last computed survivor path at index for State 00. From the survivor
path, find the previous state corresponding to the current state. From the knowledge of current
state and previous state, the input sequence can be determined (Ref: Table 2 Input given
current state and previous state). Continue tracking back through the survivor path and
estimate the input sequence till index = 1.
ip, if
previous
state
current state 00 01 10 11
00 0 0 x x
01 x x 0 0
10 1 1 x x
11 x x 1 1
Simulation Model
Octave/Matlab source code for computing the bit error rate for BPSK modulation in AWGN
using the convolutional coding and Viterbi decoding is provided. Refer to the post on Bit Error
Rate (BER) for BPSK modulation for signal and channel model.
Note: Since 2 coded bits are required for transmission of each data bit, the relation between
(b) Convolutionally encode them using rate -1/2, generator polynomial [7,5] octal code
(f) Counting the number of errors from the output of Viterbi decoder
System Model
, where
is the modulated coded sequence taking values if the coded bit is 1 and if the
coded bit is 0,
is the Additive White Gaussian Noise following the probability distribution function,
Euclidean distance
In the hard decision Viterbi decoding, based on the location of the received coded symbol, the
coded bit was estimated if the received symbol is greater than zero, the received coded bit is 1;
if the received symbol is less than or equal to zero, the received coded bit is 0.
In Soft decision decoding, rather than estimating the coded bit and finding the Hamming
distance, the distance between the received symbol and the probable transmitted symbol is found
out.
As the terms , , and are common in both the equations they can be ignored. The
simplified Euclidean distance is,
and
As the Viterbi algorithm takes two received coded bits at a time for processing, we need to find
the Euclidean distance from both the bits.
Summarizing, in Soft decision decoding, Euclidean distance is used instead of Hamming
distance for branch metric and path metric computation.
Note:
For details on branch metric, path metric computation and trace back unit refer to the post on
hard decision Viterbi decoding.
Simulation Model
Octave/Matlab source code for computing the bit error rate for BPSK modulation in AWGN
using the convolutional coding and soft decision Viterbi decoding is provided.
(b) Convolutionally encode them using rate -1/2, generator polynomial [7,5] octal code
(d) Received soft bits and hard bits are passed to Viterbi decoder
(e) Counting the number of errors from the output of Viterbi decoder