From e4cc3e95f04d3e583bb535055cb3281e68eabc5d Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Thu, 22 Sep 2016 15:32:58 -0500 Subject: [PATCH] change BitArray to bitarray - over 10x performance improvement! --- RS129.py | 1 - bptc19696.py | 36 +++++++++++++++--------------------- hamming.py | 31 ++++++++++++++++++------------- 3 files changed, 33 insertions(+), 35 deletions(-) diff --git a/RS129.py b/RS129.py index 852f92d..9bf0637 100644 --- a/RS129.py +++ b/RS129.py @@ -12,7 +12,6 @@ Slight gratuitous modifications were made to match functionality with HBlink and from __future__ import print_function from binascii import b2a_hex as h -from binascii import a2b_hex as a2b START_MASK = [0x96, 0x96, 0x96] END_MASK = [0x99, 0x99, 0x99] diff --git a/bptc19696.py b/bptc19696.py index 20d0662..ee6d0b3 100755 --- a/bptc19696.py +++ b/bptc19696.py @@ -7,8 +7,7 @@ # California, 94041, USA. from __future__ import print_function - -from bitstring import BitArray +from bitarray import bitarray # Does anybody read this stuff? There's a PEP somewhere that says I should do this. __author__ = 'Cortney T. Buffington, N0MJS' @@ -37,16 +36,15 @@ mod_181_index = ( # Converts a DMR frame using 98-68-98 (info-sync/EMB-info) into 196 bit array def dec_get_binary_19696(_data): - _data = bytearray(_data) - _data = BitArray(_data) - return _data[:98] + _data[-98:] + _bits = bitarray(endian='big') + _bits.frombytes(_data) + return _bits[:98] + _bits[-98:] # Applies interleave indecies de-interleave 196 bit array def dec_deinterleave_19696(_data): - deint = BitArray(196) + deint = bitarray(196) for index in xrange(196): - #deint[index] = _data[(index * 181) % 196] - deint[index] = _data[mod_181_index[index]] + deint[index] = _data[mod_181_index[index]] # the real math is slower: deint[index] = _data[(index * 181) % 196] return deint # Applies BTPC error detection/correction routines (INCOMPLETE) @@ -55,16 +53,7 @@ def dec_error_check_19696(_data): # Returns useable LC data - 9 bytes info + 3 bytes RS(12,9) ECC def dec_get_data_19696(_data): - databits = BitArray() - databits.append(_data[4:12]) - databits.append(_data[16:27]) - databits.append(_data[31:42]) - databits.append(_data[46:57]) - databits.append(_data[61:72]) - databits.append(_data[76:87]) - databits.append(_data[91:102]) - databits.append(_data[106:117]) - databits.append(_data[121:132]) + databits = _data[4:12]+_data[16:27]+_data[31:42]+_data[46:57]+_data[61:72]+_data[76:87]+_data[91:102]+_data[106:117]+_data[121:132] return databits.tobytes() @@ -81,14 +70,19 @@ def dec_get_data_19696(_data): if __name__ == '__main__': from binascii import b2a_hex as h + from time import time # Validation Example - data = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20' + data = '\x44\x4d\x52\x44\x00\x2f\x9b\xe5\x00\x0c\x30\x00\x04\xc2\xc4\xa1\xa1\x99\x48\x6e\x2b\x60\x04\x10\x1f\x84\x2d\xd0\x0d\xf0\x7d\x41\x04\x6d\xff\x57\xd7\x5d\xf5\xde\x30\x15\x2e\x20\x70\xb2\x0f\x80\x3f\x88\xc6\x95\xe2\x00\x00' + data = data[20:53] + t0 = time() bin_data = dec_get_binary_19696(data) deint_data = dec_deinterleave_19696(bin_data) #err_corrected = dec_error_check_19696(deint_data) ext_data = dec_get_data_19696(deint_data) + t1 = time() + print('TIME: ', t1-t0, '\n') print('original 33 byte data block:') print(h(data)) @@ -96,12 +90,12 @@ if __name__ == '__main__': print() print('binary data (discarding sync)') - print(bin_data.len, 'bits') + print(len(bin_data), 'bits') print(bin_data) print() print('deinterleaved binary data') - print(deint_data.len, 'bits') + print(len(deint_data), 'bits') print(deint_data) print() diff --git a/hamming.py b/hamming.py index 5333d78..e14e07e 100755 --- a/hamming.py +++ b/hamming.py @@ -7,8 +7,7 @@ # California, 94041, USA. from __future__ import print_function - -from bitstring import BitArray +from bitarray import bitarray # Does anybody read this stuff? There's a PEP somewhere that says I should do this. __author__ = 'Cortney T. Buffington, N0MJS' @@ -23,9 +22,9 @@ __email__ = 'n0mjs@me.com' # Hamming 15,11,3 routines #------------------------------------------------------------------------------ -# ENCODER- returns a BitArray object containing the hamming checksums +# ENCODER- returns a bitarray object containing the hamming checksums def enc_hamming_15113(_data): - csum = BitArray(4) + csum = bitarray(4) csum[0] = _data[0] ^ _data[1] ^ _data[2] ^ _data[3] ^ _data[5] ^ _data[7] ^ _data[8] csum[1] = _data[1] ^ _data[2] ^ _data[3] ^ _data[4] ^ _data[6] ^ _data[8] ^ _data[9] csum[2] = _data[2] ^ _data[3] ^ _data[4] ^ _data[5] ^ _data[7] ^ _data[9] ^ _data[10] @@ -71,9 +70,9 @@ def dec_hamming_15113(_data): # Hamming 13,9,3 routines #------------------------------------------------------------------------------ -# ENCODER - returns a BitArray object containing the hamming checksums +# ENCODER - returns a bitarray object containing the hamming checksums def enc_hamming_1393(_data): - csum = BitArray(4) + csum = bitarray(4) csum[0] = _data[0] ^ _data[1] ^ _data[3] ^ _data[5] ^ _data[6] csum[1] = _data[0] ^ _data[1] ^ _data[2] ^ _data[4] ^ _data[6] ^ _data[7] csum[2] = _data[0] ^ _data[1] ^ _data[2] ^ _data[3] ^ _data[5] ^ _data[7] ^ _data[8] @@ -120,12 +119,18 @@ def dec_hamming_1393(_data): if __name__ == '__main__': # Validation Example - data = BitArray('0x1cd1bb1910f3051031011061cc1aa3800e204002100100147') - print(data[0:11].bin, data[11:15].bin) - print(dec_hamming_15113(data[0:15])[0][0:11].bin, dec_hamming_15113(data[0:15])[0][11:15].bin) - print(enc_hamming_15113(data[0:11]).bin) + raw_data = '\x44\x4d\x52\x44\x00\x2f\x9b\xe5\x00\x0c\x30\x00\x04\xc2\xc4\xa1\xa1\x99\x48\x6e\x2b\x60\x04\x10\x1f\x84\x2d\xd0\x0d\xf0\x7d\x41\x04\x6d\xff\x57\xd7\x5d\xf5\xde\x30\x15\x2e\x20\x70\xb2\x0f\x80\x3f\x88\xc6\x95\xe2\x00\x00' + raw_data = raw_data[20:53] + + data = bitarray(endian='big') + data.frombytes('raw_data') + data = data[4:] + + print(data[0:11], data[11:15]) + print(dec_hamming_15113(data[0:15])[0][0:11], dec_hamming_15113(data[0:15])[0][11:15], dec_hamming_15113(data[0:15])[1]) + print(enc_hamming_15113(data[0:11])) print() - print(data[0:9].bin, data[9:13].bin) - print(dec_hamming_1393(data[0:13])[0][0:9].bin, dec_hamming_1393(data[0:13])[0][9:13].bin) - print(enc_hamming_1393(data[0:9]).bin) \ No newline at end of file + print(data[0:9], data[9:13]) + print(dec_hamming_1393(data[0:13])[0][0:9], dec_hamming_1393(data[0:13])[0][9:13], dec_hamming_15113(data[0:15])[1]) + print(enc_hamming_1393(data[0:9])) \ No newline at end of file