Als ich mir die Numpy-Referenz ansah, fand ich eine nützliche Funktion für die Bitverarbeitung Ich habe auch einen Brummcode zum Testen implementiert. Derzeit wird nur der Brummcode (4,3) unterstützt. Ich wünschte, ich könnte andere als uint8 unterstützen.
hamming.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import random
if __name__ == '__main__':
k = 4
m = 3
#Erstellen Sie eine Liste von Nicht-Strom 2
column_values = np.array([ [x] for x in range( 2 ** m ) if ( x & ( x - 1 ) ) != 0 ], dtype=np.uint8 )
A = np.reshape( np.unpackbits( column_values ), ( k, 8) )[:, -3:].T
#Erstellen Sie eine Generierungsmatrix und eine Prüfmatrix
H = np.concatenate( ( A, np.eye( m, dtype=np.uint8 ) ), axis=1 )
G = np.concatenate( ( np.eye( k, dtype = np.uint8 ), A.T ), axis = 1 )
#Stellen Sie den zu codierenden Wert entsprechend ein
random.seed()
code = random.randint( 0, 2 ** k - 1 )
bit_code = np.unpackbits( np.array( code, dtype = np.uint8 ) )[-k:]
#Generieren Sie einen Brummcode, um ein wenig zu invertieren
error_bit_offset = random.randint( 0, ( k + m ) - 1 )
hamming_code = np.dot( bit_code, G ) % 2
hamming_code[ error_bit_offset ] = ( hamming_code[ error_bit_offset ] + 1 ) % 2
#Überprüfung
check_result = np.dot( H, hamming_code ) % 2
print code
print hamming_code
print H
print error_bit_offset
print check_result
Ausführungsergebnis
% ./hamming.py
12
[1 0 0 0 1 1 0]
[[0 1 1 1 1 0 0]
[1 0 1 1 0 1 0]
[1 1 0 1 0 0 1]]
1
[1 0 1]
Recommended Posts