numpyでハミング符号


numpyのリファレンスを眺めていたらビット処理にかんする便利そうな関数を発見したので,
テストもかねてハミング符号を実装してみた.
とりあえず,ハミング符号(4,3)にのみ対応.
uint8以外にも対応してればいいのになぁ.

hamming.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import random

if __name__ == '__main__':
    k = 4
    m = 3

    #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

    #生成行列と検査行列を作る
    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 )

    #符号化する値を適当に
    random.seed()
    code = random.randint( 0, 2 ** k - 1 )
    bit_code = np.unpackbits( np.array( code, dtype = np.uint8 ) )[-k:]

    #ハミング符号を生成して,あるビットを反転させる
    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

    #検証

    check_result = np.dot( H, hamming_code ) % 2

    print code
    print hamming_code
    print H
    print error_bit_offset
    print check_result

実行結果

% ./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]