日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 实现 BCH 纠错码的方法

發布時間:2024/8/1 python 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 实现 BCH 纠错码的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python 實現 BCH 糾錯碼的方法

BCH碼是一類重要的糾錯碼,它把信源待發的信息序列按固定的κ位一組劃分成消息組,再將每一消息組獨立變換成長為n(n>κ)的二進制數字組,稱為碼字。如果消息組的數目為M(顯然M>=2),由此所獲得的M個碼字的全體便稱為碼長為n、信息數目為M的分組碼,記為n,M。把消息組變換成碼字的過程稱為編碼,其逆過程稱為譯碼。

  • 我這里考慮輸入是 torch.Tensor的一個 只包含0 ,1 元素的張量
  • 對于輸入是numpy或者0,1字符串的方法就更簡單了,總之都先要將輸入處理成為 0,1字符串,例如“1010”
  • 首先構造一個輸入:
import randoma = [1 for i in range(16)] b = [0 for i in range(16)] a.extend(b) random.shuffle(a) a = np.array(a) a = torch.Tensor(a)
  • 將 a 處理成為 0,1字符串:
a = str(a.numpy().tolist())[1:-1].replace('.0','').replace(',','').replace(' ','')
  • 構造添加BCH碼的方法

  • 注意,這里我們使用的bch 生成多項式是bin(137),對于多項式,我們可以在這里查找對應的多項式

  • 比如bch(255,155),即碼字255bits,有效載荷155bits(就是你的有效信息),bch code長度為255+1-155=101

  • 但是對于bchlib是以字節為單位作為為輸入的(長度為8的倍數)

  • 則bch code的長度為top(101/8)*8 = 104

import bchlibBCH_POLYNOMIAL = 137 BCH_BITS = 5def add_bch(wm):'''對于 str類型:a='1010' 或者 a='0b1010'bytearray(a, encoding='utf-8')= bytearray(b'0b1010')對于16進制表示的二進制 ecc''.join(format(x, '08b') for x in ecc)=str(1010)='1010''''full_wm_bytes = bytes(int(wm[i : i + 8], 2) for i in range(0, len(full_wm), 8)) #將bin轉化為bytesa = bytearray(full_wm_bytes)print(f"{len(a)}:{a}")bch = bchlib.BCH(BCH_POLYNOMIAL, BCH_BITS)ecc = bch.encode(a)print(f"{len(ecc)}:{ecc}")ecc = ''.join(format(x, '08b') for x in ecc) #使用format函數,將bytearray中存儲的十進制數轉換為二進制print(f"{len(ecc)}:{ecc}")return torch.Tensor([int(i) for i in full_wm+ecc])
  • 構造BCH糾錯的方法
# do error correct def do_ec(wm):#56位BCH校驗full_wm = str(wm.numpy().tolist())[1:-1].replace('.0','').replace(',','').replace(' ','')bch = bchlib.BCH(BCH_POLYNOMIAL, BCH_BITS)full_wm = bytes(int(full_wm[i : i + 8], 2) for i in range(0, len(full_wm), 8)) #將bin轉化為bytesfull_wm= bytearray(full_wm)wm = full_wm[:-bch.ecc_bytes]#wm = bytearray(wm, encoding='utf-8')ecc = full_wm[-bch.ecc_bytes:]#ecc = bytes(int(ecc[i : i + 8], 2) for i in range(0, len(ecc), 8))bitflips = bch.decode_inplace(wm, ecc)if bitflips != -1:try:code = wm.decode("utf-8")print(code)except:passprint('Failed to decode')wm = ''.join(format(x, '08b') for x in wm)return torch.Tensor([int(i) for i in wm])
  • 測試 BCH 生成
  • 加入擾動和糾錯
BCH_POLYNOMIAL = 137 BCH_BITS = 5bched = new_add_bch(a) print(f"{len(bched)}:{bched}")bched[12:20] = 0. # add noise wm = do_ec(bched) print(f"{len(wm)}:{wm.detach.numpy()}")
  • 輸出
32:01010000011001011011100110101011 32:bytearray(b'01010000011001011011100110101011') 5:bytearray(b'\xd7\x07\xe7|\x00') 40:1101011100000111111001110111110000000000 72:tensor([0., 1., 0., 1., 0., 0., 0., 0., 0., 1., 1., 0., 0., 1., 0., 1., 1., 0.,1., 1., 1., 0., 0., 1., 1., 0., 1., 0., 1., 0., 1., 1., 1., 1., 0., 1.,0., 1., 1., 1., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 0., 0., 1.,1., 1., 0., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 32:01010000011000000000100110101011
  • 可以看到第一行和最后一行,分別對應著原始二進制串和添加擾動之后糾錯的二進制串

總結

以上是生活随笔為你收集整理的python 实现 BCH 纠错码的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。