Skip to content

Commit 4fa952a

Browse files
authored
Merge pull request #64 from eSoares/Faster-dec2bitarray
Change dec2bitarray to a faster implementation& correct small legacy bugs
2 parents 9dfe948 + af26db5 commit 4fa952a

File tree

3 files changed

+44
-11
lines changed

3 files changed

+44
-11
lines changed

commpy/channelcoding/convcode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,13 @@ def __init__(self, memory, g_matrix, feedback=None, code_type='default', polynom
165165

166166
output_generator_array[l] = generator_array[0]
167167
if l == 0:
168-
feedback_array = (dec2bitarray(feedback, memory[l])[1:] * shift_register[0:memory[l]]).sum()
168+
feedback_array = (dec2bitarray(feedback, memory[l] + 1)[1:] * shift_register[0:memory[l]]).sum()
169169
shift_register[1:memory[l]] = \
170170
shift_register[0:memory[l] - 1]
171171
shift_register[0] = (dec2bitarray(current_input,
172172
self.k)[0] + feedback_array) % 2
173173
else:
174-
feedback_array = (dec2bitarray(feedback, memory[l]) *
174+
feedback_array = (dec2bitarray(feedback, memory[l] + 1) *
175175
shift_register[
176176
l + memory[l - 1] - 1:l + memory[l - 1] + memory[l] - 1]).sum()
177177
shift_register[l + memory[l - 1]:l + memory[l - 1] + memory[l] - 1] = \

commpy/channelcoding/tests/test_ldpc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def test_ldpc_bp_decode(self):
6262
fer_array_test[idx] = float(fer_cnt_bp) / (iter_cnt + 1) / n_blocks
6363
break
6464

65-
assert_allclose(fer_array_test, fer_array_ref, rtol=.5, atol=0,
65+
assert_allclose(fer_array_test, fer_array_ref, rtol=.6, atol=0,
6666
err_msg=decoder_algorithm + ' algorithm does not perform as expected.')
6767

6868
def test_write_ldpc_params(self):

commpy/utilities.py

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,26 @@
99
.. autosummary::
1010
:toctree: generated/
1111
12-
dec2bitarray -- Integer to binary (bit array).
12+
dec2bitarray -- Integer or array-like of integers to binary (bit array).
13+
decimal2bitarray -- Specialized version for one integer to binary (bit array).
1314
bitarray2dec -- Binary (bit array) to integer.
1415
hamming_dist -- Hamming distance.
1516
euclid_dist -- Squared Euclidean distance.
1617
upsample -- Upsample by an integral factor (zero insertion).
1718
signal_power -- Compute the power of a discrete time signal.
1819
"""
1920

20-
import itertools as it
21-
2221
import numpy as np
2322

24-
__all__ = ['dec2bitarray', 'bitarray2dec', 'hamming_dist', 'euclid_dist', 'upsample',
23+
__all__ = ['dec2bitarray', 'decimal2bitarray', 'bitarray2dec', 'hamming_dist', 'euclid_dist', 'upsample',
2524
'signal_power']
2625

2726
vectorized_binary_repr = np.vectorize(np.binary_repr)
2827

2928

3029
def dec2bitarray(in_number, bit_width):
3130
"""
32-
Converts a positive integer to NumPy array of the specified size containing
31+
Converts a positive integer or an array-like of positive integers to NumPy array of the specified size containing
3332
bits (0 and 1).
3433
3534
Parameters
@@ -42,13 +41,47 @@ def dec2bitarray(in_number, bit_width):
4241
4342
Returns
4443
-------
45-
bitarray : 1D ndarray of ints
44+
bitarray : 1D ndarray of numpy.int8
4645
Array containing the binary representation of all the input decimal(s).
4746
4847
"""
4948

50-
binary_words = vectorized_binary_repr(np.array(in_number, ndmin=1), bit_width)
51-
return np.fromiter(it.chain.from_iterable(binary_words), dtype=np.int8)
49+
if isinstance(in_number, (np.integer, int)):
50+
return decimal2bitarray(in_number, bit_width)
51+
result = np.zeros(bit_width * len(in_number), np.int8)
52+
for pox, number in enumerate(in_number):
53+
result[pox * bit_width:(pox + 1) * bit_width] = decimal2bitarray(number, bit_width)
54+
return result
55+
56+
57+
def decimal2bitarray(number, bit_width):
58+
"""
59+
Converts a positive integer to NumPy array of the specified size containing bits (0 and 1). This version is slightly
60+
quicker that dec2bitarray but only work for one integer.
61+
62+
Parameters
63+
----------
64+
in_number : int
65+
Positive integer to be converted to a bit array.
66+
67+
bit_width : int
68+
Size of the output bit array.
69+
70+
Returns
71+
-------
72+
bitarray : 1D ndarray of numpy.int8
73+
Array containing the binary representation of all the input decimal(s).
74+
75+
"""
76+
result = np.zeros(bit_width, np.int8)
77+
i = 1
78+
pox = 0
79+
while i <= number:
80+
if i & number:
81+
result[bit_width - pox - 1] = 1
82+
i <<= 1
83+
pox += 1
84+
return result
5285

5386

5487
def bitarray2dec(in_bitarray):

0 commit comments

Comments
 (0)