11# Authors: CommPy contributors
22# License: BSD 3-Clause
33
4+ from commpy .channelcoding .convcode import Trellis , conv_encode , viterbi_decode
45from numpy import array , inf
56from numpy .random import randint , randn
67from numpy .testing import assert_array_equal , dec , assert_array_less
78
8- from commpy .channelcoding .convcode import Trellis , conv_encode , viterbi_decode
9-
109
1110class TestConvCode (object ):
1211
@@ -15,6 +14,8 @@ def setup_class(cls):
1514 cls .trellis = []
1615 cls .desired_next_state_table = []
1716 cls .desired_output_table = []
17+ cls .desired_encode_msg = []
18+ cls .mes = array ((0 , 0 , 1 , 0 ))
1819
1920 ### 1/2 - rate codes ###
2021
@@ -30,6 +31,7 @@ def setup_class(cls):
3031 [3 , 0 ],
3132 [1 , 2 ],
3233 [2 , 1 ]]))
34+ cls .desired_encode_msg .append (array ([0. , 0. , 0. , 0. , 1. , 1. , 0. , 1. ]))
3335
3436 # Convolutional Code 2: G(D) = [1 1+D+D^2/1+D]
3537 memory = array ([2 ])
@@ -44,6 +46,7 @@ def setup_class(cls):
4446 [0 , 3 ],
4547 [1 , 2 ],
4648 [1 , 2 ]]))
49+ cls .desired_encode_msg .append (array ([0. , 0. , 0. , 0. , 1. , 1. , 0. , 1. ]))
4750
4851 ### 2/3 - rate codes ###
4952
@@ -67,6 +70,7 @@ def setup_class(cls):
6770 [1 , 0 , 7 , 6 ],
6871 [4 , 5 , 2 , 3 ],
6972 [7 , 6 , 1 , 0 ]]))
73+ cls .desired_encode_msg .append (array ([0. , 0. , 0. , 1. , 1. , 0. ]))
7074
7175 # Convolutional Code 2: G(D) = [[1, 0, 0], [0, 1, 1+D]]; F(D) = [[D, D], [1+D, 1]]
7276 memory = array ([1 , 1 ])
@@ -81,6 +85,7 @@ def setup_class(cls):
8185 [1 , 2 , 5 , 6 ],
8286 [0 , 3 , 4 , 7 ],
8387 [1 , 2 , 5 , 6 ]]))
88+ cls .desired_encode_msg .append (array ([0. , 0. , 0. , 1. , 0. , 0. ]))
8489
8590 @classmethod
8691 def teardown_class (cls ):
@@ -95,7 +100,8 @@ def test_output_table(self):
95100 assert_array_equal (self .trellis [i ].output_table , self .desired_output_table [i ])
96101
97102 def test_conv_encode (self ):
98- pass
103+ for i in range (len (self .trellis )):
104+ assert_array_equal (conv_encode (self .mes , self .trellis [i ],'cont' ), self .desired_encode_msg [i ])
99105
100106 def test_viterbi_decode (self ):
101107 pass
@@ -132,3 +138,10 @@ def test_conv_encode_viterbi_decode(self):
132138 coded_syms = (2.0 * coded_bits - 1 ) * inf
133139 decoded_bits = viterbi_decode (coded_syms , self .trellis [i ], 15 , 'soft' )
134140 assert_array_less ((decoded_bits [:len (msg )] - msg ).sum (), 0.03 * blocklength )
141+
142+ coded = conv_encode (msg , self .trellis [i ], termination = 'cont' )
143+ coded_bits = coded .astype (float )
144+ coded_bits [coded_bits == 1.0 ] = inf
145+ coded_bits [coded_bits == 0.0 ] = - inf
146+ decoded_bits = viterbi_decode (coded_bits , self .trellis [i ], 15 ,'soft' )
147+ assert_array_equal (decoded_bits , msg )
0 commit comments