通信系统仿真

崔春雷

目录

  • 1 第一单元: MATLAB基础
    • 1.1 课程说明与资料
      • 1.1.1 作业参考答案
      • 1.1.2 移动22级作业答案
    • 1.2 MATLAB安装与运行环境
      • 1.2.1 MATLAB介绍
    • 1.3 基本数据类型:数值类型
    • 1.4 基本数据类型:字符类型
    • 1.5 数据类型转换与输出
    • 1.6 数组与矩阵基础
      • 1.6.1 矩阵运算进阶
    • 1.7 数组与矩阵常用函数
    • 1.8 matlab中的逻辑运算
    • 1.9 实验: MATLAB常用数学函数
      • 1.9.1 实验 作业答案
    • 1.10 元胞数组
    • 1.11 结构体数组
      • 1.11.1 结构体进阶
      • 1.11.2 元胞数组与结构体数组对比
      • 1.11.3 map 容器
    • 1.12 附录:MATLAB常用基础命令
    • 1.13 拓展内容:实时脚本
      • 1.13.1 实时脚本示例
    • 1.14 课程作业与答案
      • 1.14.1 《通信系统仿真》期末考试
  • 2 第二单元:Matlab 程序设计
    • 2.1 顺序结构程序
    • 2.2 分支结构—— if语句
    • 2.3 分支结构—— switch语句
    • 2.4 循环结构—— while语句
    • 2.5 循环结构—— for语句
    • 2.6 图像处理基础
    • 2.7 Matlab的函数
      • 2.7.1 函数内容的课外扩展
    • 2.8 本章实验:for循环的应用
      • 2.8.1 素数问题
        • 2.8.1.1 素数的螺旋线排列
      • 2.8.2 3X+1猜想
      • 2.8.3 7 行代码计算 π
    • 2.9 排序算法
      • 2.9.1 冒泡排序
      • 2.9.2 选择排序
      • 2.9.3 插入排序
      • 2.9.4 快速排序
      • 2.9.5 基数排序
      • 2.9.6 计数排序
      • 2.9.7 堆排序
    • 2.10 动态规划算法
      • 2.10.1 动态规划编程实例
      • 2.10.2 动态规划:01背包问题
      • 2.10.3 动态规划常见题目分析
      • 2.10.4 动态规划题目分析2
    • 2.11 常用算法简介
      • 2.11.1 剪枝算法
      • 2.11.2 二分查找
      • 2.11.3 递归算法
      • 2.11.4 回溯算法
        • 2.11.4.1 Leetcode回溯题目合集
        • 2.11.4.2 回溯算法总结
        • 2.11.4.3 回溯法解数独问题
        • 2.11.4.4 DFS与BFS
          • 2.11.4.4.1 DFS/BFS原理
          • 2.11.4.4.2 BFS的应用:Dijkstra算法
      • 2.11.5 n 皇后问题专题
      • 2.11.6 双指针算法
      • 2.11.7 数组模拟链表(约瑟夫环)
      • 2.11.8 Hash(哈希表)
      • 2.11.9 图论与路径规划
        • 2.11.9.1 迪杰斯特拉算法
        • 2.11.9.2 A*算法
          • 2.11.9.2.1 A*算法的MATLAB实现
        • 2.11.9.3 RRT路径规划算法
          • 2.11.9.3.1 RRT算法 MATLAB代码
          • 2.11.9.3.2 参考资料
      • 2.11.10 数据结构
        • 2.11.10.1 数据结构例题
      • 2.11.11 前缀和 差分 双指针
      • 2.11.12 位运算
      • 2.11.13 常用算法代码模板
    • 2.12 练习题库
    • 2.13 code
      • 2.13.1 简易计算器gui代码
      • 2.13.2 五子棋
      • 2.13.3 连连看小游戏
      • 2.13.4 递归算法与汉诺塔
      • 2.13.5 有理数的小数循环节
    • 2.14 MATLAB编程风格
      • 2.14.1 向量化编程专题
  • 3 第三单元:Matlab 图形图像处理
    • 3.1 二维图形绘图基础
    • 3.2 二维图形绘图进阶
    • 3.3 三维图形绘图
      • 3.3.1 MATLAB绘图小结
        • 3.3.1.1 用matlab绘制好看图像
    • 3.4 MATLAB高级绘图
    • 3.5 文件操作
    • 3.6 Matlab图像处理进阶
      • 3.6.1 补充:Matlab图像处理常用函数
      • 3.6.2 RGB/HSV/HSI颜色模型
      • 3.6.3 图片切换动画效果
      • 3.6.4 图像连通域标记
      • 3.6.5 图像旋转与插值
      • 3.6.6 图像的形态学
      • 3.6.7 空间滤波
        • 3.6.7.1 图像中常见的噪声类型与滤波方法
        • 3.6.7.2 matlab中的滤波函数
        • 3.6.7.3 BM3D 去噪算法
        • 3.6.7.4 双边滤波
      • 3.6.8 图像的频域处理
    • 3.7 本章总结
    • 3.8 实验 : matlab 绘图练习1
    • 3.9 实验: matlab 绘图练习2
    • 3.10 实验 :数学函数图像绘制
    • 3.11 实验:绘图综合练习
    • 3.12 实验:曲线拟合
    • 3.13 实验:牛顿法求解方程的根
    • 3.14 实验:信号的傅里叶变换
      • 3.14.1 傅里叶变换、小波变换、希尔伯特变换
      • 3.14.2 新建目录
    • 3.15 课外补充:图像处理基础1
    • 3.16 课外补充:图像处理基础2
    • 3.17 课外补充:图像处理基础3
    • 3.18 课外补充:PYTHON基础
  • 4 第五单元:MATLAB通信仿真
    • 4.1 现代通信系统的介绍
    • 4.2 模拟通信系统的仿真原理
    • 4.3 HDB3编解码的仿真实现
    • 4.4 SIMULINK和其模块简介
    • 4.5 数字通信系统的仿真原理
    • 4.6 模拟通信系统Simulink仿真
    • 4.7 数字通信系统Simulink仿真
    • 4.8 音频信号测处理与仿真
    • 4.9 图像数字水印技术
      • 4.9.1 三角函数到傅里叶变换再到语音识别与数字水印
    • 4.10 信息系统与算法
      • 4.10.1 递归算法
        • 4.10.1.1 递归与堆栈的关系
      • 4.10.2 哈希表
      • 4.10.3 双指针算法
        • 4.10.3.1 双指针算法实战
        • 4.10.3.2 双指针进阶:滑动窗口算法
      • 4.10.4 字符串匹配 KMP算法
        • 4.10.4.1 字符串匹配B-M算法
      • 4.10.5 快速傅里叶变换
      • 4.10.6 回溯算法
      • 4.10.7 动态规划
      • 4.10.8 分治算法
      • 4.10.9 Dijkstra算法
  • 5 第六单元: systemview通信仿真
    • 5.1 SystemView概述
    • 5.2 模拟通信系统 数字系统的仿真分析
    • 5.3 SystemView通信系统仿真进阶
    • 5.4 新建课程目录
  • 6 第四单元:MATLAB高级应用
    • 6.1 符号运算基础
      • 6.1.1 利用Matlab自动推导公式
    • 6.2 Matlab中的数值计算
      • 6.2.1 积分的计算
      • 6.2.2 龙格库塔:常微分方程的数值解法
      • 6.2.3 fmincon函数与非线性方程最小值
    • 6.3 统计、拟合、插值
      • 6.3.1 协方差与相关系数
    • 6.4 GUI设计初步
    • 6.5 matlab GUI界面编程
      • 6.5.1 gui实例
      • 6.5.2 gui编程中常用函数
      • 6.5.3 App Designer入门
    • 6.6 实验:GUI设计图像空间变换系统
    • 6.7 作业:利用GUI设计 计算器、信号发生器等
    • 6.8 MTALB数据导入方法
    • 6.9 课外补充:MATLAB的App会取代GUI吗?
    • 6.10 模拟退火算法matlab实现
    • 6.11 遗传算法的Matlab实现
      • 6.11.1 进化算法(Evolutionary Algorithm)及相关函数介绍
    • 6.12 粒子群算法 matlab实现
      • 6.12.1 粒子群算法及MATLAB实例仿真
    • 6.13 BP网络的应用
    • 6.14 matlab 结构体
    • 6.15 群智能算法合集
  • 7 拓展知识
    • 7.1 什么是算法的时间复杂度?
    • 7.2 Notepad++使用教程
    • 7.3 MATLAB常用函数总结
    • 7.4 MATLAB常用知识点总结
    • 7.5 MATLAB命令大全
    • 7.6 视频:MATLAB官方基础教程
    • 7.7 经典书籍:Matlab2012经典超强教程
    • 7.8 经典书籍:MATLAB揭秘(自学宝典)
    • 7.9 经典资料:MATLAB N个实用技巧
    • 7.10 Matlab编程小技巧
    • 7.11 寻优算法
      • 7.11.1 Dijkstra算法python实现
    • 7.12 PYTHON基础教程
      • 7.12.1 Python进阶
      • 7.12.2 Python小技巧
      • 7.12.3 Python总结
        • 7.12.3.1 Python循环语句总结
        • 7.12.3.2 24个顶级Python库
        • 7.12.3.3 魔法函数
      • 7.12.4 廖雪峰python
      • 7.12.5 正则表达式基础
      • 7.12.6 numpy
        • 7.12.6.1 101道Numpy习题
        • 7.12.6.2 Numpy简要语法教程
        • 7.12.6.3 Numpy实现全连接神经网络 (手写数字识别)
        • 7.12.6.4 图解NumPy
      • 7.12.7 matplotlib
        • 7.12.7.1 matplotlib练习50题
        • 7.12.7.2 Matplotlib速查表
        • 7.12.7.3 Matplotlib 实操指南
      • 7.12.8 Python3 模块 import
      • 7.12.9 Python 小项目
    • 7.13 参考资源:数据结构与算法
      • 7.13.1 十大经典排序算法总结
    • 7.14 机器学习概述
      • 7.14.1 反向传播算法
        • 7.14.1.1 反向传播的数学原理
      • 7.14.2 极大似然估计
        • 7.14.2.1 极大似然估计与最小二乘法
      • 7.14.3 Batch Normalization
        • 7.14.3.1 Batch Normalization&Dropout浅析
        • 7.14.3.2 ​BN层的梯度反向传播计算
        • 7.14.3.3 Batch Size的大小与神经网络的性能
        • 7.14.3.4 标准化和归一化
      • 7.14.4 主成分分析PCA与SVD奇异值分解
        • 7.14.4.1 岭回归 与 PCA
        • 7.14.4.2 PCA原理推导
        • 7.14.4.3 PCA原理新解
        • 7.14.4.4 svd
        • 7.14.4.5 PCA数学原理
      • 7.14.5 正则化
        • 7.14.5.1 L1、L2正则化和过拟合 总结
        • 7.14.5.2 L1 和 L2 正则化的直观解释
      • 7.14.6 SVM
        • 7.14.6.1 从零推导支持向量机(SVM)
        • 7.14.6.2 支持向量机(SVM)介绍
        • 7.14.6.3 SVM推导与实战
        • 7.14.6.4 支持向量机的直观理解
        • 7.14.6.5 浅显易懂的支持向量机SVM
      • 7.14.7 线性回归
      • 7.14.8 逻辑回归
      • 7.14.9 BP算法
        • 7.14.9.1 万能逼近——神经网络拟合任意函数原理
      • 7.14.10 激活与池化
        • 7.14.10.1 激活函数与损失函数 小结
      • 7.14.11 深度学习简述
        • 7.14.11.1 MATLAB2020深度学习实例
      • 7.14.12 损失函数与误差反向传播
        • 7.14.12.1 梯度下降与损失函数
      • 7.14.13 深度学习优化问题
      • 7.14.14 梯度下降法
        • 7.14.14.1 各类梯度下降算法的Python实现
        • 7.14.14.2 梯度下降的直观理解
        • 7.14.14.3 动量、RMSProp、Adam
      • 7.14.15 卷积的概念
        • 7.14.15.1 卷积的矩阵化算法
      • 7.14.16 局部连接
      • 7.14.17 RNN
      • 7.14.18 LSTM
      • 7.14.19 CNN-四大经典CNN技术浅析
      • 7.14.20 熵(Entropy)与交叉熵
      • 7.14.21 softmax函数详解
      • 7.14.22 自编码算法详细理解与代码实现
      • 7.14.23 pytorch
        • 7.14.23.1 ​PyTorch简介
          • 7.14.23.1.1 Pytorch快速入门资料
        • 7.14.23.2 CNN的PyTorch实现
        • 7.14.23.3 pytorch总结
        • 7.14.23.4 PyTorch trick 集锦
        • 7.14.23.5 在PyTorch上加载自定义数据集
        • 7.14.23.6 实战:Pytorch识别验证码
        • 7.14.23.7 实战:Transformer的最简洁pytorch实现
        • 7.14.23.8 使用PyTorch实现神经网络分类
      • 7.14.24 卷积神经网络CNN概述
        • 7.14.24.1 CNN 简易原理
        • 7.14.24.2 卷积神经网络CNN原理详解
        • 7.14.24.3 自己手写一个卷积神经网络
        • 7.14.24.4 CNN反向传播算法
        • 7.14.24.5 卷积计算、作用与思想
        • 7.14.24.6 用卷积神经网络CNN识别手写数字集
        • 7.14.24.7 卷积 池化 参数的计算
        • 7.14.24.8 im2col方法实现卷积算法
        • 7.14.24.9 卷积核的梯度计算
        • 7.14.24.10 卷积层反向传播推导及实现
        • 7.14.24.11 反向传输算法
          • 7.14.24.11.1 resnet残差网络
        • 7.14.24.12 CNN反向传播的MATLAB实现
      • 7.14.25 神经网络的调参技巧
      • 7.14.26 BP神经网络
        • 7.14.26.1 零开始搭建bp神经网络
        • 7.14.26.2 MATLAB自带的bp工具箱
        • 7.14.26.3 神经网络中偏置(bias)的作用
      • 7.14.27 聚类分析 k-means
        • 7.14.27.1 matlab做聚类分析(k-means)
        • 7.14.27.2 聚类模型探讨综述
        • 7.14.27.3 5种经典聚类算法
      • 7.14.28 深度学习的一些概念
      • 7.14.29 人工智能简述:AI的过去和现在
      • 7.14.30 k-NN(k近邻算法)
      • 7.14.31 神经网络中的优化器:BGD、SGD、MBGD、Momentum
      • 7.14.32 卷积神经网络的经典网络总结
        • 7.14.32.1 卷积神经网络中十大拍案叫绝的操作
      • 7.14.33 GAN 对抗样本攻击
      • 7.14.34 蒙特卡洛模拟
      • 7.14.35 dropout与随机部分连接
      • 7.14.36 Jupyter 等 IDE概览
      • 7.14.37 分类算法常用评价指标
      • 7.14.38 Inception 网络与不变性
      • 7.14.39 卷积神经网络的可视化
      • 7.14.40 隐马尔可夫模型HMM
        • 7.14.40.1 马尔科夫链
    • 7.15 MATLAB音频处理
      • 7.15.1 python处理音频信号
    • 7.16 图像处理
      • 7.16.1 图像处理中的指标
    • 7.17 代码集
    • 7.18 论文写作与阅读方法
      • 7.18.1 期刊投稿攻略
      • 7.18.2 论文排版教程
      • 7.18.3 SCI-HUB论文下载技巧
      • 7.18.4 几种论文写作神器,提高写作效率
      • 7.18.5 latex入门
      • 7.18.6 LaTeX教程
    • 7.19 机器学习常用的网站以及资源
      • 7.19.1 很详细的ML&DL学习博客
    • 7.20 SymPy 符号计算基本教程
  • 8 程序设计数学基础
    • 8.1 编程数学基础
      • 8.1.1 概率的历史
      • 8.1.2 概率
        • 8.1.2.1 常见概率分布
          • 8.1.2.1.1 二维正态分布
        • 8.1.2.2 蒙特卡罗方法
        • 8.1.2.3 置信区间
        • 8.1.2.4 协方差与相关系数
      • 8.1.3 矩阵 向量求导法则
      • 8.1.4 雅可比矩阵 海森矩阵
      • 8.1.5 矩阵的几种分解方式
      • 8.1.6 行列式和代数余子式
      • 8.1.7 向量
      • 8.1.8 矩阵的基本运算
      • 8.1.9 矩阵分析
      • 8.1.10 矩阵的LU分解
      • 8.1.11 矩阵奇异值分解(SVD)
        • 8.1.11.1 SVD分解2
        • 8.1.11.2 SVD分解逐步推导
        • 8.1.11.3 奇异值与特征值的意义
      • 8.1.12 随机向量
        • 8.1.12.1 随机过程简述
      • 8.1.13 投影矩阵和最小二乘
      • 8.1.14 知乎数学精选集
        • 8.1.14.1 高数问题集
      • 8.1.15 小波变换
      • 8.1.16 程序设计数学基础1:高等数学
      • 8.1.17 程序设计数学基础2:线性代数
      • 8.1.18 程序设计数学基础3:概率论和数理统计
      • 8.1.19 向量的距离与相似度计算
      • 8.1.20 复数
      • 8.1.21 高等数学——幂级数
      • 8.1.22 无穷小的本质
      • 8.1.23 数列极限和收敛性
      • 8.1.24 不定积分技巧总结
    • 8.2 有趣的数学题目
    • 8.3 高等数学
      • 8.3.1 泰勒级数
  • 9 路径规划与智能算法
    • 9.1 常见路径规划算法简介
    • 9.2 Dijkstra算法详细
  • 10 教学文档
    • 10.1 授课计划
    • 10.2 课程标准
HDB3编解码的仿真实现

                               HDB3码的编译码

1. AMI(Alternative Mark Inversion)码的全称是信号交替反转码,是通信编码中的一种,为极性交替翻转码,1码通常称为传号,0码则叫空号,这是沿用了早期电报通信中的叫法。从形态上看,它已是三状态信号,所以AMI码是伪三进制码。

一、编码规则:

消息代码中的0 传输码中的0

消息代码中的1 传输码中的+1、-1交替

例如:

消息代码:1 0  1  0   1 0 0 0   1 0    1  1   1

AMI码: +1 0 -1 0 +1 0 0 0 -1 0 +1 -1 +1

二、AMI码的特点:

1 由AMI码确定的基带信号中正负脉冲交替,而0电位保持不变;所以由AMI码确定的基带信号无直流分量,且只有很小的低频分量;

2 不易提取定时信号,由于它可能出现长的连0串。

三、解码规则

从收到的符号序列中将所有的-1变换成+1后,就可以得到原消息代码



%测试AMI函数

s=randi([0,1],1,20) %随机生成一个1*20的NRZ码序列s

y=AMI(s)   %调用AMI函数,把s变成ami码


subplot(2,1,1)

stairs(s) , axis([0 L 0 1.2])

subplot(2,1,2)

stairs(y) , axis([0 L -1.2 1.2])



function y=AMI(s)

flag=1;

L=length(s);

for k=1:L

   if s(k)==1

       s(k)=flag;

       flag=-1*flag;

   end

end

y=s;

end





2.HDB3码的编译码原理

HDB3码是AMI码的一种改进型,其目的是为保持AMI码的优点而克服其缺点,使连“0”个数不超过3个。其编码规则如下:
(1)当信码的连“0”个数不超过3时,仍按AMI码的规则编,即传号极性交替;
(2)当连“0”个数超过3个时,则将第的4个“0”改为非“0”脉冲,记为+V或—V称之为破坏脉冲。相邻V码的极性必须交替出现,以确保编好的码中无直流;
(3) 为了便于识别,V码的极性应与前一非“0”码的极性相同,否则,将四连“0”的第一个“0” 更改为与该破坏脉冲相同极性的脉冲,并记为“+B”或“-B”;

破坏脉冲码之后 的传号极性码也要交替。

2.通过仿真验证HDB3码的原理

随机生成一组只包含01的数据(50个数),如上图所示,分别为原码型和HDB3码型,眼图。

数据:

1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0

0 1 1 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 1 1

0 1 1 1 1 1 1 0 0 0


3.分析HDB3码的优缺点

虽然HDB3编码规则比较复杂,但译码却比较简单。从上述原理看出,每一个破坏符号V总是与前一个非“0”符号同样的极性(包括B在内)。这也就是说,从收到的符号序列中可以容易地找到破坏点V,于是也断定V符号及其前面的3 个符号必是连“0”的符号,从而恢复4个连“0”码,再将所有-1变成+1后便等到原信息代码。HDB3码保持了AMI码的优点外还将连“0”码限制在3 个以内,故有利于定时信号的提取。



==========================================


HDB3码的编码和译码

1、实验要求:掌握HDB3码的编码规则,利用MATLAB设计并实现HDB3码的编码和译码。

2、原理简述:





例1:



例2:

 消息代码: 1   0  0   0    0    1 0 0 0   0    1   1     0    0  0    0     1    1

   AMI:    +1   0  0   0    0   -1 0 0 0   0  +1  -1     0    0  0    0   +1   -1

   HDB3:    +1   0  0   0  +V   -1 0 0 0 -V  +1  -1   +B    0  0  +V   -1  +1




简易编码方法:

原理:HDB3码既要包含AMI的交替特性使输出无直流特性,又要不出现四个以上的连0,因此可以先满足后者。

1)把"0000"换为取代节。

规则:先将"0000"分离开来,第一个"0000"直接变为"000V",然后数相邻两个"0000"之间"1"的个数,奇数则变为"000V",偶数则变为" B00V"

2)更新符号。

根据教材有:B总是与其前面的1V符号相反,V总是与前面的1B相符号相同,1总是与前面的VB符号相反,就可以编符号了。

 例如:

消息代码:1 0 0 0  0   1   0 0 0   0   1  1   0  0 0    0   1   1  0 0 0   0    0 0 0    0  1   1   1  0 0 0  0   1

中间码:    1 0 0 0  V   1  0 0 0   V   1  1   B  0 0    V  1   1  B 0 0   V   B 0 0   V  1   1   1  0 0 0  V   1

HDB3码:+10 0 0 +V -1   0 0 0 -V +1 -1 +B  0 0 + V -1 +1 -B 0 0 -V +B 0 0 +V -1 +1 -1  0 0 0  -V +1

 

解码规则:

1)虽然编码很复杂,但解码规则很简单,若3连“0”前后非零脉冲同极性,则将最后一个非零元素译为零,如+1000+1就应该译成“10000”;若2连 “0”前后非零脉冲极性相同,则两零前后都译为零,如-100-1,就应该译为0000.

2)再将所有的-1变换成+1后,就可以得到原消息代码。




注意:本次作业,每道题需要单独提交一个PDF文档。


作业1:HDB3码的编解码。

需要设计3个函数,其中:HDB3CODE( ),调用该函数,如hdb3=HDB3CODE(s),可以把输入的信号s(nrz码)转换为hdb3码;其中HDB3deCODE()函数,调用该函数,如HDB3deCODE(hdb3),可以把输入的hdb3码转换为nrz码;其中AMI( )函数,可以把输入的信号s转换为AMI码。并测试三个函数的性能,并把nrz,ami,hdb3,hdb3解码后的nrz码,分别画出来,效果如下图:



ps:代码框架已经写好,你需要做的,就是把HDB3deCODE()函数里面的?????  地方补上正确的代码。另外,如果对HDB3码的编解码规则还有疑惑,可以自行在百度或者b站查资料学习。


%测试AMI HDB3函数

s_nrz=[1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0  0 0 1 0 1 1 1 ] %随机生成一个NRZ码序列s

s_ami=AMI(s_nrz)                              %调用AMI函数,把NRZ码变成ami码

s_hdb3=HDB3CODE(s_nrz)                %调用HDB3CODE函数,把s变成HDB3码

s_hdb3_nrz=HDB3deCODE(s_hdb3)  %调用HDB3deCODE函数,把HDB3变成NRZ码


subplot(2,2,1),stairs(s_nrz),           grid on,ylim([-1.1 1.1]), title( 'NRZ码' ) ;  %设置title

subplot(2,2,2),stairs(s_ami),          grid on,ylim([-1.1 1.1]), title( 'ami码' ) ;

subplot(2,2,3),stairs(s_hdb3),        grid on,ylim([-1.1 1.1]), title( 'HDB3码' ) ;

subplot(2,2,4),stairs(s_hdb3_nrz), grid on,ylim([-1.1 1.1]), title( 'HDB3解码为NRZ码' ) ;



function hdb3=HDB3CODE(s)

%GDCP,ccl, 20240603

flag=1;

L=length(s);      %测量NRZ码的长度

hdb3=AMI(s);  %把NRZ码通过AMI()函数转换成AMI码,给变量hdb3,注意此时变量hdb3实际上还是ami码

v=1;                  %初始化标识v为+1;

num_zeros=0;   %num_zeros表示连0的个数


   for k=1:L  %遍历数组

       if hdb3(k)==0  %如果数组hdb3当前元素为0,则计数器num_zeros+1

           num_zeros=num_zeros+1;

       else    %如果数组hdb3当前元素不是0,则计数器num_zeros的值归零;

                 % 比方说前面已经有2个0,此时遇见了1,则计数器重新归零,为下一步计算0的个数做准备。

           num_zeros=0;

       end


       if num_zeros==4  %如果目前计数器num_zeros已经累计了4个0

           hdb3(k)=v;   %则当前位置(即这连续4个0中的第4个0)由V替代

           v=-1*v;      %因为v的极性需要正负交替,

           num_zeros=0; %计数器num_zeros归零,重新开始记录下一个4连0的情况。

           try             %一般情况

               if hdb3(k-4)~=hdb3(k)  %如果出现'1000V',而V又和最前那个1的极性不同

                   hdb3(k-3)=hdb3(k); %则改为'1b00v'

                   hdb3(k+1:end)=-1*hdb3(k+1:end); %并且从'1b00v'之后的所有正负1的极性翻转

               end

           catch         %如果数组s的前4个元素就是0,如以'0000'开头的数组,

               if k==4   %则hdb3(k-4)为hdb3(0),显然下标越界,不用写成hdb3(k-4)~=hdb3(k),直接用 if k==4

                   hdb3(k-3)=hdb3(k);  %把'0000'改为'b00v'

                   hdb3(k+1:end)=-hdb3(k-3)*hdb3(k+1:end); %从'b00v'之后的所有正负1的极性翻转

               end


   

           end

   

       end

   end

end



function decode=HDB3deCODE(hdb3)

   L=length(hdb3);

   if L<4    %如果数组长度小于4

       decode=abs(hdb3); %直接把hdb3取绝对值给decode

       return;

   else      %如果长度大于等于4


       for k=4:L    %从hdb3码的第4位开始遍历数组

           if      ?????         %如果出现'1001'或'-100-1'

                   ?????         %则直接把这这4个元素改为'0000'

           elseif  ?????   %如果出现'10001'或'-1000-1'

                      ?????   %则直接把这这5个元素改为'10000'

           end


       end

       decode=abs(hdb3);       %最后把剩余其他码也取绝对值,就得到解码后的decode(nrz)码了

   end

end



function y=AMI(s)

flag=1;      %极性flag初始化为1

L=length(s);

for k=1:L    %遍历数组s(nrz码)

   if s(k)==1  %如果当前元素为1

       s(k)=flag;    %则给当前位置赋予一个极性flag

       flag=-1*flag; %flag反转,以保证下一个极性和当前极性是相反的

   end

end

y=s;

end





作业2:编写一个程序,对AM调制、DSB调制、FM调制进行仿真;

可以设时间为t=0:0.001:30;   要传输的信号频率为1,即s_signa=sin(t);

载波频率为10,即s_carry=sin(10*t);

直流分量a0=2;

调频指数分别设置为k1=2和k2=6,看看两种情况下FM的波形的区别。

最后再把 “信号源,载波,am波,dsb波,fm1,fm2”这6个图按照3行2列的方式绘制出来,效果如下:





作业3:编写函数prime_N求解给定整数N之内的所有素数;

要求:采用主函数与子函数的模式;

子函数is_prime(K)用来判断k是否是素数,如果是,则返回1,否则返回0;

主函数则用来遍历2-N之间的每一个整数,如果该数是素数则记录到数组prime中,并且计数器num加1,最终函数返回记录了N之内的所有素数的数组prime,以及素数的个数num


以下为(1)的提示性代码,供参考;

function [prime,num] = prime_N(N)      %主函数prime_N()

%此函数用于找出给定的N之内的所有素数

函数[prime,num] = prime_N(N) 中,返回的数组prime记录了N之内的所有素数,num记录了N之内的素数的总数。

num=0;           %Num记录发现的素数的个数,初始值为0

   %采用for循环,挨个判断2-N之间的每一个数是否为素数,如果是素数,则计数器num+1,并把该数字添加到数组prime中;

    %注意,判断某个数是否为素数的任务通过调用子函数is_prime() 完成。


end



function y = is_prime(N)                 %子函数is_prime()

  %子函数 is_prime(N) 用于判断给定的数N是否是素数

  %如果给定的N是素数,则返回1,否则返回0


end

调用效果如下:









一、HDB3 码是什么?

HDB3全称(High Density Bipolar of order 3 code,三阶高密度双极性码),HDB3码是对AMI码的一个进阶。

1.编码规则

了解编码规则之前,先了解一下其中的关键名词。

V:破坏脉冲。

B:调节脉冲。

B00V:取代节、破坏节。

再了解随后的编码步骤:

第一步:连0的个数不超过3时,规则与AMI相同,即0不变,1变为-1、+1交替;

第二步:若连0的个数超过3,则将每4个0看作一小节,定义为B00V,B可以是-1、0、+1,V可以是-1、+1;

第三步:B和V具体值满足以下条件:V和前面相邻非0符号极性相同;不看V时极性交替;V与V之间极性交替;

第三步:一般第一个B取0,第一个非0符取-1;

为什么第一个B总是0那?这里可以根据B和V的含义来理解。V(破坏脉冲)的出现将1的交替打乱,并且V的极性也要交替正负。有时这两个条件不能同时满足,就需要B了。B(调节脉冲)应该和1的极性看成一组,保证极性交替正负。而第一个V的极性保持和上一个1的极性相同,不需要B的调节。

再举一个例子,就能更加清楚地明白了。

消息代码:1 0 0 0 0 1 0 0 0 01 1 0 0 0 0 1 1

AMI码: -1 0 0 0 0 +1 0 0 0 0 -1 +1 0 0 0 0 -1 +1

HDB3码:-1 0 0 0 -V +1 0 0 0 +V -1 +1 -B 0 0 -V +1 -1

2.总结经验方法

了解了基本的编码规则,手算的方法有很多, 细心总能得到最后的结果。但是对于机器而言,应该有一种比较简单的方法,下面就介绍一下适合机器的编码方法。

1、源码是1时,暂时不变;

2、连0不超过3个时不变,有4个或以上连0时把每4个0换为取代节,即B00V;

3、确定B是0还是±1:第一个B一般取0,若两个取代节之间1的个数为偶,易推得后者的B一定是±1,此时B和1遵循的规则完全相同,可以直接记为1,即100V;为奇则一定是0,记为0,即000V。

4、统一确定极性:第一个非0符一般取-1,之后,根据前一个非0符极性,V取同,1取反;