当前位置: 首页 > news >正文

通信原理 —— HDB3 码的编码规则及实现

参考教材为樊昌信主编的《通信原理(第 7 版)》

课本摘句

HDB3 码全称为三阶高密度双极性码(High Density Bipolar 3)。它是 AMI 码的一种改进,保持了 AMI 码没有直流成分且高、低频
分量少、能量集中的优点外克服了其缺点,使连续 “$0$” 的个数小于等于 $3$。其编码规则如下:

  1. 先检查消息码的连 “$0$” 个数。当连 “$0$” 数目小于等于 $3$ 时,则与 AMI 码的编码规则一样。
  2. 当连 “$0$” 数目超过 $3$ 个时,则将每 $4$ 个连 “$0$” 化作一小节,用 “$000V$” 替代。$V$ 取值为 $+1$、$-1$,与其前一个相邻的非 $0$ 脉冲的极性相同。因为这破坏了极性交替的规则,所以 $V$ 称为破坏脉冲。
  3. 相邻的 $V$ 码的极性必须交替。当 $V$ 码取值能满足 2. 中的要求但是不能满足此要求时,则将 “$0000$” 用 “$B00V$” 替代。 $B$ 的取值与后面的 $V$ 脉冲抑制,用于解决此问题。因此,$B$ 称为调节脉冲。
  4. $V$ 码后面的传号码极性也要交替。

编码规则

虽然课本给出了一个详尽的编码规则,但是这个描述对我来说还是太抽象了,并且这个描述的代码实现很困难:因为你可能要不停地更改已经编码过的值以解决规则中的冲突。所以,在这里我想从另一个角度描述 HDB3 的编码规则,具体地说就是:

  1. 依次读取消息码中的符号序列,“$1$”的处理与 AMI 编码规则一致。
  2. 当连续 “$0$” 数目超过 “$3$” 个时,则将每 $4$ 个连 “$0$” 化作一小节,用 “$000V$” 或 “$B00V$” 替代。具体替代的类型取决于该小节前非零脉冲(即非零符号)的个数(“$1$”“$B$”“$V$” 都是非零脉冲):如果非零脉冲的个数为奇数,则用 “$000V$” 替代;否则用 “$B00V$”。
  3. “$V$” 的极性与前一个非零脉冲相同,“$B$” 的极性与前一个非零脉冲相反。

上述规则给出了一个在代码实现上更简单的 HDB3 编码方法,至于它是否与课本中的规则一致我没法给出严格的证明,但是 “it works”。此外,我认为上述对 “$V$”“$B$” 极性的判断能更好地解释其符号的由来(Violation & Bipolar)。

代码实现

以下是 HDB3 编码的 rust 实现(r 门!),因为 rust 的模式匹配非常适合这种输入输出有限取值的模型。

// 原始输入符号
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InputBit {Zero,  // 0One,   // 1
}// HDB3 编码后的符号
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HDB3Symbol {PosB,   // +BNegB,   // -BPosV,   // +VNegV,   // -VPosOne, // +1NegOne, // -1Zero    // 0
}/// HDB3 编码函数
/// input 为 InputBit 数组的切片
/// pos_bias 决定第一个非零脉冲的编码是否为 +1
pub fn encode(input: &[InputBit], pos_bias: bool) -> Vec<HDB3Symbol> {use HDB3Symbol::*;let mut output: Vec<HDB3Symbol> = Vec::with_capacity(input.len());let mut zero_count = 0;// 上一个脉冲的极性let mut pos_pulse = !pos_bias;let mut pulse_count = 0;for &bit in input {match bit {InputBit::One => {// clear zero_countwhile zero_count > 0 {output.push(Zero);zero_count -= 1;}let value = if pos_pulse { NegOne } else { PosOne };output.push(value);pulse_count += 1;pos_pulse = !pos_pulse;},InputBit::Zero => {zero_count += 1;if zero_count == 4 {// 奇数脉冲,000V模式if pulse_count & 1 == 1 {output.append(&mut [Zero].repeat(3));}// 偶数脉冲,B00V模式else {// bipolar pulselet insert_b = if pos_pulse { NegB } else { PosB };output.push(insert_b);pulse_count += 1;pos_pulse = !pos_pulse;output.append(&mut [Zero].repeat(2));}// violation pulselet insert_v = if pos_pulse { PosV } else { NegV };output.push(insert_v);pulse_count += 1;zero_count = 0;}}}}output
}
http://www.jsqmd.com/news/40323/

相关文章:

  • 我写了个容错性很高的 JSON 格式化在线工具给自己用
  • 阿卡德平台:打造个人知识IP的得力帮手
  • 散滞气汤的用法和主要对症
  • Windows安装MySQL,无服务模式,随用随有,一键初始化,可替换phpstudy_pro
  • requirements management, decomposition and allocation - ENGINEER
  • 2025年国内专业商标注册服务权威评测
  • 2025年低氮燃烧器品牌综合评测:技术领先企业排名与选购指南
  • 2025年国内废气废液焚烧厂家综合实力Top5权威评测
  • 读书笔记:为什么数据库存储LOB数据时要选择「行内存储」?
  • 2025年北京雅思培训机构哪家强,高分提分 / 定制课程 / 封闭集训 / 小班教学 / 全程督学机构推荐哪家好
  • 当下高压氧舱机构的行业现状
  • Keycloak会话标识符重用漏洞导致会话劫持风险分析
  • B5817W-ASEMI可直接替换安世PMEG2005EH
  • 4.2.3 疲劳强度试验 11.14
  • [LangChain] 17. Memory基础
  • Java Exchanger
  • 2025 最新净化工程厂家推荐排行榜 实验室 / 手术室 / 医药 / 食品 / 厂房洁净工程优质服务商医药/食品净化工程/净化车间工程公司推荐
  • 通配符优化 dp 学习笔记
  • 2025年尖角方管实力厂家权威推荐榜单:玻璃幕墙精致钢/直角方矩管/精制钢源头厂家精选
  • 20232308 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • TurboWarp 部署云变量服务
  • Java 信号量机制实现
  • lc:338练习的一点思考
  • 京东商品评论接口深度逆向:从加密参数破解到情感倾向分析
  • [LangChian] 18. 自动维护聊天记录
  • 二进制掩码规律
  • jenkins构建生成docker镜像
  • 在线文档大全
  • AI大事记12:Transformer 架构——重塑 NLP 的革命性技能(下)
  • 记一次多线程插入或者更新数据库表操作优化过程