卷积码编码技术

1、描述CRC循环冗余校验技术。

CRC是Cyclic Redundancy Check的缩写,中文叫循环冗余校验,维基百科的定义是这样的:CRC是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的计算机硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方法是由W. Wesley Peterson于1961年发表。

2、编程实现CRC循环冗余校验。

def XOR(str1, str2):  # 实现模2减法
    ans = ''
    if str1[0] == '0':
        return '0', str1[1:]
    else:
        for i in range(len(str1)):
            if (str1[i] == '0' and str2[i] == '0'):
                ans = ans + '0'
            elif (str1[i] == '1' and str2[i] == '1'):
                ans = ans + '0'
            else:
                ans = ans + '1'
    return '1', ans[1:]
def CRC_Encoding(str1, str2):  # CRC编码
    lenght = len(str2)
    str3 = str1 + '0' * (lenght - 1)    #补0
    ans = ''
    yushu = str3[0:lenght]
    for i in range(len(str1)):
        str4, yushu = XOR(yushu, str2)
        ans = ans + str4
        if i == len(str1) - 1:
            break
        else:
            yushu = yushu + str3[i + lenght]
    ans = str1 + yushu
    return ans
def CRC_Decoding(str1, str2):  # CRC解码
    lenght = len(str2)
    str3 = str1 + '0' * (lenght - 1)
    ans = ''
    yushu = str3[0:lenght]
    for i in range(len(str1)):
        str4, yushu = XOR(yushu, str2)
        ans = ans + str4
        if i == len(str1) - 1:
            break
        else:
            yushu = yushu + str3[i + lenght]
    return yushu == '0' * len(yushu)
def main():  # 主函数
    while True:
        print('==' * 30)
        setting = input("请输入运行模式(0:退出,1:CRC编码,2:CRC验证):")
        if setting == '0':
            break
        elif setting == '1':
            str1 = input("请输入数据:")
            str2 = input("请输入生成比特模式:")
            str3 = CRC_Encoding(str1, str2)
            print("{} 编码后为: {}".format(str1, str3))
        elif setting == '2':
            str1 = input("请输入验证数据:")
            str2 = input("请输入生成比特模式:")
            flag = CRC_Decoding(str1, str2)
            if flag:
                print("验证完成,未出错")
            else:
                print("sorry 验证数据已出错")
        else:
            print("请正确输入:")
main()
#测试数据:10110011  11001   得到 101100110100
#测试数据:101100110100  11001

 3、编程实现卷积码。

def encode(var):
    code = []
    #(2,1,2)卷积码
    register_2 = 0
    register_1 = 0
    for i in var:
        c_1 = (i + register_1 + register_2)%2
        c_2 = (i+register_2)%2
        code.append(c_1)
        code.append(c_2)
        register_2 = register_1
        register_1 = i
    print("卷积编码为:",code)

input_list=list(input("Please input bin data:"))
for i in range(len(input_list)):
      input_list[i] = int(input_list[i])
print(input_list)
encode(input_list)
#测试数据: 10110

实验结果:

CRC:

 卷积编码:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值