python 实现 BCH 纠错码的方法

本文详细介绍了如何在Python中利用bchlib库实现BCH纠错码,包括编码和纠错步骤,并通过实际例子展示了BCH码在处理0,1字符串和bytearray时的操作。重点讲解了BCH码构造和错误检测修复的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python 实现 BCH 纠错码的方法

BCH码是一类重要的纠错码,它把信源待发的信息序列按固定的κ位一组划分成消息组,再将每一消息组独立变换成长为n(n>κ)的二进制数字组,称为码字。如果消息组的数目为M(显然M>=2),由此所获得的M个码字的全体便称为码长为n、信息数目为M的分组码,记为n,M。把消息组变换成码字的过程称为编码,其逆过程称为译码。

  • 我这里考虑输入是 torch.Tensor的一个 只包含0 ,1 元素的张量
  • 对于输入是numpy或者0,1字符串的方法就更简单了,总之都先要将输入处理成为 0,1字符串,例如“1010”
  • 首先构造一个输入:
import random

a = [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 bchlib

BCH_POLYNOMIAL = 137
BCH_BITS = 5

def 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转化为bytes
    a = 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转化为bytes
    full_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:
            pass
            print('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 = 5

bched = 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
  • 可以看到第一行和最后一行,分别对应着原始二进制串和添加扰动之后纠错的二进制串
参考资源链接:[Android平台音视频数据采集与MP4合成技术详解](https://wenku.csdn.net/doc/4h99dtzyr6?utm_source=wenku_answer2doc_content) 要完成从音视频数据采集到最终MP4文件合成的整个流程,你需要掌握Android平台上Camera API、AudioRecord API、MediaCodec以及MediaMuxer的使用。首先,Camera API允许你获取设备的相机硬件进行图像和视频数据的捕获,而AudioRecord API则负责音频数据的实时采集。这两部分数据通常是不同的采集流,需要分别处理。 在采集到原始音视频数据后,使用MediaCodec API对这些数据进行硬编码处理是关键步骤。MediaCodec支持硬件加速,你可以设置其编码格式为H.264(对于视频)和AAC(对于音频),这两种格式在压缩效率和兼容性方面都非常优秀。编码过程需要处理输入缓冲区和输出缓冲区,确保音频和视频数据的同步。 最后,MediaMuxer作为一个媒体容器工具,用于将编码后的音频和视频轨道数据封装成MP4文件。这个过程涉及到添加时间戳、同步信息以及符合MP4格式标准的数据组织结构。完成这些步骤后,你将得到一个格式化良好的MP4文件,可以用于播放、存储或网络传输。 推荐深入阅读《Android平台音视频数据采集与MP4合成技术详解》以获得详细的操作指导和代码示例。这本资料详细介绍了如何在Android平台上进行音视频数据的采集、硬编码、以及MP4合成的完整流程,对于理解并实现相关的应用开发将大有帮助。 参考资源链接:[Android平台音视频数据采集与MP4合成技术详解](https://wenku.csdn.net/doc/4h99dtzyr6?utm_source=wenku_answer2doc_content)
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值