一文弄懂奇偶校验

以前有一个魔术,是这样的:

魔术师蒙蔽眼耳,不得与助手和观众有任何交流,助手则从现场随机找一名观众,给他若干枚类似硬币的棋子,每枚棋子正反面分别为黑色和白色,然后让观众任意排列这些棋子,助手用自己手上的一枚棋子补位,然后再让观众自己选择翻转或不反转这些棋子,最后由魔术师观察这些棋子,判断观众是否翻转了棋子。

似曾相识?

对,这就是奇偶校验。

奇偶校验是数据通信和数据存储中用来检测错误的一种简单的方法,其基本思想在于通过引入一个额外的校验位,使得数据位的总数为奇数或偶数。这个校验位的奇偶性与数据位中1的个数相关,以此校验通信或存储过程是否出现错误。奇偶校验基于数据位中1的个数,通过在数据传输中引入一个校验位,使得数据位和校验位中的1的总数为奇数或偶数。这样在接收端,通过检测校验位中的奇偶性,就可以判断数据是否在传输过程中发生了错误。

奇校验

  • 奇校验的原理: 在奇校验中,校验位被设置为确保数据位和校验位中1的总数为奇数。如果数据中的1的个数已经是奇数,校验位设置为0,使得总数为偶数;如果数据中的1的个数是偶数,校验位设置为1,使得总数为奇数。

  • 实现方式: 在串口通信中,发送端计算数据位中1的个数,然后设置校验位,使得总的位数为奇数。接收端同样计算接收到的数据位和校验位中1的个数,检测奇偶性,从而发现是否存在传输错误。

偶校验

  • 偶校验的原理: 在偶校验中,校验位被设置为确保数据位和校验位中1的总数为偶数。如果数据中的1的个数已经是奇数,校验位设置为1,使得总数为偶数;如果数据中的1的个数是偶数,校验位设置为0,使得总数为奇数。

  • 实现方式: 类似于奇校验,发送端计算数据位中1的个数,然后设置校验位,使得总的位数为偶数。接收端同样计算接收到的数据位和校验位中1的个数,检测奇偶性,从而发现是否存在传输错误。

应用场景

奇偶校验在串口通信中广泛应用,特别是在RS-232等标准中。在传输数据时,通过设置奇偶校验位,可以有效地检测并纠正单比特错误,提高通信的可靠性。

实例代码

以下是简单的Python代码演示如何在串口通信中使用奇偶校验:

import random

def generate_parity(data, parity_type='odd'):
    count_ones = sum([int(bit) for bit in data])
    if parity_type == 'odd':
        return '1' if count_ones % 2 == 0 else '0'
    elif parity_type == 'even':
        return '1' if count_ones % 2 == 1 else '0'

def simulate_communication(data_bits, parity_type='odd'):
    # 发送端生成奇偶校验位
    parity_bit = generate_parity(data_bits, parity_type)
    
    # 随机决定是否翻转一个随机的位
    flip_bit_index = random.randint(0, len(data_bits) - 1)
    flip_bit = random.choice(['0', '1'])  # 随机选择是翻转为0还是1
    
    transmitted_data = data_bits[:flip_bit_index] + flip_bit + data_bits[flip_bit_index + 1:] + parity_bit
    
    # 接收端接收数据
    received_data = transmitted_data[:-1]
    received_parity = transmitted_data[-1]
    
    # 接收端进行奇偶校验的检测
    received_parity_check = generate_parity(received_data, parity_type)
    
    # 检查是否存在错误
    error_detected = received_parity != received_parity_check
    
    return transmitted_data, received_data, received_parity, error_detected

# 示例
data_bits = '1101101'
parity_type = 'odd'

transmitted_data, received_data, received_parity, error_detected = simulate_communication(data_bits, parity_type)

print(f"Original Data: {data_bits}")
print(f"Transmitted Data: {transmitted_data}")
print(f"Received Data: {received_data}")
print(f"Received Parity: {received_parity}")
print(f"Error Detected: {error_detected}")

结论

奇偶校验作为串口通信中的一项基本技术,通过引入校验位,有效地帮助检测传输过程中的错误。选择奇校验还是偶校验取决于具体的通信标准和应用需求。

尽管奇偶校验在一些情况下可以有效地检测和纠正传输中的错误,但也存在一些不足之处:

  1. 仅能检测单比特错误: 奇偶校验只能检测到数据中的单比特错误,即数据中的一位发生了变化。对于多位错误或其他类型的错误,奇偶校验无法提供有效的保护。

  2. 无法纠正错误: 奇偶校验虽然可以检测错误,但不能提供纠正错误的能力。一旦检测到错误,通信系统通常需要采取其他手段(例如重新传输)来纠正错误。

  3. 传输效率较低: 引入奇偶校验位会增加传输的数据量,降低了传输效率。对于一些对传输速率要求较高的应用场景,可能会选择更高级的错误检测和纠正机制。

  4. 无法应对脉冲噪声: 在实际通信中,可能会受到一些脉冲噪声的影响,奇偶校验对于这类噪声的容忍性较差,容易产生误报。

  5. 不适用于高速通信: 在高速通信的情境下,奇偶校验的性能可能受到限制,因为它对于数据的快速变化和复杂模式的适应性较弱。

  6. 不支持多点通信: 在某些多点通信的情况下,奇偶校验可能不如其他更先进的错误检测和纠正机制适用。

在实际应用中,特别是对于对通信质量要求较高、对传输速率要求较大的场景,人们常常会选择更为复杂和强大的错误检测和纠正技术,例如循环冗余校验(CRC)或海明码,以提高通信系统的可靠性。

但是这些不足并不影响奇偶校验在数据校验中的基础性地位,很多算法都是在此基础上发展起来的。我们要学习理解这些设计思想,通过巧妙设计去解决问题。

公众号 | FunIO
微信搜一搜 “funio”,发现更多精彩内容。
个人博客 | blog.boringhex.top

### YOLOv1 原理与实现 #### 2.1 YOLOv1 简介 YOLO (You Only Look Once) v1 是一种用于实时对象检测的单阶段神经网络框架。该方法通过将输入图像划分为多个网格单元,并让每个网格负责预测固定数量的边界框及其对应的类别概率来完成物体检测任务[^3]。 #### 2.2 核心算法原理与具体操作步骤 YOLOv1 将整个图片分成 S×S 的网格结构,如果某个物体中心落在这个格子内部,则此格子就负责预测该物体的位置以及其属于各个类别的条件概率 P(C_i|Object)。对于每一个网格,模型会输出 B 个边框坐标(x, y, w, h),其中 x 和 y 表示相对于网格左上角位置的比例偏移量;w 和 h 则表示宽度和高度相对于整张图的比例尺寸。此外还会给出这些候选区域存在目标的概率 C。 为了提高定位准确性并减少冗余预测,在训练过程中引入了 IOU(Intersection Over Union)作为评价标准之一,即真实标签包围盒与预测结果之间的重叠程度比率。当两个矩形框完全吻合时IOU=1,而没有任何交集则为0。因此优化过程旨在最大化正样本间的平均IOU值的同时最小化负样本得分。 #### 数学模型和公式 在数学建模方面,YOLOv1 设计了一种特殊的损失函数用来衡量预测值同标注数据间差异: \[ L_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^{B}(1^{obj}_{ij})[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2]\] 这里 \(L_{coord}\) 控制着坐标的权重系数;\(1^{obj}_{ij}\) 是指示变量,只有当第 i 个 grid cell 中确实含有 object 并且 jth 边界框负责预测它的时候才取 1 。上述表达式计算的是所有含object 的grid cells里所对应的最佳box 对应的真实center point 同预测值之间差距平方之和。 另外还有关于宽高误差项、置信度误差项及分类误差项等部分共同构成了最终的整体loss function 形式。 ```python def compute_loss(predictions, targets): """ 计算YOLOv1损失函数 参数: predictions -- 模型预测的结果向量 targets -- 数据集中给定的目标真值 返回: total_loss -- 总体损失数值 """ # 初始化各项损失分量 coord_mask = ... conf_pos_mask = ... conf_neg_mask = ... class_mask = ... # ... (省略中间具体的mask构建逻辑) # 计算各部分损失 loss_coord = torch.sum(coord_mask * (pred_box_xy - true_box_xy)**2) loss_conf_pos = torch.sum(conf_pos_mask * (pred_box_confidence - true_box_confidence)**2) loss_conf_neg = torch.sum(conf_neg_mask * pred_noobj_confidence**2) loss_class = torch.sum(class_mask * F.cross_entropy(pred_class_probabilities, target_classes)) # 加权求和得到总损失 total_loss = lambda_coord*loss_coord + loss_conf_pos + loss_conf_neg + loss_class return total_loss ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值