信息论实验-二元对称信道仿真(C++实现)

2023-05-16

二元对称信道模拟器

实验目的

加深理解二进制对称信道的工作原理,掌握通过高级编程语言生成伪随机数的方法。允许使用编程语言:C,C++等

实验要求

输入:BSC信道的错误概率,任意的二进制序列
输出:经BSC信道传输后的二进制序列

实验内容

二元对称信道定义

2元对称信道信道的转移概率为

P(j|k)={1p,  k=jp,   kj, k,j=0,1,...
p表示错误概率。
如下图所示
二元对称信道
对于二元对称信道DMC,其信道容量为 C=1H(p)

C、C++产生伪随机数原理

C++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-random integral number)。生成随机数时需要我们指定一个种子,如果在程序内循环,那么下一次生成随机数时调用上一次的结果作为种子。但如果分两次执行程序,那么由于种子相同,生成的“随机数”也是相同的。在工程应用时,我们一般将系统当前时间(Unix时间)作为种子,这样生成的随机数更接近于实际意义上的随机数。
rand函数不是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子相同的数调用 rand()会导致相同的随机数序列被生成。
srand((unsigned)time(NULL))则使用系统定时/计数器的值作为随机种子。每个种子对应一组根据算法预先生成的随机数,所以,在相同的平台环境下,不同时间产生的随机数会是不同的,相应的,若将srand(unsigned)time(NULL)改为srand(TP)(TP为任一常量),则无论何时运行、运行多少次得到的“随机数”都会是一组固定的序列,因此srand生成的随机数是伪随机数。
标准库中的两个用于产生随机数的函数srand()和rand().

函数原型:int rand(void)
返回值:返回一个[0, RAND_MAX]间的随机整数
函数原型:void srand(unsigned seed)
输入参数:seedrand()的种子,用来初始化rand()的起始值。

系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始 值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的
所以为了避免上述情况的发生我们通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))来 产生种子。如果仍然觉得时间间隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某个合适的整数。

二元对称信道的仿真实现

程序主函数

int main()
{
    print();
    float P_error;  //错误概率
    Info *root = new Info;
    cout << "!------请输入二元信道的错误概率:-----!" << endl <<"P_error =";
    cin >> P_error;
    getchar();
    getBinaryString(root, P_error);
    putBinaryString(root);
    getchar();
}

程序流程很简单,首先输入二元对称信道的错误概率,然后输入二元序列,最后将通过通道的二元对称序列输出。在输入二元序列的过程我采用链表的形式存储每一个二元码。对应的结构为:

struct Info
{
    unsigned char source;
    unsigned char output;
    struct Info *next;
};

通过链表进行存储,有这样一个好处就是你不需要提前分配空间,程序会判断输入流中是否含有0或1的码,然后对给每一个码动态的分配存储空间,这样既不会造成提前分配很多空间造成空间浪费,也不会因为码字过长造成缓冲区溢出。
输入函数的代码如下

void getBinaryString(Info *root, float P)
{
    unsigned char num;
    Info *node = root;
    Info *before;
    cout << "!-----请输入二元信号序列:------!" << endl << endl;
    num = cin.get();
    srand((unsigned)time(NULL));
    do 
    {
        node->source = num;
        float x;
        x = rand();
        x = x / float(RAND_MAX);
        //cout << x << ' ';
        if (x < P)
        {
            if (num == '0')
            {
                node->output = '1';
            }
            if (num == '1')
            {
                node->output = '0';
            }
        }
        else
        {
            node->output = num;
        }
        num = cin.get();
        node->next = new Info;
        before = node;
        node = node->next;

    } while (num == '0' || num == '1');
    before->next = NULL;
}

输入函数的参数包括错误概率和根节点的地址,程序运行结束将会在根节点后链接读入的二元码信息,并完成通过信道的操作。
输出函数的代码如下

void putBinaryString(Info *root)
{
    Info *node = root;
    cout << endl << "!-------输出的二元序列为:-------!" << endl << endl;
    while (node != NULL)
    {
        cout.put(node->output);
        node = node->next;
    }
    cout << endl << "!-------仿真程序运行结束-------!" << endl << endl;
}

输出函数执行的功能就是将链表中的通过信道后的数据输出。
程序仿真结果如下图所示
error = 0.3
可以看出此次仿真输入的错误概率为0.3,输出序列和输入序列有两个位是不同的,也就是通过信道时受到了干扰。下面我们看两种极端的情况,就能更高的理解二元对称信道的仿真过程了。
error=0
上图是错误概率为0时的仿真结果,可以看出输入的二元字符串和输出的字符串是完全一样的,即通过信道的过程不会发生错误。
error=1
上图是错误概率为1时的结果,可以看出,输入的二元字符串和输入的二元字符正好对应位置相反,及每一位的码字经过信道时都发生了错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信息论实验-二元对称信道仿真(C++实现) 的相关文章

  • MQ与Webservice的区别

    Webservice 和MQ MessageQueue 都是解决跨平台通信的常用手段 xff0c 两者有哪些区别呢 xff1f 个人认为最本质的区别在于 Webservice近乎实时通信 xff0c 而MQ却通常是延时通信 什么意思呢 xf
  • uORB通信机制和添加自己的topics学习笔记

    本文参考 Ubuntu16 04下PX4环境快速搭建及uORB通信机制进行操作 结合网上一篇uROB的介绍PX4 Pixhawk uORB深入理解和应用进行深入的了解 1 简介 uORB Micro Object Request Broke
  • 看到一篇很好的介绍磁力计原理的博客

    详细内容戳这里http blog sina com cn s blog 402c071e0102v8ig html
  • QT工程转换为VS2013项目文件

    xff08 win7系统 xff09 1 点击开始 xff0c 输入cmd xff0c 打开cmd 2 输入cd c apm点击回车键 注 xff1a apm是我的qt的工程文件夹 xff0c 最好放在c盘 xff0c 其他盘转换都不成功
  • C语言:函数返回字符串的四种方法

    转载连接 xff1a 1 https blog csdn net turkeyzhou article details 6104135 comments 2 https www cnblogs com qingergege p 649668
  • C语言:字符串中查找指定字符——strchr()和strrchr()

    参考文章连接 xff1a 1 http c biancheng net cpp html 161 html 2 http c biancheng net cpp html 172 html 1 头文件 xff1a include lt st
  • C语言:整型、浮点型和字符串间转换

    参考文章链接 xff1a 1 http c biancheng net cpp html 1573 html 2 http c biancheng net cpp html 1574 html 1 整型 浮点型 gt 字符串 整数转换为字符
  • 学习贵在坚持!

    最近学习颇为不顺 xff0c 周围都是一些不利的消息 xff0c 有些心灰意冷 可是这不是与我写本文的初衷相悖了么 xff1f 看到了比自己优秀的人干出来辉煌的事情 xff0c 写出来文字优美的文章 xff0c 自己就有相形见绌的自卑感 可
  • Qt中 QString 和int, char等的“相互”转换

    原文链接 xff1a https blog csdn net ei nino article details 7297791 Qt中 int float double转换为QString 有两种方法 1 使用QString number 如
  • 计算器第二版:C语言,VC++6.0

    使用栈实现 xff0c 前缀表达式变后缀表达式的原理 xff0c 但是没有转换 xff0c 是边转换边实现 xff1a include lt stdio h gt include lt stdlib h gt include lt coni
  • 计算器第三版:C语言,递归,VC++6.0

    参考文章 xff1a https blog csdn net u011692041 article details 49796343 https blog csdn net u011692041 article details 497991
  • 计算器第四版:C++,QT

    核心算法和第二版一样 xff1a 头文件 xff1a calculate h ifndef CALCULATE H define CALCULATE H include lt QMainWindow gt include lt QPushB
  • USB协议概念学习

    1 USB总线结构 usb的总线拓扑结构如下所示 xff1a 从USB总线结构可以看出 xff0c 主要由3部分组成 xff1a USB主机 Host USB线缆 USB设备 hub Func等 USB主机 xff1a 一般成为USB Ho
  • 创新工场两道笔试题0919

    题目1 字符串去重 xff0c 老题目 xff0c 只是要求不能开辟新空间用来复制原字符串 思路 xff1a 使用布尔型的简单hash表可以节省空间 xff0c 用来存储字符是否出现的信息 xff0c 刚开始hash表里面都是false x
  • ROS仿真机器人学习笔记二:创建4轮小车模型及相关xraco文件修改

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 例如 xff1a 第一章 Python 机器学习入门之pandas的使用 提示 xff1a 写完文章后 xff0c 目录可以自动生成 x
  • 旧电脑升级Windows11时检查CPU和TPM2.0不满足的解决方案(慎重)

    上个月微软发布了Windows11 22H2正式版 xff0c 不少新电脑也接收到了推送 xff0c 楼主的台式 xff08 i3 8100 军规星H310M xff09 也接收到了推送 xff0c 但是碍于Win11蛋疼的右键和状态栏消息
  • windows下安装docker

    windows下安装docker 0 前置条件 环境说明 xff1a windows11 家庭中文版 开启Hyper V xff08 可以百度如何开启 xff09 如何添加Hyper V 创建hyper txt xff0c 复制如下内容 x
  • STM32CubeMX配置生成FreeRTOS项目

    文章目录 1 安装STM32CubeMX软件1 1 下载安装1 2 安装要用到的芯片软件包 2 配置FreeRTOS项目2 1 创建工程2 2 配置SYS2 3 配置RCC2 4 配置系统运行时钟2 5 配置UART1串口作为调试代码2 6
  • ScrumMaster的教练职责

    ScrumMaster是Scrum团队的敏捷教练 Ken Rubin说 xff0c 类似于运动团队的教练 xff0c ScrumMaster观察团队使用Scrum的过程 xff0c 帮助团队提高工作绩效 教练不是顾问 xff0c 不提供解决
  • Autoware.Auto avp仿真详解

    1 定位 定位节点启动的是 ndt localizer 61 Node package 61 39 ndt nodes 39 executable 61 39 p2d ndt localizer exe 39 namespace 61 39

随机推荐

  • VMware + ubuntu16.04 + ROS kinetic 下配置realsense D435i 遇到的问题

    在配置Realsense D435i 的过程中 xff0c 遇到一个问题 执行 scripts patcg realsebse ubuntu lts sh 下载速度奇慢 10K s左右 而且会在接受到36 的时候不动了 xff0c 等了一晚
  • 白话tensorflow分布式部署和开发

    关于tensorflow的分布式训练和部署 xff0c 官方有个英文的文档介绍 xff0c 但是写的比较简单 xff0c 给的例子也比较简单 xff0c 刚接触分布式深度学习的可能不太容易理解 在网上看到一些资料 xff0c 总感觉说的不够
  • 全息投影技术

    1 概念 全息投影技术 xff08 front projectedholographic display xff09 也称 虚拟成像 技术是利用干涉和衍射原理记录并再现物体真实的 三维 图像的技术 全息投影技术不仅可以产生立体的空中幻像 x
  • Ardupilot飞控添加使用诺瓦泰GPS

    Ardupilot飞控添加使用诺瓦泰双天线GPS航向角的设置 一 添加诺瓦泰GPS heading角数据包解析代码 1 打开libraries AP GPS AP GPS NOVA h xff0c 添加如下代码 xff1a struct P
  • SD标准以及规范

    SD标准及规范 SD应用 SD标准让制造商能生产高性能之产品来提升数百万计消费者的体验 xff0c 包含听音乐 录制视频 摄影 数据储存以及使用移动电话 身为一个产业的标准 xff0c SD标准被用于行动存储产业的多个市场领域中 xff0c
  • 《视觉SLAM十四讲》学习笔记-状态估计问题

    最大后验与似然 经典slam模型可表示为 xff1a x k 61 f x k 1 u k 43 w k z k j 61 h y j x k 43 v
  • 机器人学领域的顶级期刊和会议

    印象中 xff0c 机器人学涉及机械 控制 计算机和电子等领域 xff0c 十足的交叉学科 xff0c 所以涉及到的概念和技术也非常多 因工作关系 xff0c 看了三周的SLAM入门 xff0c 用的是高翔的 视觉SLAM十四讲 这本教材
  • SQL解析过程

    转载自 xff1a http blog aliyun com 733 简介 SQL任务是ODPS中使用最频繁的一类作业 大部分用户开始使用ODPS时要做的第一件事情就是学习怎么写ODPS的SQL ODPS SQL是一种非常灵活的语言 兼容大
  • C++中类所占的内存大小以及成员函数的存储位置

    类所占内存的大小是由成员变量 xff08 静态变量除外 xff09 决定的 xff0c 虚函数指针和虚基类指针也属于数据部分 xff0c 成员函数是不计算在内的 因为在编译器处理后 xff0c 成员变量和成员函数是分离的 成员函数还是以一般
  • 用于异常检测的深度神经网络模型融合

    用于异常检测的深度神经网络模型融合 在当今的数字时代 xff0c 网络安全至关重要 xff0c 因为全球数十亿台计算机通过网络连接 近年来 xff0c 网络攻击的数量大幅增加 因此 xff0c 网络威胁检测旨在通过观察一段时间内的流量数据来
  • STM32CubeIDE构建通用freertos项目(一)

    感慨 本人大约三四年没有碰单片机了 xff0c 遥想当年我还是用的keil工具 有幸以援助的身份介入公司的嵌入式项目 xff0c 结合自身经验讲讲 工作是一个长期的过程 xff0c 开头不注意则会产生蝴蝶效应 xff0c 导致接下来的工作一
  • CMake中CMakeLists文件的编写以及变量打印

    最近在学习PCL xff0c 在Win10下使用VS编写PCL程序 xff0c 配置环境时经常出错 xff0c 踩坑记录详见 xff1a Win10 43 VS2017 43 PCL 1 8 1软件安装 踩坑记录 看到 点云库PCL从入门到
  • 如何离线安装python包

    在我们的日常使用python的过程中 xff0c 通常是通过联网安装相关的依赖包 xff0c 但是有时候会有一些情况是没有网络的 xff0c 但我们又需要安装python的各种包 而包的依赖导致我们很难一个一个地从pypi网站下载whl文件
  • mavros 环境配置注意事项[Resource not found: px4 ROS path ]

    背景 我最近开始使用mavros xff0c 按照官网的教程进行安装 采用二进制的方式安装 xff0c 一切进行的很顺利 xff0c 接下来我就按照PX4官网的去执行一个让无人机自动起飞的例子 xff0c 完全按照官网的代码和配置到最后一步
  • rosdep init ERROR: cannot download default sources list... 解决方法

    问题描述 如标题所示 xff0c 当我们安装好ROS后 xff0c 想要用rosdep初始化时 xff0c 会遇到ERROR cannot download default sources list from https raw githu
  • Linux 运行命令时修改.bashrc并结束命令时恢复原样

    问题来源 我有一个bash程序 xff0c 想要在执行该程序的时候修 bashrc xff0c 然后更新一些环境变量 xff0c 并在结束 ctrl 43 c 的时候再把程序恢复原样 操作如下 xff1a echo 命令把想要增加的内容写入
  • 数字信号处理实验(一)

    实验目的 本次实验目的为 xff1a 在matlab环境下产生几种基本的数字信号 xff0c 并对这些基本的信号进行运算和变换 xff0c 同时利用程序结果对采样定理进行验证 xff0c 深刻理解采样定理 通过自己录制音频信号并对不同的音频
  • 数字图像处理实验(二)

    实验目的 实验一 xff1a 图像增强 了解图像增强的目的及意义 xff0c 加深对图像增强的感性认知 1 掌握直接灰度变换的图像增强方法 2 掌握灰度直方图的概念及其计算方法 3 掌握直方图均衡化合直方图规定化得计算过程 实验二 xff1
  • 信息论实验-信源编码2(Lz编码和算数编码的C++实现)

    上一篇文章给出了Huffman编码和Shannon Fano编码的编码原理以及C 43 43 的程序 xff0c 程序可以用来实现给任意类型的文件进行无损压缩 xff0c 缺点是比较耗时 xff0c 不能作为正常的通用压缩软件来使用 xff
  • 信息论实验-二元对称信道仿真(C++实现)

    二元对称信道模拟器 实验目的 加深理解二进制对称信道的工作原理 xff0c 掌握通过高级编程语言生成伪随机数的方法 允许使用编程语言 xff1a C xff0c C 43 43 等 实验要求 输入 xff1a BSC信道的错误概率 xff0