香农编码分为五个步骤:

  1. 将信源消息符号按其出现的概率大小依次排列为:

2.  确定满足下列不等式的整数码长

3. 为了编成唯一可译码,计算第i个消息的累加概率

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

5. 取二进制数的小数点后位即为该消息符号的二进制码字

#include <stdio.h>
#include <math.h>
#include <string.h>
int i,j;
int n; // n是信源符号个数
char codeAll[20]; // 计算过程中的编码struct xiangnong {char s[20]; //信源符号的表示形式 a1 a2 a3 ...float p; // 符号概率float pa; // 累积概率float length_f;int length; // 码长char code[20]; // 最终的编码float Hx; // 信源熵 float K; // 平均码长float E; // 效率
} data[20]; // 结构体数组data// 排序算法 将符号概率按从大到小的顺序排列
void sequ(struct xiangnong x[],int n) {struct xiangnong temp;for(i=0; i<n; i++) {for(j=i; j<n; j++) {if(x[i].p<x[j].p) {temp=x[j];x[j]=x[i];x[i]=temp;}}}
}// 计算码长
void countlength(struct xiangnong x[],int n) {for(i=0; i<n; i++) {x[i].length_f=-log(x[i].p)/log(2);if((x[i].length_f-(int)x[i].length_f)>0) {x[i].length=(int)x[i].length_f+1;} else {x[i].length=(int)x[i].length_f;}}
}// 计算累加概率
void countpa(struct xiangnong x[],int n) {float a=0;x[0].pa=0;for(i=0; i<n; i++) {a+=x[i].p;x[i+1].pa=a;}
}// 将累积概率(十进制)转为二进制数,截取码长位 (将累计概率和码长作为参数传入)
void covbit(float d,int lc) {for(j=0; j<lc; j++) {codeAll[j]=(int)(d*2)+48;d=2*d-(int)(d*2);}
}// 计算信源熵
void entropy(struct xiangnong x[],int n) {float h=0;for(i=0; i<n; i++) {h-=x[i].p * (log(x[i].p) / log(2));}x->Hx=h;
}// 计算平均码长
void averageLength(struct xiangnong x[],int n){float l=0;for(i=0; i<n; i++){l += x[i].p * x[i].length;}x->K=(l/1)*(log(2)/log(2));
}// 计算编码效率
void efficiency(struct xiangnong x[]){data->E=data->Hx/float(data->K);
}main() {printf("请输入信源符号的个数:n=");scanf("%d",&n);printf("\n");printf("请输入每个信源符号的表示形式:\n");for(i=0; i<n; i++) {scanf("%s",&data[i].s);}printf("\n");for(i=0; i<n; i++) {printf("p(%s)=",data[i].s);scanf("%f",&data[i].p);}printf("\n");sequ(data,n); // 排序countlength(data,n); // 计算码长countpa(data,n); // 计算累加概率for(i=0; i<n; i++) {covbit(data[i].pa,data[i].length);strcpy(data[i].code,codeAll);}for(i=0; i<n; i++) {printf("p(%s)=%f\t pa=%f\t length=%d\t code=%s\n",data[i].s,data[i].p,data[i].pa,data[i].length,data[i].code);}printf("\n");entropy(data,n);printf("信源熵hx=%f\n",data->Hx);averageLength(data,n);printf("平均码长K=%f\n",data->K);efficiency(data);printf("编码效率E=%f",data->E);
}

香农编码(C语言实现香农编码,并计算信源熵、平均码长、编码效率)相关推荐

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

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

  2. 《信息与编码》考试复习笔记6----第六章连续信源熵和信道容量(考点在连续信道容量)

    系列文章链接目录 一.<信息与编码>考试复习笔记1----第一章概论 二.<信息与编码>考试复习笔记2----第二章离散信息源 三.<信息与编码>考试复习笔记2-- ...

  3. 信息论霍夫曼编码c语言,霍夫曼编码

    <信息论与编码>课程实验报告 姓 名 学 号 单 位 专 业 2014 年 12 月 4 日 实验一 一.实验目的 1.理解信源编码的意义: 2.掌握霍夫曼编码的方法及计算机实现: 二.实 ...

  4. 信息论霍夫曼编码c语言,Huffman 信息论与编码 - 下载 - 搜珍网

    霍夫曼编码/Shiyan4/Shiyan.sln 霍夫曼编码/Shiyan4/Shiyan.suo 霍夫曼编码/Shiyan4/Shiyan.v11.suo 霍夫曼编码/Shiyan4/Shiyan4 ...

  5. golang中base64编码_Go语言教程:Base64编码

    概念简介 Go语言提供内建的 base64 编解码支持. 例程代码 package main // 这个语法引入了 `encoding/base64` 包并使用名称 `b64` // 代替默认的 `b ...

  6. 曼彻斯特编码 c语言,简单的曼彻斯特编码的C语言实现

    使用C语言,实现基本的曼彻斯特编码 简单的曼彻斯特编码的C语言实现 曼彻斯特编码是减小信号交流分量,实现固定信号占空比的基本方法. 用C语言实现如下: #include #define uint8_t ...

  7. 信息论霍夫曼编码c语言,霍夫曼编码C语言

    编译成功 /* Note:Your choice is C IDE */ #include #include #define N 15 #define M 2*N-1 typedef struct { ...

  8. 信息论 输入概率的哈夫曼编码 C语言

    信息论 哈夫曼编码 C语言 哈夫曼编码是一种效率比较高的变长无失真信源编码方法.哈夫曼编码的编码方法,步骤如下: 将信源符号按概率从大到小的顺序排列,为方便起见,令p(a1)>=p(a2)> ...

  9. 霍夫曼编码实验matlab,哈夫曼编码 MATLAB程序

    clc clear fid=fopen( 'C:\Users\yichao\Desktop\新建文本文档.txt');%打开 txt 文件 [zimu]=fscanf(fid, '%c'); %读取二 ...

  10. 香农费诺编码 c语言实现,信息论课程设计(香农、费诺编码)

    <信息论课程设计(香农.费诺编码)>由会员分享,可在线阅读,更多相关<信息论课程设计(香农.费诺编码)(34页珍藏版)>请在人人文库网上搜索. 1.华北科技学院信息论基础课程设 ...

最新文章

  1. 36岁北航校友打造中国自主AI芯片第一股!挖矿起家,6年IPO,市值百亿
  2. Android中Bitmap和Drawable
  3. mysql日期加一天的公式_2020国考行测冲刺指导:数学运算常用公式大盘点
  4. ?Web开发者需要知道的CSS Tricks
  5. 延时消息_Handler的消息延时是怎么实现的
  6. Windows内核函数
  7. POJ3274Gold Balanced Lineup(哈希)
  8. Python datetime astimezone()方法与示例
  9. Hibernate中createCriteria即QBC查询的详细用法 .Hibernate中createCriteria即QBC查询的详细用法 ....
  10. 【语音识别基础】总有一天你会用到,嗯,没有公式~
  11. android+祖玛游戏源码,Flash祖玛游戏源代码
  12. VS提示SurfFeatureDetector不是cv的成员函数 .
  13. 房价增幅或于年底见顶
  14. 安卓手机通电自动开机,自动执行脚本,断电关机,连接电源手机自动开机,断电关机
  15. 松鼠快跑——安徽芜湖“三只松鼠”案例
  16. Android 蓝牙BLE开发详解
  17. 补丁(patch)的制作与应用
  18. 有趣的计算机课的作文,有趣的电脑课作文400字
  19. 麒麟810处理器_华为携7nm麒麟810处理器 剑指高通
  20. jq 隔行变色(横、纵)

热门文章

  1. 20220522Python3.10安装教程
  2. Kotlin 和 Java 中内部类中的 static native 方法(JNI 函数)
  3. 使用tinyxml2将gps经纬度转换为kml和gpx格式文件
  4. HTML 密码加密方法
  5. Scratch(二十七):恐龙飞奔
  6. 主流PCB画图软件的对比区别(AD、Pads、Allegro)
  7. PCB绘图要点QA汇总
  8. 大学四年,看过的优质书籍推荐
  9. 火狐浏览器linux最新版本下载,火狐浏览器Linux最新版下载
  10. 菜鸟html代码在线,html菜鸟教程,HTML新手如何快速入门