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

news2024/11/29 0:45:45

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)函数的曲线图,然后通过改变参数来进一步增加对比实验进行深入分析。信道容量和信息率失真函数都可以为通信所服务,引入信道容量能够为信道编码服务,提高通信的可靠性,而引入信息率失真函数可以为信源的压缩编码服务,提高通信的有效性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教程】详解相机模型与坐标转换

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 由于复制过来&#xff0c;如果有格式问题&#xff0c;推荐大家直接去我原网站上查看&#xff1a; 相机模型与坐标转换 - 生活大爆炸 目录 经纬度坐标系 转 地球直角坐标系大地直角坐标系 转 经纬度坐标系地理坐标…

⭐北邮复试刷题589. N 叉树的前序遍历__DFS (力扣每日一题)

589. N 叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,…

【明道云】如何实现循环处理

【背景】 发现明道云工作流中并没有直接的循环逻辑模块&#xff0c;那么如何实现循环呢&#xff1f; 【方案】 通过主流程获取多条数据&#xff0c;搭配子流程来实现遍历循环效果。子流程中可以直接感应获取单行数据。 如果直接在主流程中通过直接获取方式获取多条数据&…

Linux 进程详解

目录 一、进程创建 二、进程API 1. 进程创建 fork() 2. 等待 wait() 3.执行 exec() 3.1 execlp函数 3.2 execl函数 三、其他API 一、进程创建 上文讲述了进程的概念&#xff0c;现在大家对于进程的定义已经有所了解了&#xff0c;本文主要介绍一下进程的基本信息&a…

Java基于微信小程序的乐室预约小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

15.隐式转换函数的封装

目录 概述实践代码测试 结束 概述 隐式转换函数 类似 java 中的切面编程&#xff0c;对原有类功能做增加。 实践 代码 封装代码如下 package com.fun.scala.demoimport java.io.File/*** 类似java切面的东东*/ object ImplicitAspect {implicit def man2SuperMan(man: Man):…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十二章 常用工具函数 (Utils配置)

前言 在项目开发中&#xff0c;我们经常会使用一些工具函数&#xff0c;也经常会用到例如loadsh等工具库&#xff0c;但是这些工具库的体积往往比较大&#xff0c;如果项目本身已经引入了这些工具库&#xff0c;那么我们就没有必要再引入一次&#xff0c;所以我们需要自己封装…

计算机网络基础入门指南

文章目录 网络分层模型OSI七层模型及其作用TCP/IP四层模型及作用为什么网络需要分层&#xff1f; 常见的网络协议应用层常见的协议传输层常见的协议网络层常见协议 从输入URL到页面展示的过程HTTP常见的状态码HTTP与HTTPS的区别HTTP是不保存状态的协议&#xff0c;如何保存用户…

DoRA(权重分解低秩适应):一种新颖的模型微调方法

来自&#xff1a;小互 DoRA&#xff08;权重分解低秩适应&#xff09;&#xff1a;一种新颖的模型微调方法 DoRA在LoRA的基础上进一步发展&#xff0c;通过将预训练权重分解为“幅度”和“方向”两个部分进行微调。 这种权重分解方法允许DoRA更精细地控制模型的学习过程&…

腾讯云助力酒店IT系统上云,实现出海业务的双重优势

潮起潮涌&#xff0c;随着时代浪潮的翻涌&#xff0c;生活处处可见是巨大的变化&#xff0c;衣食住行都有了更多更大的需求&#xff0c;出门旅游观赏当地风景品尝特色美食的前提是要住好&#xff0c;只有休息好了才有更多的精力去游玩。酒店系统的升级上云让登记变得更加便捷&a…

MAC电脑系统清理空间免费版软件CleanMyMac X2024

大家好&#xff0c;我是那个总是被苹果电脑“内存已满”提示搞得焦头烂额的专业博主。如果你也像我一样&#xff0c;在使用Mac时经常遭遇卡顿、慢吞吞的情况&#xff0c;那么今天的Mac清理空间妙招分享绝对适合你&#xff01; CleanMyMac X全新版下载如下: https://wm.makedi…

JVS智能BI的ETL数据集实践:数据自动化分析的秘诀

数据集是JVS-智能BI中承载数据、使用数据、管理数据的基础&#xff0c;同样也是构建数据分析的基础。可以通俗地将其理解为数据库中的普通的表&#xff0c;它来源于智能的ETL数据加工工具&#xff0c;可以将数据集进行分析图表、统计报表、数字大屏、数据服务等制作。 数据集管…

C++中对变量进行初始化的3种方法

1.用""&#xff1a;copy initialization&#xff0c;这种初始化形式是从C继承的。此种方式(拷贝初始化)的初始化在现代C中已不再受欢迎&#xff0c;因为对于某些复杂类型来说&#xff0c;此种方式初始化的效率低于其它形式的初始化。 每当隐式拷贝或转换值时&a…

【c语言】c语言转义字符详解

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

如何将OpenAI Sora生成的普通AI视频转化为Vision Pro的空间视频,沉浸式体验

【基于AI的Vision Pro空间视频】工作流:这个工作流程用于将2D视频转换为适用于 Vision Pro的Spatial视频: 1、使用Deep3D将2D视频转换为3D SBS: 使用Deep3D工具将2D视频转换为3D SBS格式: 转换例子:Prediction– lucataco/deep3d – Replicatehttps://replicate.com/…

文件上传之大文件分块上传之断点续传操作

断点续传概念&#xff1a; 断点续传是一种网络的传输机制&#xff0c;用于在文件传输过程中出现中断或错误时&#xff0c;能够恢复传输而不必重新开始&#xff0c;它解决了网络不稳定连续中断或大文件传输时时间过长等问题。提高了文件传输时可靠和效率性。 断点续传需求&…

浅谈js事件机制

事件是什么&#xff1f;事件模型&#xff1f; 原始事件模型&#xff08;DOM0级&#xff09; HTML代码中指定属性值&#xff1a;在js代码中指定属性值&#xff1a;优点&#xff1a;缺点&#xff1a; IE 事件模型DOM2事件模型 对事件循环的理解 宏任务&#xff08;Macrotasks&…

【Linux】软件包管理器 yum | vim编辑器

前言: 软件包管理器 yum和vim编辑器讲解 文章目录 软件包管理器 yum编辑器-vim四种模式普通模式批量化注释和批量化去注释末行模式临时文件 软件包管理器 yum yum&#xff08;Yellowdog Updater, Modified&#xff09;是一个在基于 RPM&#xff08;管理软件包的格式和工具集合&…

电影《社交网络》带来的深层次的思考

《社交网络》是由大卫芬奇执导&#xff0c;杰西艾森伯格、安德鲁加菲尔德、贾斯汀汀布莱克等主演的剧情片&#xff0c;于2010年10月8日在美国上映。该片讲述了马克扎克伯格和埃德华多萨瓦林两人如何建立和发展Facebook的故事。 学习关键点&#xff1a; 创业精神&#xff1a;电…

C++opencv图像算数操作-加减乘除

quick_opencv.h #include<opencv2\opencv.hpp> using namespace cv; class QuickDemo{public:void operators_demo(Mat &image);//图像算数操作 };QuickDemo.cpp #include<quick_opencv.h>//图像算数操作 void QuickDemo::operators_demo(Mat &image) {M…