一、香农编码的概念

概念:

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

香农编码属于不等长编码,通常将经常出现的消息变成短码,不经常出现的消息编成长码,从而提高通信效率。

二、问题分析

① 由于总是进一取整,香浓编码方法不一定是最佳的。

② 由于第一个消息符号的累加概率总是0,故它对应得分码字总是0、00、000、0……0的式样。

③ 码字集合是唯一的,且为即时码。

④ 先有码长再有码字。

⑤ 对于一些信源,编码效率不高,信源冗余度稍大,因此其实用性受到较大限制。

三、算法实现及流程图

算法基本步骤:

1) 将q个信源符号按概率递减的方式进行排序:P1≥P2≥……Pq。

2) 按式-logP(Si)≤li≤1-logP(Si)(i=1,2,……q),计算出每个信源符号的码长li。

3) 为编成唯一可译码,计算第i个信源符号的累加概率:。

4) 将累加概率Gi用二进制表示。

5) 取Gi对应二进制数的小数点后li位构成该信源符号的二进制码字。

四、运行结果

五、学习心得

香农编码本质上就是一个信源概率组进行一系列的规则运算后得到的二进制数组。

在用C语言编写的香农编码程序中,对于计算编码时用到的各种概率值要有具体的定义,由于进行香农编码时,首先要进行从大到下的概率排序,所以,程序中编辑的降序的部分是必须的,运行结果不仅要求有编码结果,还要有信源熵,平均码长,所以在程序中也应定义这两个值。通过运用香农编码方法进行计算和对香农编码程序的运行,可知,香农编码方法多余度稍大,相较于其他编码方法实用性不大,但香农编码法有重要的理论意义。

package cn.com;

import java.io.Externalizable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Shannon {
/**
* 将概率从大到小排序
* @param p 输入的概率数组
* @return 
*/
public double[] Sort(double[] p){
double[] p1 = new double[p.length];
for(int i = 0; i < p1.length; i++){
p1[i] = p[i];
}
Arrays.sort(p1);
for(int i = 0, j = p.length-1; i < p.length/2; i++, j--){
double temp = p1[i];
p1[i] = p1[j];
p1[j] = temp;
}
return p1;
}

/**
* 验证概率和是否为1,合格为true,否则false
* @param p 输入的概率数组
* @return
*/
public boolean varification(double[] p){
boolean bool = false;
double d = 0;
for(int i = 0; i < p.length; i++){
d+=p[i];
}
if(d - 1.0 < 0.000001){
return true;
}
return bool;
}

/**
* 计算每个信源的码长
* @param p 信源的概率
* @return
*/
public int[] codeLength(double[] p){
int[] Li = new int[p.length];
double temp = 0;
for(int i = 0; i < Li.length; i++){
temp = - (Math.log(p[i]) / Math.log(2.0));
Li[i] = (int)Math.ceil(temp);
}
return Li;
}

/**
* 计算信源的熵
* @param p 信源的概率数组
* @return
*/
public double entropyAll(double[] p){
double H = 0;
for(int i = 0; i < p.length; i++){
H-=(p[i] * (Math.log(p[i]) / Math.log(2.0)));
}

return H;
}

/**
* 计算平均码长
* @param p 信源的概率数组
* @param Li 每个信源的码长数组
* @return
*/
public double averageCodeLength(double[] p, int[] Li){
double n = 0;
for(int i = 0; i < p.length; i++){
n+=p[i] * Li[i];
}

return n;
}

/**
* 计算累加概率
* @param p 信源的概率数组
* @return
*/
public double[] accumulation(double[] p){
double[] q = new double[p.length];
q[0] = 0;

for(int i = 1; i < p.length; i++){
q[i] = q[i-1] + p[i-1];
}
return q;
}

/**
* 计算二进制编码
* @param acl 累加概率数组
* @param cl 每个信源的码长数组
* @return
*/
public int[][] binaryMode(double[] acl, int[] cl){
int[][] c = new int[acl.length][];
for(int i = 0; i < acl.length; i++){
c[i] = new int[cl[i]];
}

double[] a = new double[acl.length+1];
for(int i = 0; i < acl.length; i++){
for(int j = 0; j < cl[i]; j++){
if(j == 0){
a[j] = acl[i] * 2;
}else{
a[j] = a[j-1] * 2;
}
if(a[j] > 1){
c[i][j] = 1;
a[j] = a[j] - 1;
}else{
c[i][j] = 0;
}
}
}

return c;
}

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Shannon t = new Shannon();
System.out.println("输入信源的个数:");
int num = sc.nextInt();
double[] p = new double[num];
System.out.println("输入概率:");
for(int i = 0; i < p.length; i++){
p[i] = sc.nextDouble();
}
if(!t.varification(p)){
System.out.println("输入的概率有误!");
return;
}
double[] q = t.Sort(p);

int[] cl = t.codeLength(p);

double[] acl = t.accumulation(p);
int[][] c = t.binaryMode(acl, cl);
System.out.println("概率              香农编码");
for(int i = 0; i < p.length; i++){
System.out.print(q[i]+"--->");
for(int j = 0; j < cl[i]; j++){
System.out.print(c[i][j]);
}
System.out.println();
}
double avg = t.averageCodeLength(p, cl);
double ea = t.entropyAll(p);
System.out.println("平均码长为:"+avg);
System.out.println("信源的信息熵为:"+ea);
System.out.println("编码效率为"+ea/avg);

}
}

香农编码Shannon相关推荐

  1. 香农编码二叉树c语言,shannon码的编码实验总结.docx

    shannon码的编码实验总结 本科生实验报告 实验课程信息理论与编码 学院名称信息科学与技术学院 专业名称 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇一六年九月----二〇一六年十一月 ...

  2. 香农编码的C++实现及求平均码长和编码效率

    香农编码C++分布实现 编码步骤 香农编码的步骤如下: (1)将信源符号按其出现概率从大到小排序: (2)计算出各概率对应的码字长度: (3)计算累加概率: (4)把各个累加概率由十进制转化为二进制, ...

  3. 信息论与编码|香农编码的Matlab实现

    1. 香农编码原理 (1)将信源消息符号按其出现的概率大小依次降序排列为: (2)对概率向上取整求整数码长K (3)为了编成唯一可译码,计算第i个消息的累加概率P (4)将累加概率转换成二进制数 (5 ...

  4. labview霍夫曼编码_香农编码与霍夫曼编码

    一.香农-范诺编码 香农-范诺(Shannon-Fano)编码的目的是产生具有最小冗余的码词(code word).其基本思想是产生编码长度可变的码词.码词长度可变指的是,被编码的一些消息的符号可以用 ...

  5. 计算信源熵和香农编码C语言,信息论与编码课程设计报告-统计信源熵与香农编码.pdf...

    信息论与编码课程设计报告 设计题目: 统计信源熵与香农编码 专业班级 电 信 12-06 学 号 学生姓名 指导教师 教师评分 2015 年 3 月 30 日 目 录 - 0 - 一.设计任务与要求 ...

  6. 香农编码的 matlab 实现

    close all;clear all;clc; % 香农编码matlab实现 p = [0.5 0.19 0.19 0.07 0.05] %输入概率 n = length(p); y = flipl ...

  7. 信源编码的代码实现 (香农编码、费诺编码、哈夫曼编码、游程编码、算术编码)

    文章目录 香农编码 费诺编码 哈夫曼编码 C++版 C语言版 游程编码 算术编码 香农编码 (1) 将信源消息符号按其出现的概率大小依次排列 p1 ≥ p2 ≥ - ≥ pn (2) 确定满足下列不等 ...

  8. 信息论与编码-python实现三种编码(香农编码,费诺编码,赫夫曼编码)

    香农编码,费诺编码,赫夫曼编码(python实现) 开始参考了网上其他人的代码,但后来都发现要么代码有错误,要么输出结果不符合自己的预期,于是就重新实现了一下,代码仍存在一些小问题,但是能够满足作业要 ...

  9. 香农编码C程序及演示结果

    香农编码 功能简介:首先输入信源符号的个数,然后输入各个信源符号的概率.(概率之和等于1) 主程序 :                                                  ...

  10. 2022P02014139杨智关于香农编码、哈夫曼编码和费诺编码的比较

    注:以下三种编码比较都是在二进制下讨论的,其它进制下的编码情况可以与二进制下的情况类比. 1香农编码 概念: 香农编码是是采用信源符号的累计概率分布函数来分配字码的.香农编码是根据香农第一定理直接得出 ...

最新文章

  1. DL之DCGAN:基于keras框架利用深度卷积对抗网络DCGAN算法对MNIST数据集实现图像生成
  2. struts的国际化
  3. Spring构造方法注入类型歧义
  4. springcloud hystrix概述(一)
  5. 更新jupyter lab
  6. 11 wifi6速率_什么是WiFi 6?究竟有多6?
  7. 链表c++语言 解析,C++ 单链表的基本操作(详解)
  8. centos7 如何安装部署k8s_如何在CentOS 7上正确安装Chromium
  9. 【Excel】数据透视表—标签合并居中
  10. 信息系统项目管理师---综合类计算
  11. 管理“项目”之人际关系篇
  12. 网站的海量数据和高并发的解决方案(二)
  13. mac80端口问题无法使用
  14. 分布式链路监控Zipkin + EKL + RabbitMQ
  15. 【数据结构PTA 7-158-161】
  16. (一)验证微信公众平台
  17. 攻防世界pwn高手进阶(持续更新)
  18. 两种模块化语法(module.exports,exports,require export,import)
  19. 分类:基于规则的分类——RIPPER算法
  20. python英汉互译词典下载_python字典如何实现英汉互译

热门文章

  1. 传感器实验——心率血氧.max30102
  2. unity3D游戏素材素材哪家强?Top3都在这!
  3. Java校招120道面试题目合集
  4. Android性能测试之fps获取
  5. CentOS查找redis配置文件及防火墙相关命令
  6. 网络ip段计算,网络地址计算,广播地址计算,主机号计算规则
  7. Simulink仿真---clark变换、反clark变换
  8. NMF非负矩阵分解算法(Non-negative Matrix Factorization)
  9. 计算机软件产品类退税,软件产品增值税退税政策详解.doc
  10. 下载linux下ahci驱动怎么安装,怎么在u盘pe下给电脑系统安装ahci驱动