Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >香农编码的gui编码_香农编码

香农编码的gui编码_香农编码

作者头像
全栈程序员站长
发布于 2022-11-04 05:08:09
发布于 2022-11-04 05:08:09
1.6K0
举报

大家好,又见面了,我是你们的朋友全栈君。

香农编码

概念:

香农编码是是采用信源符号的累计概率分布函数来分配字码的。香农编码是根据香农第一定理直接得出的,指出了平均码长与信息之间的关系,同时也指出了可以通过编码使平均码长达到极限值。香农第一定理是将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。

香农编码属于不等长编码,通常将经常出现的消息变成短码,不经常出现的消息编成长码,从而提高通信效率。 香农编码严格意义上来说不是最佳码,它是采用信源符号的累计概率分布函数来分配码字。

编码步骤如下:

(1)将信源符号按概率从大到小顺序排列。

(2)计算第i个符号对应的码字的码长(取整);

(3) 计算第i个符号的累加概率 ;

(4)将累加概率变换成二进制小数,取小数点后 位数作为第i个符号的码字。

可以看出,编码所得的码字,没有相同的,所以是非奇异码,也没有一个码字是其他码字的前缀,所以是即时码,也是唯一可译码。

特点:

香农编码的效率不高,实用性不大,但对其他编码方法有很好的理论指导意义。一般情况下,按照香农编码方法编出来的码,其平均码长不是最短的,即不是紧致码(最佳码)。只有当信源符号的概率分布使不等式左边的等号成立时,编码效率才达到最高。

香农编码

1.根据步骤截取核心代码:

将信源符号按概率从大到小顺序排列

计算符号的累加概率,取小数点后特定位数作为第i个符号的码字

将累加概率变换成二进制小数

2.验证编码效率是100%的情况(0.5,0.25,0.125,0.125)

3.事例1(0.25,0.25,0.2,0.15,0.1,0.05)

4.事例2(0.20,0.19,0.18,0.17,0.15,0.10,0.01)做对比(平均码长,编码效率)

代码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

struct Node

{

int num;

double p,pa;

int L;

int x[100];

};

Node box[20];

int M;

double H,L,K;

int exit1,exit2;

void draw()

{

int i,j,k,posx,posy;

cleardevice();

setlinecolor(BLACK);

settextcolor(BLACK);

for(i=1;i<=M;i++){

posx=10;

posy=M*50;

k=50;

for(j=0;j

if(box[i].x[j]==1){

line(posx,posy,posx+k,posy-k);

outtextxy(posx+k/2,posy-k/2+2, _T(“1”));

posx+=k;

posy-=k;

}

else{

line(posx,posy,posx+k,posy);

outtextxy(posx+k/2-4,posy+1, _T(“0”));

posx+=k;

}

k/=1.05;

}

}

}

void initialization()

{

int i,j,k;

initgraph(501,550,SHOWCONSOLE);

setbkcolor(WHITE);

cleardevice();

M=6;

box[0].p=0;

box[1].p=0.25;

box[2].p=0.25;

box[3].p=0.20;

box[4].p=0.15;

box[5].p=0.1;

box[6].p=0.05;

}

void carry()

{

int i,j,k;

initialization();

exit1=0;

while(exit1==0){

for(i=0;i<=M;i++){

box[i].pa=0;

}

for(i=1;i<=M;i++){

box[i].pa=box[i-1].pa+box[i-1].p;

box[i].L=0;

while(box[i].L

box[i].L++;

}

}

H=0;

for(i=1;i<=M;i++){

H-=box[i].p*log(box[i].p)/log(2);

}

L=0;

for(i=1;i<=M;i++){

L+=box[i].p*box[i].L;

}

K=0;

for(i=1;i<=M;i++){

K+=pow(0.5,box[i].L);

}

for(i=1;i<=M;i++){

cout<

cout<

cout<

cout<

for(j=0;j

box[i].pa*=2;

if(box[i].pa>=1){

box[i].x[j]=1;

box[i].pa-=1;

}

else{

box[i].x[j]=0;

}

cout<

}

cout<

}

cout<

cout<

cout<

cout<

if(K<=1)cout<

else cout<

draw();

cout<

_getch();

system(“cls”);

cout<

M=0;

while(M<3||M>10){

cin>>M;

}

cout<

for(i=1;i<=M;i++){

cout<

box[i].p=0;

while(box[i].p<=0||box[i].p>=1){

cin>>box[i].p;

}

}

for(i=0;i

for(j=1;j

if(box[j].p

box[11].p=box[j+1].p;

box[j+1].p=box[j].p;

box[j].p=box[11].p;

}

}

}

system(“cls”);

}

}

int main()

{

carry();

}

演示视频:

接下来这些是信息论的大作业,三种无失真编码,只编了二元码,我要稍微详细说说过程,一般编之前肯定是找算法,概念,再在纸上像大纲一样从头到尾列出实现的或详或略的代码。

香农编码作为最简单的是可以根据老师ppt给的算法直接完成的,包括:概率排序,累加概率,由概率算码字长度,由累加概率编码即可,清晰明白。

如果编多(m)元码,我猜测,由概率算码字长度这一步要将log2为底改成logm为底,由累加概率编码这一步要将乘2取整再剪整数部分改为乘m取整再剪整数部分。

算术编码作为限失真编码,我感觉很像香农编码,如果符号序列因为各种原因未出现某符号,两者才会有区别。

ppt:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月11日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
香农编码,哈夫曼编码与费诺编码的比较[通俗易懂]
概念: 香农编码是是采用信源符号的累计概率分布函数来分配字码的。香农编码是根据香农第一定理直接得出的,指出了平均码长与信息之间的关系,同时也指出了可以通过编码使平均码长达到极限值。香农第一定理是将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。
全栈程序员站长
2022/11/04
6.9K0
香农编码,哈夫曼编码与费诺编码的比较[通俗易懂]
香农编码c++实现_香农费诺编码例子
P(i)=P(i)*2-fix(P(i)*2); %将累加概率转化为L(i)位二进制码字
全栈程序员站长
2022/09/30
5300
对该信源编二进制香农码_编译原理实验一
i P 变换成二进制数; 5. 取 i P 二进制数的小数点后 i K 位即为该消息符号的二进制码字。
全栈程序员站长
2022/10/03
5250
matlab香农编码「建议收藏」
1、读入图像 使用imread()函数读入图像,由于m文件和图像放在同一目录下,故采用相对路径。
全栈程序员站长
2022/10/01
9400
matlab香农编码「建议收藏」
香农编码熵怎么算_香农范诺编码
香农编码是是采用信源符号的累计概率分布函数来分配字码的。香农编码是根据香农第一定理直接得出的,指出了平均码长与信息之间的关系,同时也指出了可以通过编码使平均码长达到极限值。香农第一定理是将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。
全栈程序员站长
2022/09/30
8270
matlab实现香农编码原理_香农编码c语言实现
最近有个实验是用MATLAB实现香农编码的,在网上看到了别人写的程序,大部分都不支持手动输入信源,我自己就加上了几行,能够直接输入信源分布,下面是程序:
全栈程序员站长
2022/10/01
1.1K0
霍夫曼编码详解
在霍夫曼编码算法中, 固定长度的信源输出分组将映射成可变长度的二进制分组。该过程称为定长到变长编码。
timerring
2023/03/01
1.3K0
霍夫曼编码详解
香农编码的matlab实现实验总结_香农编码C语言
信息论与编码实验报告 院系: 哈尔滨理工大学荣成校区 专业: 电子信息工程 学号: 姓名: 日期: 2015 年 6 月 16 日 香农编码 信息论与编码第三次实验报告 一……
全栈程序员站长
2022/09/30
1.3K0
香农编码简单例题_单链表逆序输出c语言
Data.txt中,记事本应与.cpp文件放入同一文件目录下,然后再程序中读取记事本内数据进行香农编码。
全栈程序员站长
2022/10/02
1.6K0
香农编码简单例题_单链表逆序输出c语言
labview霍夫曼编码_香农编码与霍夫曼编码[通俗易懂]
香农-范诺(Shannon-Fano)编码的目的是产生具有最小冗余的码词(code word)。其基本思想是产生编码长度可变的码词。码词长度可变指的是,被编码的一些消息的符号可以用比较短的码词来表示。估计码词长度的准则是符号出现的概率。符号出现的概率越大,其码词的长度越短。
全栈程序员站长
2022/10/03
1.7K0
香农编码的matlab实现总结_matlab简单代码实例
使用MATLAB语言和excel对以下信源进行香农编码,并求出平均码长和编码效率。
全栈程序员站长
2022/09/30
1.2K0
c语言实现香农编码和译码_香农编码码长
为了设计的方便,我们需要在这个程序里设计一个结构体,以用来存储信源符号、信源符号概率等参数,将每一组参数看成一个结构体来看待,这样我们就可以随时地调用。
全栈程序员站长
2022/09/30
7410
c语言实现香农编码和译码_香农编码码长
实验七 香农编码_香农编码效率可以大于1吗
编程,对某一离散无记忆信源实现香农编码,输出消息符号及其对应的码字。 设离散无记忆信源,
全栈程序员站长
2022/09/30
4720
实验七 香农编码_香农编码效率可以大于1吗
香农编码的matlab仿真实现实验报告_香农编码例题
实 验 目 的: 通过该实验,掌握通过计算机实验可变长信源编码方法,进一步熟悉香农编码,费诺编码以及霍夫曼编码方法。
全栈程序员站长
2022/10/03
5660
ECUST 09年 校赛个人赛第三场部分解题报告(A,D,F,I)
首先是VC6.0的algorithm里没有min函数,而我用min做变量名导致CE4次,找了半天才找出来
owent
2018/08/01
3920
哥伦布编码
哥伦布编码解码 UINT GetUeValue(BYTE *pBuff, UINT nLen, UINT &nStartBit) {     //计算0bit的个数     UINT nZeroNum = 0;     while (nStartBit < nLen * 8)     {         if (pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8)))         {             break;         }         nZeroNum++;         nStartBit++;     }     nStartBit ++;     //计算结果     DWORD dwRet = 0;     for (UINT i=0; i<nZeroNum; i++)     {         dwRet <<= 1;         if (pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8)))         {             dwRet += 1;         }         nStartBit++;     }     return (1 << nZeroNum) - 1 + dwRet; } 1. H.264/AVC标准规定了一系列编码方法,用于把符号编码成二进制比特流。这些方法包括: FLC (定长码) ExpG (指数哥伦布码) CAVLC CABAC 位于Slice data级别之上的符号,使用FLC或ExpG编码。 2. ExpG依据变字长编码理论。在变字长编码中,编码器的编码输出码字是长度不等的码字。大概率出现的信息符号,赋以短字长的码字;小概率出现的信息符号,赋以长字长的码字。 ExpG码字的二进制结构如下: [前导零][1][INFO] 码字包含M个前导零(M>=0),         bit 1,         M-bit信息域INFO。 根据输入的参数code_num,ExpG码的编码过程是: M = floor(log2(code_num + 1)) INFO = code_num + 1 - 2^M 相应的,解码过程是: (1) 读取一系列连续的bit 0直到bit 1,记录bit 0的个数(M), (2) 读取bit 1 (3) 读取M-bit = INFO (4) code_num = 2^M + INFO - 1 由此,ExpG的码字长度是2M+1比特。 3. 映射 H.264的语法参数k通过4种方式映射为code_num,然后对code_num使用ExpG编码,生成二进制码字。 4种映射方式: ue 无符号直接映射,code_num = k te 截断映射 se 有符号映射,code_num = 2|k| (k<=0)                code_num = 2|k| - 1 (k>0) me 根据标准中指定的表 4. ExpG解码的实现与优化 以FFMpeg中的get_ue_golomb()函数为例,ExpG的解码算法的优化既考虑运算量又考虑存储空间。 (1) 根据当前二进制ExpG码的比特地址index,读取n-bit的二进制数据到32-bit buf。 buf = swap32(*(uint32_t *)((uint8_t *)bit_stream + (index>>3))) << (index&0x07) swap32()的作用是在按32位读取bit stream时,处理大尾数、小尾数的转换。 -------------------------- | index%8 | buf的有效位n | -------------------------- | 0       | 32-bit       | -------------------------- | 1       | 31-bit       | -------------------------- | 2       | 30-bit       | -------------------------- | 3       | 29-bit       | -------------------------- | 4       | 28-bit       | -------------------------- | 5       | 27-bit       | --------------------------
大黄大黄大黄
2018/09/14
1.1K0
C语言实现学生成绩管理系统(EasyX图形界面)
注意:直接复制代码会无法运行,因为没有资源文件(图片、文本文件),从下面的github链接或交流群中下载代码或注释指定代码,有关此问题,例如:无法运行等,一律不予回复。望周知。(20220611注)
全栈程序员站长
2022/09/06
2.2K1
C语言实现学生成绩管理系统(EasyX图形界面)
C语言实现推箱子小游戏(2)
---- 相关文章——C语言实现推箱子小游戏 ---- 推箱子 编译软件:VS2019 下载:代码文件我已经上传到GitHub 链接 下载最新的那个!(文件夹形式的) 注意: fopen scanf编译器认为的不安全报错 解决:项目属性-C/C+±预处理器-预处理定义-编辑-加入_CRT_SECURE_NO_WARNINGS 图形库函数xxx等问题 解决:项目属性-高级-字符集-使用多字节字符集 图形窗口注意贴图顺序以及参数 文件读取问题——链接 相关有帮助的文章—
半生瓜的blog
2023/05/12
8320
C语言实现推箱子小游戏(2)
c语言奔跑的火柴人游戏源码
#include <iostream> #include <fstream> #include <graphics.h> #include <conio.h> #include <time.h> using namespace std; // 来自公众号:c语言与cpp编程 /******全局变量******/ #define STEPDISTANCE 6 // 一步的距离。数值越大,移动速度越快 #define JUMPSPEED 10 // 数值越小,跳得越远 #define ROLLDIS
C语言与CPP编程
2021/01/02
2.9K0
香农编码和哈夫曼编码_香农编码效率可以大于1吗
S1 将信源符号按照概率大小从大到小排列; S2 把概率最小的两个信源符号分成一组,其中,上面一个编码为0,下面一个编码为1,并将这两个符号的概率加起来,其结果再与尚未处理过的符号重新按照大小排序; S3 重复步骤2,直到所有的信源符号都处理完毕; S4 从右至左按照编码路径返回,即可得到各个码字。
全栈程序员站长
2022/09/30
1.2K0
香农编码和哈夫曼编码_香农编码效率可以大于1吗
推荐阅读
相关推荐
香农编码,哈夫曼编码与费诺编码的比较[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档