Visual Studio+C#实现信道与信息率失真函数

1. 要求

设计一款信道与信息率失真函数计算系统,要求如下:

  1. 系统能够通过输入的转移概率矩阵计算对称以及非对称离散无记忆信道的信道容量
  2. 系统能够通过输入的概率分布以及失真矩阵来计算与信息率失真函数有关的相关参数,例如Dmin,R(Dmin),Dmax,R(Dmax),并且能够给出相应的转移概率矩阵
  3. 系统通过多个窗体组合,通过总菜单点击不同选项会进入到相应的计算中
  4. 窗体中应该包括MenuStrip控件,通过控件中的选项进行不同的操作

2. 过程

 1.首先进行窗体的设计,根据要求需要一个菜单窗口以及三个计算分别对应的窗口,为了使得系统更加完整再添加一个登录窗口,所以一共需要5个窗口。

先通过登录窗口登录,其中密码在输入时设置为不可见的:

图1 登录窗体

登录后需要进入菜单界面,其设计如下:

图2 菜单窗体

通过菜单中的按钮进入不同系统,接下来分别是对三个计算系统的设计:

图3 对称离散无记忆信道

图4 准对称离散无记忆信道

图5 信息率失真函数

以上三个计算窗体中都包含输入与输出,矩阵输入都使用RichTextBox控件,信息率失真函数中多了一个概率分布的输入,使用TextBox控件实现即可。除此之外,它们的MenuStrip控件中都包含有运行、清空、返回菜单、退出共四个选项,其中运行选项可以直接通过快捷键F5来实现。

2.窗体都已经设计完毕,接下来是对相关的按钮或者是选项中的事件进行代码编写。以下只给出准离散信道和信息率失真函数的相关代码及说明。

准离散信道:

private void 运行F5ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            int a = richTextBox1.Lines.Length; //行数

            double h = 0; //H(Y|ai)

            char[] sp = new char[3] { ' ', '\t', '\n' };

            string[] str1 = new string[100];

            str1 = richTextBox1.Text.Split(sp);

            int b = str1.Length / a; //列数

            string[,] str2 = new string[a, b];

            double[] tmp = new double[b]; //每一列的和

            string[,] tp = new string[b, a];

            double m = 0;//不止一列的子矩阵的行元素求和

            double z = 0;//只有一列的子矩阵行元素之和乘以列元素之和的对数再求和

            for (int i = 0; i < a; i++)

            {

                for (int j = 0; j < b; j++)

                {

                    str2[i, j] = str1[i * b + j];

                }

            }

            for (int i = 0; i < b; i++)

            {

                tmp[i] = 0;

                for (int j = 0; j < a; j++)

                {

                    tmp[i] += Convert.ToDouble(str2[j, i]);

                }

                if (tmp[i] == tmp[0])

                {

                    m += Convert.ToDouble(str2[0, i]);

                }

                if (tmp[i] != tmp[0])

                {

                    z += Convert.ToDouble(str2[0, i]) * Math.Log(tmp[i], 2);

                }

            }

            for (int i = 0; i < b; i++)

            {

                double p = Convert.ToDouble(str2[0, i]);

                h += p * Math.Log(p, 2);

            }

            double C = Math.Log(a, 2) + h - m * Math.Log(tmp[0], 2) - z;//信道容量

            label3.Text=Convert.ToString(C);

        }

信息率失真函数:

private void 运行ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            int a = richTextBox1.Lines.Length;

            string[] s =textBox1.Text.Split(' ');

            char[] sp = new char[3] { ' ', '\t', '\n' };

            string[] str1 = new string[100];

            str1 = richTextBox1.Text.Split(sp);

            int b = str1.Length /a;

            double h = 0;//H(X)

            double[,] d = new double[a, b];//失真矩阵

            string[,] pmin = new string[a, b];//Dmin时的转移概率矩阵

            string[,] pmax = new string[a, b];//Dmax时的转移概率矩阵

            double[] p=new double[s.Length];//输入概率

            double[] D=new double[b];//满足R(D)=0中D的值

            for (int i = 0; i < p.Length; i++)

            {

                p[i] = Convert.ToDouble(s[i]);

                h +=-p[i]*Math.Log(p[i],2);

            }

           

            for (int i = 0; i < a; i++)

            {

                for (int j = 0; j < b; j++)

                {

                    d[i, j] = Convert.ToDouble(str1[i * b + j]);

                    pmax[i, j] = "0";

                    pmin[i, j] = "0";

                }

            }

            for (int i = 0; i < b; i++)

            {

                D[i] = 0;

                for (int j = 0; j < a; j++)

                {

                    D[i] += p[j] * d[j, i];

                }

            }

            double min = D[0];//所有满足R(D)=0中D的最小值,即Dmax

            for (int i = 0; i < b; i++)

                if (D[i] < min)

                    min = D[i];



            for (int i = 0; i < a; i++)

            {

                for (int j = 0; j < b; j++)

                {

                    if (d[i, j] == 0)

                        pmin[i, j] = "1";

                }

            }

            for (int i = 0; i < b; i++)

            {

                if (D[i] == min)

                {

                    for (int j = 0; j < a; j++)

                        pmax[j, i] = "1";

                    break;

                }

            }

            label4.Text = "Dmin=0,R(Dmin)="+Convert.ToString(h)+",转移概率矩阵为";

            label5.Text="";

            label6.Text="Dmax="+Convert.ToString(min)+",R(Dmax)=0,转移概率矩阵为";

            label7.Text="";

            for (int i = 0; i < a; i++)

            {

                for (int j = 0; j < b; j++)

                {

                    label5.Text += pmin[i, j]+' ';

                    label7.Text += pmax[i, j]+' ';

                }

                label5.Text += '\n';

                label7.Text += '\n';

            }

        }

3.以上实验步骤都完成后,再将每一个窗口中的选项一一实现,其中返回菜单的选项直接再将菜单的窗口调用出来即可如下图3.1所示,注意要使用Show()函数才能够对打开的窗口进行操作。最后再每点击按钮打开一个新窗体的时候要自动关闭旧窗体。

       至此,实验整体设计结束。

3. 测试

       接下来开始对系统进行测试:

登录后进入菜单界面:

图6 菜单界面

点击对称离散无记忆信道进入测试,输入后按下F5运行:

图7 对称离散无记忆信道测试

通过验证,其结果完全正确

此时再点击清空选项发现所有数据都已经清空,可以重新输入。再点击返回菜单选项,系统将会返回菜单。:以下其它两个计算系统的测试中将不再重复该部分功能的测试。

测试准对称离散无记忆信道:

图8 准对称离散无记忆信道测试1

图9 准对称离散无记忆信道测试2

经过验证,两种测试的结果都是正确的,该部分没有问题。

测试信息率失真函数:

图10 信息率失真函数测试1

图11 信息率失真函数测试2

图12 信息率失真函数测试3

依次对上述测试结果进行验证后得知均为正确结果,但是同时也发现,Dmax时的转移概率矩阵可能并不唯一,本程序只给出其中第一个满足条件的结果。

测试完毕,所有要求均已经实现。

4. 总结

在对称和准对称离散无记忆信道的实验中,我只是给出了它们的信道容量,没有进一步给出它们更多的相关属性,而在信息率失真函数的实验中,我给出的结果是Dmin与Dmax两个状态的相应属性,而没有对R(D)这个函数作进一步分析,例如还可以增加R(D)函数的曲线图,然后通过改变参数来进一步增加对比实验进行深入分析。信道容量和信息率失真函数都可以为通信所服务,引入信道容量能够为信道编码服务,提高通信的可靠性,而引入信息率失真函数可以为信源的压缩编码服务,提高通信的有效性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/393756.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【初始RabbitMQ】发布订阅的实现

发布确认原理 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker 就会发送一个确认给生产者(包含消息的…

Java并发之死锁详解

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有限&am…

拿捏c语言指针(中)

前言 书接上回 拿捏c语言指针&#xff08;上&#xff09; 此篇主要讲解的是指针与数组之间的爱恨情仇&#xff0c;跟着我的脚步一起来看看吧~ 创造不易&#xff0c;可以帮忙点点赞吗 如有差错&#xff0c;欢迎指出 理解数组名 数组名是首元素地址 例外 1.sizeof&#xff0…

【SQL注入】小白手把手入门SQL注入1-数据库基础

前言 本文以SQL注入为核心&#xff0c;讲解MySQL数据库的基本知识&#xff0c;和在SQL注入过程中可能会用到的部分重要语法。 什么是数据库 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…

【电路笔记】-感抗

感抗 文章目录 感抗1、概述2、感抗示例13、通过 LR 串联电路的交流电源4、感抗示例25、交流电感器的功率三角形线圈的感抗取决于所施加电压的频率,因为电抗与频率成正比。 1、概述 感抗是电感线圈的一种特性,它抵抗通过它的交流电 (AC) 的变化,类似于电阻中对抗直流电 (DC)…

LCR 127. 跳跃训练【简单】

LCR 127. 跳跃训练 题目描述&#xff1a; 今天的有氧运动训练内容是在一个长条形的平台上跳跃。平台有 num 个小格子&#xff0c;每次可以选择跳 一个格子 或者 两个格子。请返回在训练过程中&#xff0c;学员们共有多少种不同的跳跃方式。 结果可能过大&#xff0c;因此结果…

OpenAI超级视频模型Sora技术报告解读,虚拟世界涌现了

昨天白天&#xff0c;「现实不存在了」开始全网刷屏。 「我们这么快就步入下一个时代了&#xff1f;Sora简直太炸裂了」。 「这就是电影制作的未来」&#xff01; 谷歌的Gemini Pro 1.5还没出几个小时的风头&#xff0c;天一亮&#xff0c;全世界的聚光灯就集中在了OpenAI的So…

php 函数(方法)、日期函数、static关键字

php 函数、日期函数 1. php函数2. 日期函数3. static 1. php函数 函数是一段可重复使用的代码块&#xff0c;可以将一系列操作封装起来&#xff0c;使代码更加模块化、可维护和可重用&#xff0c;来大大节省我们的开发时间和代码量&#xff0c;提高编程效率。 <?php// …

基于SpringBoot+WebSocket+Spring Task的前后端分离外卖项目-订单管理(十七)

订单管理 1. Spring Task1.1 介绍1.2 cron表达式1.3 入门案例1.3.1 Spring Task使用步骤1.3.2 代码开发1.3.3 功能测试 2.订单状态定时处理2.1 需求分析2.2 代码开发2.3 功能测试 3. WebSocket3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功能测试 4. 来单提醒4.1 …

167基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序

基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序&#xff0c;可显示承载能力、压强、刚度及温升等图谱.程序已调通&#xff0c;可直接运行。 167 显示承载能力、压强、刚度及温升 (xiaohongshu.com)https://www.xiaohongshu.com/explore/65d212b200000000…

【uCore 操作系统】1. 应用程序与基本执行环境

文章目录 【 1. 代码框架简述 】1.1 OS 是怎么跑起来的&#xff1f;1.1.1 qemu 的作用1.1.2 rustsbi.bin 的作用 1.2 qemu 是怎么跑起来的&#xff1f;1.3 OS 文件夹1.3.1 kernel.ld1.3.2 entry.S1.3.3 main.c1.3.4 sbi.c 1.4 bootloader 文件夹 【 2. makefile 和 qemu 】2.1 …

测试架构师必备技能 —— Nginx安装部署实战

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的免费开源Web和 反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。在高并发访问的情况下&#xff0c;Nginx是Apache服务器不错的替代品。官网数据显示每秒TPS高达50W左右。本文…

基于51单片机的智能火灾报警系统的设计与实现

摘要:电子科技和城市建设的快速发展,电子设备产品使用频率和城市高层、地下以及大型综合性建筑修建的日益增多,在享受便捷生活的同时火灾隐患大大增加,一旦发生火灾,将带来严重危害。为预防火灾的发生,本文设计开发一种新型便捷智能火灾报警系统,由MCS-51 单片机、烟雾传…

C++学习—单例模式

目录 ​编辑 一&#xff0c;单例模式介绍 二&#xff0c;单例模式下的两种模式 1&#xff0c;饿汉模式 2&#xff0c;懒汉模式 一&#xff0c;单例模式介绍 单例&#xff1a;在全局只有一份实例。 单例模式是编程的经典模式之一。 二&#xff0c;单例模式下的两种模式 1&am…

面试:百度一面,吓尿了

公众号&#xff1a;程序员白特&#xff0c;可加前端技术交流群 前言 这是某211高校软件工程专业的师弟百度一面的题目和回答&#xff0c;全程高能&#xff0c;来看看你会多少~ 宇宙铁律&#xff0c;介绍下自己 还好&#xff0c;之前看到过敖丙大佬面试自我介绍5句话公式 - 掘…

C++6.0

思维导图 .编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a;比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0…

包教包会的Kotlin Flow教程

原文链接 包教包会的Kotlin Flow教程 公众号「稀有猿诉」 Kotlin中的Flow是专门用于处理异步数据流的API&#xff0c;是函数响应式编程范式(Functional Reactive Programming FRP)在Kotlin上的一个实现&#xff0c;并且深度融合了Kotlin的协程。是Kotlin中处理异步数据…

Springboot+vue的物流管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的物流管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的物流管理系统&#xff0c;采用M&#xff08;model&#xff09;…

Unity设备分级策略

Unity设备分级策略 前言 之前自己做的设备分级策略&#xff0c;在此做一个简单的记录和思路分享。希望能给大家带来帮助。 分级策略 根据拟定的评分标准&#xff0c;预生成部分已知机型的分级信息&#xff0c;且保存在包内&#xff1b;如果设备没有被评级过&#xff0c;则优…

四.Linux实用操作 12-14.环境变量文件的上传和下载压缩和解压

目录 四.Linux实用操作 12.环境变量 环境变量 环境变量--PATH $ 符号 自行设置环境变量 自定义环境变量PATH 总结 四.Linux实用操作 13.文件的上传和下载 上传&#xff0c;下载 rz&#xff0c;sz命令 四.Linux实用操作 14.压缩和解压 压缩格式 tar命令 tar命令压缩…