A Convolutional Encoder and Viterbi Decoder in Python/C++.
Project description
Convolutional Encoder and Viterbi Decoder
Author: Min Xu <xukmin@gmail.com>
This program implements both a Convolutional Encoder and a Viterbi Decoder in C++.
Running ViterbiCodec
Compile:
make
Run:
./viterbi_main <constraint> <polynomial>... <bits>
Example use:
Decoding:
./viterbi_main 3 7 5 0011100001100111111000101100111011
010111001010001
Encoding:
$ ./viterbi_main 3 7 5 --encode 010111001010001
0011100001100111111000101100111011
Please note there are (constraint - 1)
"0" bits padded in front of the original message.
More Features
-
It supports reading input from stdin or from commandline arguments. When reading from stdin, it ignores blank lines or comment lines (which start with
#
). -
It supports any number of generator polynomials.
-
It can perform convolutional encoding by providing
--encode
commandline flag. -
It supports a different notation of generator polynomials by providing
--reverse_polynomials
commandline flag.
Here are more options to run the program.
Show help message:
./viterbi_main --help
Read input from stdin:
./viterbi_main [--reverse_polynomials] [--encode]
Input format is:
<constraint> <polynomial>... <bits>
Read input from commandline arguments:
./viterbi_main [--reverse_polynomials] [--encode] <constraint> <polynomial>... <bits>
Flags:
--reverse_polynomials
Reverse polynomials. E.g. 6 (=0b110) becomes 3 (=0b011).
--encode
Do encoding instead of decoding.
Example usage:
./viterbi_main 3 7 5 0011100001100111111000101100111011
./viterbi_main 3 6 5 111011011100101011
./viterbi_main 7 91 121 1010110100001101001000011101
./viterbi_main 7 91 117 121 111100101110001011110101111111001011100111
./viterbi_main --reverse_polynomials 3 3 5 111011011100101011
./viterbi_main --encode 3 7 5 010111001010001
./viterbi_main --encode 3 6 5 1001101
./viterbi_main --encode --reverse_polynomials 3 3 5 1001101
Error Handling
All inputs are validated, and proper error messages will be output.
- The
constraint
should be greater than0
. - A generator polynomial should be greater than
0
and less than1 << constraint
. - The received bit sequence should be consisted with only
0
and1
. - The received bit sequence should be of length
N * <num-of-polynomials>
whereN
is an integer. Otherwise some bits must be missing during transmission. We will fill in appropriate number of trailing zeros.
Running Unit Test
Run unit test:
make test
Or
make viterbi_test && ./viterbi_test
If the test passes, it will output PASSED
and the end of the output;
otherwise, the test program aborts with assertion error.
There are a few sample cases in the unit test, some are with manually injected bit errors.
It also generates random messages of length 8
, 16
and 32
for several different
convolutional codes and test if they can be properly encoded and decoded.
Dependencies
The code is self-contained, meaning it depends on nothing but the C++ standard library. The purpose is to make it easy to be integrated in any project.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for viterbi-0.0.2-cp311-cp311-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 124469a88a53d92176ded27a8363eaa11597ebd48146eb977e063a514aa3965b |
|
MD5 | beeba97b6b67a599dfbed7e4ed96b0d9 |
|
BLAKE2b-256 | 704c85e5aad1aebacfc9a6d04c1a75b44d35d14c2be36a2fe165a225514ade64 |
Hashes for viterbi-0.0.2-cp311-cp311-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ef5d4669a23c3b7bf3fa300233733f659186d75e76e24628dc9692c43ce7013d |
|
MD5 | ac0a70ca75076f897413d1f5857f963f |
|
BLAKE2b-256 | 7efbb59b85df944013ed7dcdb993c903a27bf0b7859554d158f4aa34316d9276 |
Hashes for viterbi-0.0.2-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 36673e24956323b4de399bc84dd28a369320344aa6b2982d675db29ef4631913 |
|
MD5 | bfb8265a2951cca69db72d6993a2a9a5 |
|
BLAKE2b-256 | f83abe91483d16a8f899fffe599ca307d7228ce3e317183f0d51d37c1699ce39 |
Hashes for viterbi-0.0.2-cp311-cp311-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | eaceb1242507461dc66cf3bc26d984f1df4ac0209c01dea014763354092cab3c |
|
MD5 | cc16527398c2caa560d2ab1731f41a3a |
|
BLAKE2b-256 | 29d8d9e059883b85d2d47aeaa944d00a27ed1e6cae2e34647f43e9bf682db5ad |
Hashes for viterbi-0.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5829e54b824cb2382ea8be807aba093907d2d155ec0342a2ed8629ad72ec5b90 |
|
MD5 | a6601eec17f43f1b08e6650ff464d805 |
|
BLAKE2b-256 | 45f4860d33130169b9dd3b9214d936493663d57447ccc10f77106b718af4db73 |
Hashes for viterbi-0.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 67f15812efb494bcb76f8d859eb657ef5a8651d5f084ccc5def07eedded1e7d6 |
|
MD5 | c2497ad997bcad82832576862d958945 |
|
BLAKE2b-256 | 480f3d42e2592cbfcf6564e7ff21cede29f274e7df6ea540cee4b1d1cb99bffa |
Hashes for viterbi-0.0.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9b188b0764d0bfb33ea0407de9af25f78031957951049022803d96f59b57073d |
|
MD5 | d00356c25a913951936080d670374cb2 |
|
BLAKE2b-256 | fadc86cb9d6e2eaea1d0be55c712e317df627e84d79baa0f5755afbf0b6fe9de |
Hashes for viterbi-0.0.2-cp310-cp310-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8f18c2866c6033fa441cd24b5e461db1099e2a1b297a5f2add0bd39d65c8b0db |
|
MD5 | eb05d9014f3ae385eb45cfd4096ab4f8 |
|
BLAKE2b-256 | 9e36a3a33a8757b9b20189f776de8a394b2af34a3e915e57eec0d9a01cd25e8e |
Hashes for viterbi-0.0.2-cp310-cp310-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 89a1534d5a3384c734517d2e1662577649c354ea6255eaf41c0ee6d29adfef3d |
|
MD5 | 23f2711ee65b0778876c813846233173 |
|
BLAKE2b-256 | 56bd0a08b693abbd50d8721ddcffd8b7070d91c55177b618d8f258794b87f9b5 |
Hashes for viterbi-0.0.2-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9ef7d9d2ee6984f7b73d758039930d8962c37114119aeaa32f8f10ff02352124 |
|
MD5 | 4d91ec1355aa324bb54495b9e58fe0b4 |
|
BLAKE2b-256 | 31575f021592604f9414835c6993a646ee64153ad5fb727e8730fd70d108e5d3 |
Hashes for viterbi-0.0.2-cp310-cp310-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 45b6b91a6b15c58d10c7ffcd4267424a6b28be7413a0ddd9037aa8c9e1a4ca32 |
|
MD5 | cbe52e94e66b9573f3d45b579e2b4aa7 |
|
BLAKE2b-256 | 814149b1f9b7366784dc12792c84ae8dd1641f006e19371cdb3f53c6ebce58e7 |
Hashes for viterbi-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ca2cf2968fb7418ac160ab4ce3210a9903b47a65d6527fcdb7c481a23b399070 |
|
MD5 | 3ec094a8aba9af218f1800b55580d093 |
|
BLAKE2b-256 | 1a200cb7c0a5184b1144737669cc8518975fb25d27344c191717888f0fe39393 |
Hashes for viterbi-0.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bf61d683803098637e3b6e4ae9b90e3f19d74700f737ac7fe2c7acb593f1354b |
|
MD5 | e1ba8285d22a2b40855973fa61655da1 |
|
BLAKE2b-256 | 31c23ed3a45e6d0cf8f2ecccb71cab4978e1a56ca5c2367e972c620d5ec6e442 |
Hashes for viterbi-0.0.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9ac71448bc0d6d0277aab3e84209d012879849908f6cb05ea4eb72bfd54db0d9 |
|
MD5 | 8cc551242c93953665a427e34a6216e2 |
|
BLAKE2b-256 | 391e7501ebde47161f8eea4f79e73ac565794d62f804c612d25a8ddbbe1d8f46 |
Hashes for viterbi-0.0.2-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c962b245978e240b87c0e5ea725a0fae981a004b90ee7851ec359192b9185268 |
|
MD5 | 4186a55e5a0034262bc0b9257bf188a7 |
|
BLAKE2b-256 | 34e69f69f5520b1af9bd31f1682f85266c8cc87d5bf3e9308aed8a3a869e0470 |
Hashes for viterbi-0.0.2-cp39-cp39-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0930471f704bf5f30f26ae0ed54e4a767caca97007a4c8aefb56c1aeadbef5ab |
|
MD5 | c5d11cde445cc70ea56f766837bd4a73 |
|
BLAKE2b-256 | 9b9365b39d0e594e00d4b1c16a0aa7de8fd477733171ce75eaae6c9f5a01fed9 |
Hashes for viterbi-0.0.2-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9892b9b7412b3b9d9b897bd4b3cf76a3f4c17d595f732e0c3a5af9c83d4202aa |
|
MD5 | e8c12fe90801708665e1d1ecb83bd70d |
|
BLAKE2b-256 | e201e7b879ab7d0fff0b2e80a4f5758117589d3fa8dac6de8ac6d3500fa89710 |
Hashes for viterbi-0.0.2-cp39-cp39-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f5147f189bd70e3481c081737ee28824be54f08fbe9731e19315beea3473bc28 |
|
MD5 | efdd73462ea9344f126d97a9f2f2131c |
|
BLAKE2b-256 | 57eb416d8298bece6b0e081f25c9437365833b5ee54ce4cf0c5f227d0d65abeb |
Hashes for viterbi-0.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 30856738b187b05b2ac8554ccd1e5b783ba3815273a3b4fd3149c67d1fd6cc0a |
|
MD5 | 369752d853a11499d2efa0be95370603 |
|
BLAKE2b-256 | c4022a366d25b6ab84ac39c5d204d66d9c44d48db013e657cf03c1e65ac728ee |
Hashes for viterbi-0.0.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | aaafb56e336330b8f1ae227c4b7a3ba848f3948e4e1f2e0d36f85f53f06f16e2 |
|
MD5 | ae0537bb2dd4452570fdb20eaee41f73 |
|
BLAKE2b-256 | 9d43715ec4df281dbb5f596a2c2d4934b2bdd2216aeecea56947225a05725eac |
Hashes for viterbi-0.0.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4d4ae5b4cc466ee5f996bd5cd8edd83ff4ce0775bf1b98505a7498af7d7bbb32 |
|
MD5 | 86c1834333895f8f74c8da46f1c767ea |
|
BLAKE2b-256 | ba38169c337d30f1bb4ba98a16360c872c2a1a042ffe9be6841ed95b93ec9b20 |
Hashes for viterbi-0.0.2-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0af49ebcb99ac1afe293ab24667756b8e1323bc89cf9b846a5baa227a7658176 |
|
MD5 | ad439f7e19307bab1558e3fe63ecd9bf |
|
BLAKE2b-256 | 5894135d8f797cae14dfd3c44face6314f9fae4c7450f8ee54edcb283d395e94 |
Hashes for viterbi-0.0.2-cp38-cp38-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6a7f61427080dee626e1240912fd9e112b1c5ea828d632a65c393a48ac3ab5f6 |
|
MD5 | 2c6428ddfec54b50aec0f3070d567914 |
|
BLAKE2b-256 | 33a3c0da7124d8d7356fd553ab4f340eebdd48b0878a11d75a015c7b19bfa5c8 |
Hashes for viterbi-0.0.2-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3e773270fe976cab7fcfac245d77ee55e488466bd3f1f31a639a2f6f216b1146 |
|
MD5 | ad8d0158a7c9b30c036e97374d33b3df |
|
BLAKE2b-256 | 3591eadb19e71c1d88aa21f60a82fd0bc386203bd0176d268efc8a08c5144b9f |
Hashes for viterbi-0.0.2-cp38-cp38-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 37c1124e6cfe050ee51298ae913685995ee630279e23cafc00bc835928c1beda |
|
MD5 | 85f0ce2a7fe16bd0a846f792cf89f56c |
|
BLAKE2b-256 | 348da227d06f8ec4d8bb14701d94c94f26a268811a4f71fcdbc387223ffef6f5 |
Hashes for viterbi-0.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9f83c69507d21aed5a353c7bc2496b04df9f175203a01d787dec7699294cd903 |
|
MD5 | 58fa93be10fb8881ff244e8a3afabc61 |
|
BLAKE2b-256 | bba7c7586935184e07cf3ec35d6a5d9270d460fdfcc483f965dd3e2e6ade599c |
Hashes for viterbi-0.0.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 646fcd57430a7867773901019b87d6bb216df70112c276e145ff84118708412f |
|
MD5 | aa47821ecf6245ba3f03661252cb385d |
|
BLAKE2b-256 | da0259dff252d2d21e771aa448270490b8f6db4a5006f52e3030159cb66f6545 |
Hashes for viterbi-0.0.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1af3389772cba8947063e8d06a90db24de51d65b0a57989d30977521873755f6 |
|
MD5 | 894b0cd0b203269d26abb79db67b3b32 |
|
BLAKE2b-256 | 5e237b2584e79c178af2b3d6d2c0967a730afed91227d7eed092e8ff0bb942d8 |
Hashes for viterbi-0.0.2-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fc0798b6845918dca5fbee87d15f8ad8145da8e5cf30f51c80cc7f0d506e9e50 |
|
MD5 | 4542758af7dfb11f8c77fa2d535a196c |
|
BLAKE2b-256 | 8835c6911fa3c911d6de77fb34b459695f6832a0ca3b6ff62cb9c36cd41f6064 |
Hashes for viterbi-0.0.2-cp37-cp37m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8db3d31aba03bdb3eb95c32f95b59ccd95663b6aa677613c15c986a635676db5 |
|
MD5 | 88aafea9cb166cb7592bdcc9baa0952e |
|
BLAKE2b-256 | 3cff54166bafa79f9eabd9cafcc9a00319a6a25e079d36408b20022e7bbb89da |
Hashes for viterbi-0.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ffb193f725a6756e69e1a0acc1860467bef55b0837774fe725387ec45b90ce4f |
|
MD5 | 7dcfb4a89ba23121e0950f8b0e21455d |
|
BLAKE2b-256 | ca8f14e1f241173aa16a3f323a405b0299ef3171e2cd16438fcd9f300f4cac48 |
Hashes for viterbi-0.0.2-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e8fc6b3d0bb17c73455e61dcee8012f56d08f1fdb062a4b2391964310aa9b71e |
|
MD5 | 3a737e30ecdf5037b264637be2d5a5ad |
|
BLAKE2b-256 | d4dab22fc3a6f8481b4ea13ace475366efbd9a77f5da65141cf7e9de2714e5a0 |
Hashes for viterbi-0.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ffdf7f008e85e8422a41c912b8d0676b486515a3bcb23fd8afcf0a997d1dc05a |
|
MD5 | b558a4ab2ab92c69c557b9a8cac0eddb |
|
BLAKE2b-256 | 5e877f88498f4f5566c71d7785eb8b21b1741324e130698d537dc76837aecfc6 |
Hashes for viterbi-0.0.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 098d28cd1f3021f4b71117b486e46e2ececf552e3742daed806b57a4fe816faa |
|
MD5 | 7a8afba3ac5ccaf567a0400db5310089 |
|
BLAKE2b-256 | 9448eea59fbf6e04bd83e880ff47242923bedd7198c5a60ef51ece0d866ccf98 |
Hashes for viterbi-0.0.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c8f547c7b98b19a739dd513b4ce16b4877a14ea106b90169ad10b8744756b77 |
|
MD5 | 72812cba829b9bb0e344d583b7f58958 |
|
BLAKE2b-256 | 60a927dd1dba2b5d44df6ab3b0ab192282252edede4648adafb6d2c3b9e510ad |