哈夫曼信源编码matlab,HomeWork4.m
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相关推荐
- 信源压缩编码 编程c语言,霍夫曼信源编码实验报告.docx
霍夫曼信源编码实验报告.docx PAGE PAGE 7 实验1:霍夫曼信源编码综合设计[实验目的]通过本专题设计,掌握霍夫曼编码的原理和实现方法,并熟悉利用C语言进行程序设计,对典型的文本数据和图像 ...
- 霍夫曼编码实验matlab,哈夫曼编码 MATLAB程序
clc clear fid=fopen( 'C:\Users\yichao\Desktop\新建文本文档.txt');%打开 txt 文件 [zimu]=fscanf(fid, '%c'); %读取二 ...
- matlab完成信源编码译码,matlab哈夫曼译码
Huffman 编码的 matlab 实现 一.信源编码介绍 为了...经典的方法还是仙农编码 法.费诺编码法和霍夫曼...信源编码和译码,而是事先规定一个 译码差错率的...... 2013 Vol ...
- 实验四-哈夫曼编码的MATLAB实现
信息论编码实验3~9连载,更多看专栏. 哈夫曼编码MATLAB实现 一.哈夫曼编码的原理 二.哈夫曼编码的实例 三.代码及运行结果 3.1根据原理自编程序 3.2利用MATLAB内嵌函数 四.程序自评 ...
- MATLAB编程实现哈夫曼编码
用MATLAB编程实现哈夫曼编码 一.实验目的 理解信源编码的意义 熟悉 MATLAB程序设计: 掌握哈夫曼编码的方法及计算机实现 二.实验原理 统计n个信源消息符号,得到n个不同概率的信息符号 将这 ...
- 信息论4—无失真信源编码(非延长码,霍夫曼编码)
无失真信源编码 单义可译码 码字非奇异,码字序列非奇异. 单义可译定理--克拉夫不等式 非延长码(即时码,在无失真信源编码中,常采用此码) 延长码:部分码字是其它码字的前缀.100是10的延长码,01 ...
- 霍夫曼编码代码matlab,matlab 实现霍夫曼编码
编码内容包括:用matlab实现霍夫曼编码,并且求出相应的信源熵,平均码长,和编码效率. 以下是代码: %霍夫曼编码 %huffman_code %编码思路:根据位置矩阵的变化过程反推生成霍夫曼编码 ...
- 信源编码算法(费诺编码哈夫曼编码)
信源编码算法 费诺编码 Fano coding 哈夫曼编码 Huffman coding 费诺编码 编码步骤 将信源符号按照其概率大小,从大到小排列: 将这一组信源符号分成概率之和尽可能接近或者相等的 ...
- Matlab自适应均线_李洋:卡夫曼自适应移动平均线MATLAB代码
SMA:Simple MA 简单平均线 EMA:Exp MA指数平均线 AMA:Adaptive MA 卡夫曼自适应移动平均 算法过程 卡夫曼自适应移动平均算法过程整理 http://www.matl ...
最新文章
- UVa 164 - String Computer
- myeclipse8.6安装svn
- P4249 [WC2007]剪刀石头布(网络流/费用流)
- Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4) 构造
- r语言 C4.5 剪枝是用什么算法_决策树,逻辑回归,PCA算法面经
- windows下安装subversion
- mysql自带的卸数工具_数据库卸数必备工具下载-数据库数据导出工具(DBexport)下载v1.3官方版-西西软件下载...
- 【转载】从Docker容器漏洞谈Docker安全
- android 获取是否连接wifi热点,android - 如何知道您是否已连接到Wifi热点/ Wifi / Wifi Direct - 堆栈内存溢出...
- 人生苦短 我用Python
- 计算机辅助设计cad综述,控制系统计算机辅助设计综述
- Html 解决长串英文字母显示不能自动换行
- LeetCode之Rectangle Overlap(Kotlin)
- android 绘制分割线,Android 布局中分割线创建的三种方式
- 微信群对服务器的要求,微信群运营必看:运营微信群必做的7点要求
- 如何提高自己的 Java 编程技能
- 网站URL网址末尾是否应该使用反斜杠
- 使用 IDEA 远程 Debug 调试
- ORACLE grant用法
- SLAM总结(二)-数学基础之求导和线性方程求解