En regardant la référence numpy, j'ai trouvé une fonction utile pour le traitement des bits, donc J'ai également implémenté un code bourdonnant pour les tests. Pour le moment, seul le code de bourdonnement (4,3) est pris en charge. Je souhaite que je puisse soutenir autre que uint8.
hamming.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import random
if __name__ == '__main__':
k = 4
m = 3
#Créer une liste de non-pouvoir 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
#Créer une matrice de génération et une matrice de contrôle
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 )
#Définissez correctement la valeur à encoder
random.seed()
code = random.randint( 0, 2 ** k - 1 )
bit_code = np.unpackbits( np.array( code, dtype = np.uint8 ) )[-k:]
#Générer un code bourdonnant pour inverser un peu
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
#Vérification
check_result = np.dot( H, hamming_code ) % 2
print code
print hamming_code
print H
print error_bit_offset
print check_result
Résultat d'exécution
% ./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