change BitArray to bitarray - over 10x performance improvement!
This commit is contained in:
parent
4d46baa357
commit
e4cc3e95f0
1
RS129.py
1
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]
|
||||
|
36
bptc19696.py
36
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()
|
||||
|
||||
|
31
hamming.py
31
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)
|
||||
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]))
|
Loading…
Reference in New Issue
Block a user