This project is a fork of https://github.com/xukmin/viterbi that introduces Python support, enabling effortless utilization of the Viterbi module within the Python environment.
pip install viterbi
The following is a convolutional encoder with a constraint length of 7. The diagram indicates the binary values and polynomial form, indicating the left-most bit is the most-significant-bit (MSB). The generating polynomials are 1011011 and 1111001 can be alternatively expressed in octal as 133 and 171, respectively.
Expressed in code as:
from viterbi import Viterbi
dot11a_codec = Viterbi(7, [0o133, 0o171])
You can use the viterbi decoder like this:
from viterbi import Viterbi
dot11a_codec = Viterbi(7, [0o133, 0o171])
bits = [0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0]
output = dot11a_codec.encode(bits)
# [0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]
dot11a_codec.decode(output)
# [0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0]
This library also allows you to puncture the original encoded data by specifying a puncture pattern or decode data that has already been punctured.
from viterbi import Viterbi
# Puncture Pattern: [1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1]
dot11a_codec = Viterbi(7, [0o133, 0o171], [1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1])
You can find the way to use the Viterbi decoder in C++ in the README of the original project.