function HomeWork4

clear ;

clc;

close all;

%% 一、信源模块:随机生成字符串

f = fopen('十九大报告.txt','r');

f_char = fread(f,'*char');

fclose(f);

f_char = f_char';

huffman_code_in = f_char;

%% 二、信源编码:哈夫曼信源编码

% 1、输入字符串

x_len=length(huffman_code_in);

x2=huffman_code_in(1);

x2 = [];

for i = 1: x_len % 统计存在什么字符元素

huffman_code_in(i);

if strfind(x2,huffman_code_in(i)); % 判断x2中是否存在元素intput_x(i)

else

x2 = [x2, huffman_code_in(i)]; % 水平拼接x2和intput_x(i)

end

end

% 2、统计元素的概率

x2_len=length(x2); % 统计输入元素个数

N = zeros(1,x2_len); % 统计某元素个数

P = zeros(1,x2_len); % 统计某元素出现的概率

for i=1:x2_len

N(i)=length(find(huffman_code_in==x2(i)));

end

for i=1:x2_len

P(i)=N(i)./x_len;

end

% 3、重排元素,依次合并概率最小的2个元素,直到所有元素都合并完,得到mark矩阵

p=P;

mark=zeros(x2_len-1,x2_len); % mark为n-1行、n列矩阵,记录每行最小两概率叠加后概率排列次序

t=1;

a = zeros(x2_len-1);

for i=1:x2_len-1

[p,num]=sort(p); % 对输入元素排序并记录元素在原数组中的行位置或列位置

if (i~=1)

if (count~=0)

k=max(a(t,:));

for s=count:-1:1

num(k-s)= num(k-s+1); % 若有与新项相等的项,则将新项尽可能排列在其右侧

end

num(k)=1;

end

t=t+1;

end

mark(i,:)=[num(1:x2_len-i+1),zeros(1,i-1)];

p=[p(1)+p(2),p(3:x2_len),1]; % 前两项求和得新项

count=0; % 用于计数,记录与新项相等的元素个数

for j=2:x2_len-i

if (p(1)==p(j)) % 判断p中是否有与求和后的新项相等的项

count=count+1;

a(t,count)=j;

end

end

end

% 4、从最后一级开始向前返回各个信源符号所对应的码元序列,及相应的码字

% 生成一个n-1行、n1(n×n)列矩阵table,每行可看做n个段,

% 每段长为n,记录一个码字(每个码字的长度不会超过n)。

for i=1:x2_len-1

table(i,:)=blanks(x2_len*x2_len);

end

% 计算各个元素码字,循环n-2次,决定矩阵table

% 从倒数第二行开始到第一行的每段的码字值,到编码表格table

table(x2_len-1,x2_len)='1'; % 小值赋1

table(x2_len-1,2*x2_len)='0'; % 大值赋0

for i=2:x2_len-1

table(x2_len-i,1:x2_len-1)...

=table(x2_len-i+1,x2_len*(find(mark(x2_len-i+1,:)==1)) -(x2_len-2):x2_len*(find(mark(x2_len-i+1,:)==1)));

% 按mark的记录依次赋值

table(x2_len-i,x2_len)='1';

table(x2_len-i,x2_len+1:2*x2_len-1)=table(x2_len-i,1:x2_len-1);

table(x2_len-i,2*x2_len)='0';

for j=1:i-1

table(x2_len-i,(j+1)*x2_len+1:(j+2)*x2_len)...

=table(x2_len-i+1,x2_len*(find(mark(x2_len-i+1,:)==j+1)-1)+1:x2_len*find(mark(x2_len-i+1,:)==j+1));

% 按mark的记录依次赋值

end

end

% 5、编码后的码字另存为 W矩阵

W_len = zeros(1,x2_len);

for i=1:x2_len

W(i,1:x2_len)=table(1,x2_len*(find(mark(1,:)==i)-1)+1:find(mark(1,:)==i)*x2_len);

W_len(i)=length(find(abs(W(i,:))~=32));

end

WN = zeros(size(W));

L=sum(P.*W_len); % 计算平均码字长度

HM_H=(sum(-P.*log2(P)))/(log2(2)+eps);% 计算信源熵,2:2进制

V=sum(P.*((W_len-L).^2)); % 计算码字的方差,以判断编码方法的优劣

q=HM_H/L; % 计算编码效率

% 6、哈夫曼信源编码

for i = 1: x2_len

for j = 1: W_len(i)

WN(i,j) = W(i,x2_len-W_len(i)+j);

end

end

WN = WN - '0';

huffman_code_out = [] ;

for i = 1: length(huffman_code_in)

temp1 = find(x2==huffman_code_in(i));

temp2 = WN(temp1,1:W_len(temp1));

huffman_code_out = [huffman_code_out,temp2];

end

%% 三、信道编码(7,4)汉明码信道编码

hanming_code_in = huffman_code_out ;

M_len = length(hanming_code_in);

HM_m = hanming_code_in;

% 补全,长度应为4的倍数

if(mod(length(HM_m),4) ~= 0)

HM_m = [HM_m, zeros(1,4-mod(length(HM_m),4))];

end

HM_m = reshape(HM_m,[4,length(HM_m)/4]);

HM_m = HM_m';

HM_m = rem(HM_m,2);

HM_m0 = [0 0 0 0; 0 0 0 1; 0 0 1 0; 0 0 1 1; % 标准信息序列,从0到15

0 1 0 0; 0 1 0 1; 0 1 1 0; 0 1 1 1;

1 0 0 0; 1 0 0 1; 1 0 1 0; 1 0 1 1;

1 1 0 0; 1 1 0 1; 1 1 1 0; 1 1 1 1];

% (7,4)码编码

HM_H = [ 1 1 1 0 1 0 0; % (7,4)码的监督矩阵

0 1 1 1 0 1 0;

1 1 0 1 0 0 1];

HM_G = gen2par(HM_H); % (7,4)码的生成矩阵

HM_C = HM_m*HM_G; % 编码:未编码前的序列*生成矩阵=编码后的码字序列

HM_C0 = HM_m0*HM_G; % 编码:得到标准码字序列

HM_C = rem(HM_C,2); % 对C模2加,也就是把奇数编码为1,偶数编码为0

HM_C0 = rem(HM_C0,2);

%% 四、高斯白噪声信道

errGL = 0.01; % 设计出错的概率

errNum = round(errGL * length(HM_C(:))); % 得到出错的位数

position=randperm(length(HM_C(:))); % 把1到stateNum的顺序打乱

position=position(1:errNum); % 确定数据不为0的位置

position = sort(position); % 对打乱的顺序重新排序

HM_R = HM_C;

for i = 1:errNum

HM_R(position(i)) = HM_R(position(i)) + 1;% 对相应位置的数据取反,模拟信息出错

end

HM_R = rem(HM_R,2);

%% 五、信道译码:(7,4)汉明码译码

% (7,4)码译码

% 计算校正子

HM_S = HM_R * HM_H'; % 由监督矩阵解码

HM_S = rem(HM_S,2); % 对C模2取余,也就是把奇数编码为1,偶数编码为0

HM_Y = HM_R;

for i = 1: length(HM_S) % 轮询校验子

for j = 1: length(HM_H)

if HM_S(i,:) == HM_H(:,j)' % 校验子与监督矩阵的每一列进行比对

HM_Y(i,j) = HM_Y(i,j) + 1; % 矫正接收序列

HM_Y(i,j) = rem(HM_Y(i,j),2);

end

end

end

hanming_code_out = zeros(size(HM_m));

for i = 1: size(HM_Y,1)

for j = 1: length(HM_C0)

if HM_Y(i,:) == HM_C0(j,:) % 与标准表进行比对,对码字解码

hanming_code_out(i,:) = HM_m0(j,:);

end

end

end

hanming_code_out = hanming_code_out';

hanming_code_out = hanming_code_out(:)';

hanming_code_out = hanming_code_out(1:M_len);

%% 六、信源译码:哈夫曼译码

huffman_decode_in = hanming_code_out;

huffman_decode_out = [];

while ~isempty(huffman_decode_in)

t = x2_len * ones(1,x2_len);

for i = 1: size(WN,1) % 统计每一个字符元素第一次出现的位置

temp = strfind(huffman_decode_in, WN(i,1:W_len(i)));

if ~isempty(temp)

t(i) = temp(1);

end

end

[minr,min_index] = min(t); % 第一次出现位置最早,则译码为该元素

huffman_decode_out = [huffman_decode_out,x2(min_index)];

huffman_decode_in = huffman_decode_in(W_len(min_index)+1:end);

end

%% 七、新宿模块:统计并打印输出结果

% 统计噪声信道造成的误比特率

err1 = rem(HM_C-HM_R,2);

err1 = length(find(err1~=0)) / length(HM_C(:));

% 统计汉明码信道译码之后的误比特率

err2 = rem(HM_C-HM_Y,2);

err2 = length(find(err2~=0)) / length(HM_C(:));

% 统计汉明码信道译码之后的误码率

err3 = rem(hanming_code_in-hanming_code_out,2);

err3 = length(find(err3~=0)) / length(hanming_code_in(:));

% 如果译码的位数不一样,进行截断处理

if length(huffman_code_in) > length(huffman_decode_out)

huffman_code_in = huffman_code_in(1:length(huffman_decode_out));

elseif length(huffman_code_in) < length(huffman_decode_out)

huffman_decode_out = huffman_decode_out(1:length(huffman_code_in));

end

% 统计huffman信源译码之后的误码率

err4 = huffman_code_in - huffman_decode_out;

err4 = length(find(err4~=0)) / length(huffman_code_in(:));

star = size(W,2) - W_len;

W = W(:,star:end);

fprintf('0、信源符号经哈夫曼编码后:\n');

for i = 1: length(x2)

fprintf('%d\t%s(%2.3f%%):\t%s\n',i,x2(i),P(i)*100,W(i,:))

end

fprintf('\n1、huffman信源编码前字符串\n%s\n',huffman_code_in);

fprintf('2、huffman信源译码后字符串\n%s\n',huffman_decode_out);

fprintf('3、汉明码信道编码前比特流\n\t')

fprintf('%d',hanming_code_in)

fprintf('\n4、汉明码信道译码后比特流\n\t')

fprintf('%d',hanming_code_out)

fprintf('\n\n5、huffman信源编码平均码字长度L:\t\t%2.3f\n',L)

fprintf('6、huffman信源编码所得码字W的方差V:\t%2.3f\n',V)

fprintf('7、huffman信源编码的编码效率q:\t\t%2.3f\n',q)

fprintf('8、huffman信源译码之后的误码率:\t\t%2.3f%%\n\n',err4*100)

fprintf('9、噪声信道造成的误比特率:\t\t\t%2.3f%%\n',err1*100)

fprintf('10、汉明码信道译码之后的误比特率:\t\t%2.3f%%\n',err2*100)

fprintf('11、汉明码信道译码之后的误码率:\t\t%2.3f%%\n',err3*100)

一键复制

编辑

Web IDE

原始数据

按行查看

历史

哈夫曼信源编码matlab,HomeWork4.m相关推荐

  1. 信源压缩编码 编程c语言,霍夫曼信源编码实验报告.docx

    霍夫曼信源编码实验报告.docx PAGE PAGE 7 实验1:霍夫曼信源编码综合设计[实验目的]通过本专题设计,掌握霍夫曼编码的原理和实现方法,并熟悉利用C语言进行程序设计,对典型的文本数据和图像 ...

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

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

  3. matlab完成信源编码译码,matlab哈夫曼译码

    Huffman 编码的 matlab 实现 一.信源编码介绍 为了...经典的方法还是仙农编码 法.费诺编码法和霍夫曼...信源编码和译码,而是事先规定一个 译码差错率的...... 2013 Vol ...

  4. 实验四-哈夫曼编码的MATLAB实现

    信息论编码实验3~9连载,更多看专栏. 哈夫曼编码MATLAB实现 一.哈夫曼编码的原理 二.哈夫曼编码的实例 三.代码及运行结果 3.1根据原理自编程序 3.2利用MATLAB内嵌函数 四.程序自评 ...

  5. MATLAB编程实现哈夫曼编码

    用MATLAB编程实现哈夫曼编码 一.实验目的 理解信源编码的意义 熟悉 MATLAB程序设计: 掌握哈夫曼编码的方法及计算机实现 二.实验原理 统计n个信源消息符号,得到n个不同概率的信息符号 将这 ...

  6. 信息论4—无失真信源编码(非延长码,霍夫曼编码)

    无失真信源编码 单义可译码 码字非奇异,码字序列非奇异. 单义可译定理--克拉夫不等式 非延长码(即时码,在无失真信源编码中,常采用此码) 延长码:部分码字是其它码字的前缀.100是10的延长码,01 ...

  7. 霍夫曼编码代码matlab,matlab 实现霍夫曼编码

    编码内容包括:用matlab实现霍夫曼编码,并且求出相应的信源熵,平均码长,和编码效率. 以下是代码: %霍夫曼编码 %huffman_code %编码思路:根据位置矩阵的变化过程反推生成霍夫曼编码 ...

  8. 信源编码算法(费诺编码哈夫曼编码)

    信源编码算法 费诺编码 Fano coding 哈夫曼编码 Huffman coding 费诺编码 编码步骤 将信源符号按照其概率大小,从大到小排列: 将这一组信源符号分成概率之和尽可能接近或者相等的 ...

  9. Matlab自适应均线_李洋:卡夫曼自适应移动平均线MATLAB代码

    SMA:Simple MA 简单平均线 EMA:Exp MA指数平均线 AMA:Adaptive MA 卡夫曼自适应移动平均 算法过程 卡夫曼自适应移动平均算法过程整理 http://www.matl ...

最新文章

  1. UVa 164 - String Computer
  2. myeclipse8.6安装svn
  3. P4249 [WC2007]剪刀石头布(网络流/费用流)
  4. Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4) 构造
  5. r语言 C4.5 剪枝是用什么算法_决策树,逻辑回归,PCA算法面经
  6. windows下安装subversion
  7. mysql自带的卸数工具_数据库卸数必备工具下载-数据库数据导出工具(DBexport)下载v1.3官方版-西西软件下载...
  8. 【转载】从Docker容器漏洞谈Docker安全
  9. android 获取是否连接wifi热点,android - 如何知道您是否已连接到Wifi热点/ Wifi / Wifi Direct - 堆栈内存溢出...
  10. 人生苦短 我用Python
  11. 计算机辅助设计cad综述,控制系统计算机辅助设计综述
  12. Html 解决长串英文字母显示不能自动换行
  13. LeetCode之Rectangle Overlap(Kotlin)
  14. android 绘制分割线,Android 布局中分割线创建的三种方式
  15. 微信群对服务器的要求,微信群运营必看:运营微信群必做的7点要求
  16. 如何提高自己的 Java 编程技能
  17. 网站URL网址末尾是否应该使用反斜杠
  18. 使用 IDEA 远程 Debug 调试
  19. ORACLE grant用法
  20. SLAM总结(二)-数学基础之求导和线性方程求解

热门文章

  1. 因为现在的手机大部分都不能换电池,是不是手机使用1至2年就需要更换了?...
  2. 超准的普通话水平测试,敢不敢进来做一下!
  3. 无法定位程序输入点于动态链接库
  4. USB Network Native Driver for ESXi更新到支持ESXi7.0.1
  5. MATLAB Jacobi迭代法 求解线性方程组
  6. APM32F030多通道ADC采样
  7. Promise及其应用
  8. 《游戏机制——高级游戏设计技术》一2.4 渐进型游戏
  9. bugkuctf 游戏通关玄学式速通
  10. php加波浪线不解析,给文字加波浪线效果