Matlab函数实现哈夫曼编码算法讲解

合集下载

matlab 霍夫曼编码

matlab 霍夫曼编码

matlab 霍夫曼编码一、背景介绍二、霍夫曼编码原理三、matlab实现霍夫曼编码1. 建立霍夫曼树2. 构建编码表3. 压缩文件4. 解压文件四、应用举例一、背景介绍在信息传输和存储中,数据的压缩是一个重要的问题。

其中,霍夫曼编码是一种常用的无损压缩算法,通过对不同字符出现频率进行编码,可以将数据压缩到较小的空间中。

在matlab中,可以通过代码实现对数据的霍夫曼编码。

二、霍夫曼编码原理1. 需要进行压缩的数据由若干个字符组成。

2. 统计每个字符出现的频率,并根据频率构建霍夫曼树。

3. 根据霍夫曼树构建每个字符对应的编码表。

4. 将原始数据中每个字符按照对应的编码表进行编码,并将所有编码拼接为一个字符串。

5. 将字符串转换为二进制数列,并将其写入文件中。

解压时,需要读取二进制数列,并按照相应的编码表进行解码还原原始数据。

三、matlab实现霍夫曼编码1. 建立霍夫曼树在matlab中,可以通过以下代码实现霍夫曼树的构建:```matlabfunction [T, f] = huffmantree(p)n = length(p);f = p;T = zeros(n-1, 3);for i=1:n-1[f, j] = sort(f);T(i, 1:2) = j(1:2);T(i, 3) = f(1) + f(2);f(2) = T(i, 3);end```其中,p为每个字符出现的频率,n为字符数。

函数返回的T为霍夫曼树的结构矩阵,f为每个节点的权值。

2. 构建编码表在得到霍夫曼树之后,可以通过以下代码构建每个字符对应的编码表:```matlabfunction codebook(T)n = size(T, 1) + 1;codebook = cell(n, 2);for i=1:ncodebook{i, 1} = i;endfor i=1:n-1j = T(i, 1:2);for k=1:length(j)codebook{j(k), 2}=[codebook{j(k), 2},num2str(mod(k-1,2))]; if ~isempty(codebook{j(k), 2})codebook{j(k), 3}=[codebook{j(k), 3},i];elsecodebook{j(k), 3}=i;endendend```其中,codebook为编码表,第一列为字符编号,第二列为对应的编码。

matlab课程设计哈夫曼树

matlab课程设计哈夫曼树

matlab课程设计哈夫曼树一、教学目标本节课的学习目标包括知识目标、技能目标和情感态度价值观目标。

知识目标要求学生掌握哈夫曼编码的基本原理和方法,了解哈夫曼树的结构和性质。

技能目标要求学生能够运用MATLAB软件构建哈夫曼树,并实现字符编码。

情感态度价值观目标培养学生对信息编码技术的兴趣,提高学生的问题解决能力和创新意识。

二、教学内容本节课的教学内容主要包括哈夫曼编码的基本原理、哈夫曼树的结构和性质,以及MATLAB软件在哈夫曼编码中的应用。

首先,介绍哈夫曼编码的原理和方法,让学生了解编码的基本概念。

然后,通过讲解和示例,引导学生理解哈夫曼树的结构和性质。

最后,利用MATLAB软件,让学生动手实践构建哈夫曼树,并实现字符编码。

三、教学方法为了激发学生的学习兴趣和主动性,本节课采用多种教学方法。

首先,通过讲授法,向学生传授哈夫曼编码的基本原理和方法。

其次,利用讨论法,让学生分组讨论哈夫曼树的性质,促进学生之间的交流和合作。

再次,运用案例分析法,通过分析实际案例,让学生更好地理解哈夫曼编码的应用。

最后,采用实验法,让学生亲自动手操作MATLAB软件,构建哈夫曼树并实现字符编码。

四、教学资源为了支持教学内容和教学方法的实施,本节课准备了一系列教学资源。

教材《数据结构与算法》提供了关于哈夫曼编码的基本原理和算法的介绍。

参考书《MATLAB编程与应用》为学生提供了MATLAB软件的使用方法和实例。

多媒体资料包括PPT课件和视频教程,用于辅助讲解和演示。

实验设备包括计算机和MATLAB软件,为学生提供动手实践的机会。

这些教学资源将丰富学生的学习体验,帮助学生更好地理解和掌握哈夫曼编码技术和MATLAB软件的应用。

五、教学评估本节课的评估方式包括平时表现、作业和考试。

平时表现通过课堂参与、提问和小组讨论等方式评估。

作业包括编程练习和理论题目,以检验学生对哈夫曼编码和MATLAB应用的理解。

考试则全面考察学生对课程内容的掌握,包括理论知识和实践操作。

编写matlab函数实现huffman编码的算法

编写matlab函数实现huffman编码的算法
1 i N , Ri 被称为量化间隔,且在每个区域内选择一个点作量化级数。这样落
在区域内的随机变量的所有值都被量化为第 i 个量化级数,用 X i 来表示,这就意 味着:
x Ri ( x) xi
显而易见,这类量化引入了失真,其均方误差为:
d i 1 ( x xi ) 2 f x( x)dx

这称为 Kraft 不等式。
q
i 1
r li 1
(8)
由上式可知,给定 r 和 q,只要允许码字长度可以足够长,则码长总可以满 足 Kraft 不等式而得到即时码,Kraft 不等式指出了即时码的码长必须满足的条 件。后来 McMillan 证明对于唯一可译码得码长也必须满足此不等式。在码长的 选择上唯一可译码并不比即时码有更宽松的条件。对于唯一可译码,该不等式又 称为 McMillan 不等式。 唯一可译码存在的充要条件是:
展信源进行编码, 当 N 趋向于无穷时, 平均码长可以趋进该极限值。 还可以证明, 如果我们不确切知道信源的概率分布,我们用估计的概率分布去进行编码时,平 均码长会加长,但是如果估计的偏差不大的话,平均码长也不会增加太多。 2.4 无失真编码算法 2.4.1 无失真信源编码定理 设单符号、离散、无记忆信源的熵为 H(S),若用二进制码对其做变字长、非 续长编码,一定可以找到一种编码方式,其平均码长满足:

q
i 1
r li 1
(9)
其中 r 为码符号个数,为码字长度,q 为信源符号个数 无失真变长信源编码定理 离散无记忆信源 S 的 N 次扩展信源 S N ,其熵为 H (S N ) ,并且编码器的码元 符号集为 A : {a1 , a2 ,..., aq } 对信源 S N 进行编码,总可以找到一种编码方法,构成唯 一可译码,使信源 S 中每个符号 Si 所需要的平均码长满足

Matlab函数实现哈夫曼编码算法讲解

Matlab函数实现哈夫曼编码算法讲解

------------------------------------------------------------精品文档--------------------------------------------------------函数实现哈夫曼编码的算法编写Matlab 设计目的和意义一、在数字信号的处理和传数字信号充斥着各个角落。

在当今信息化时代,一个信源编码的好坏优劣直接影响到了信源编码是首先遇到的问题,输中,成为了大如何使编码的效率最高,后面的处理和传输。

如何无失真地编码,家研究的对象。

它由哈夫曼编码是一种变长的编码方案。

哈夫曼编码就是其中的一种,码元内容为到根结点的路径中与父结点的最优二叉树既哈夫曼树得到编码,可以根所以哈夫曼在编码在数字通信中有着重要的意义。

左右子树的标识。

既实现了信源的无失真地据信源符号的使用概率的高低来确定码元的长度。

编码,又使得编码的效率最高。

设计原理二、哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。

uffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman 编码。

而哈夫曼编码的第一步工作就是构造哈夫曼树。

哈夫曼二叉树的构造方法原则如下,假设有n个权值,则构造出的哈夫曼树有n个叶子结点。

n个权值分别设为w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;从森林中删除选取的两棵树,并将新树加入森林;(3).步,直到森林中只剩一棵树为止,该树即为所求得的哈(3)(2)(4)、重复夫曼树。

具体过程如下图1产所示:(例)图1 哈夫曼树构建过程哈夫曼树构造成功后,就可以根据哈夫曼树对信源符号进行哈夫曼编码。

matlab霍夫曼编码函数

matlab霍夫曼编码函数

matlab霍夫曼编码函数Matlab是一个广泛应用于科学计算和工程领域的高级计算机语言和环境。

它提供了各种函数和工具箱,可用于解决各种数学问题和实现不同的算法。

霍夫曼编码是一种数据压缩算法,它通过将频率最高的字符编码为较短的比特串,从而实现对数据的有效压缩。

在本文中,我们将介绍如何在Matlab中实现霍夫曼编码函数。

首先,我们需要了解霍夫曼编码的基本原理。

该算法基于字符出现的频率构建一个霍夫曼树,其中出现频率较高的字符位于树的较低层,而出现频率较低的字符位于树的较高层。

然后,通过从根节点到每个字符的路径上的比特串表示字符的编码。

这样,频率较高的字符将使用较短的比特串编码,而频率较低的字符将使用较长的比特串编码。

在Matlab中实现霍夫曼编码,我们首先需要计算每个字符在给定数据中的出现频率。

我们可以使用Matlab提供的`histcounts`函数来实现这一点。

`histcounts`函数将数据分成一定数量的称为“bins”的区间,并计算每个区间中的数据的频数。

matlabdata = 'abcdefgh'; 给定的数据frequencies = histcounts(data, unique(data)); 计算每个字符的频数上述代码首先定义了一个包含字符的字符串,然后使用`unique`函数获取字符串中的唯一字符。

然后,`histcounts`函数基于这些唯一字符计算每个字符的频数,并将结果存储在名为“frequencies”的数组中。

下一步是构建霍夫曼树。

我们可以使用以下步骤来实现此操作:1. 创建一个含有所有字符频数的结点集合,并按照频率从低到高对结点排序。

2. 从频率最低的两个结点中创建一个新的父节点,并将这个父节点的频率设置为这两个结点的频率之和。

将这个新的父节点添加到结点集合中,并删除这两个被合并的结点。

3. 重复步骤2,直到只剩下一个节点为止。

这个节点将成为霍夫曼树的根节点。

哈夫曼编码Matlab实现

哈夫曼编码Matlab实现

Matlab 中实现哈夫曼编译码:n=input('Please input the total number: ');hf=zeros(2*n-1,5);hq=[];for ki=1:nhf(ki,1)=ki;hf(ki,2)=input('Please input the frequency: ');hq=[hq,hf(ki,2)];endfor ki=n+1:2*n-1hf(ki,1)=ki;mhq1=min(hq);m=size(hq);m=m(:,2);k=1;while k<=m%del min1if hq(:,k)==mhq1hq=[hq(:,1:(k-1)) hq(:,(k+1):m)];m=m-1;breakelsek=k+1;endendk=1;while hf(k,2)~=mhq1|hf(k,5)==1%find min1 location k=k+1;endhf(k,5)=1;k1=k;mhq2=min(hq);k=1;while k<=m%del min2if hq(:,k)==mhq2hq=[hq(:,1:(k-1)) hq(:,(k+1):m)];m=m-1;breakelseendendk=1;while hf(k,2)~=mhq2|hf(k,5)==1%find min2 locationk=k+1;endhf(k,5)=1;k2=k;hf(ki,2)=mhq1+mhq2;hf(ki,3)=k1;hf(ki,4)=k2;hq=[hq hf(ki,2)];endclcchoose=input('Please choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n');while choose==1|choose==2if choose==1a=input('Please input the letter you want to Encoding: ');k=1;while hf(k,2)~=ak=k+1;if k>=ndisplay('Error! You did not input this number.');breakendendif k>=nbreakendr=[];while hf(k,5)==1kc=n+1;while hf(kc,3)~=k&hf(kc,4)~=kkc=kc+1;endif hf(kc,3)==kelser=[1 r];endk=kc;endrelsea=input('Please input the metrix you want to Decoding: ');sa=size(a);sa=sa(:,2);k=2*n-1;while sa~=0if a(:,1)==0k=hf(k,3);elsek=hf(k,4);enda=a(:,2:sa);sa=sa-1;if k==0display('Error! The metrix you entered is a wrong one.');breakendendif k==0breakendr=hf(k,2);endchoose=input('Please choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n');clc;endif choose~=1&choose~=2clc;end。

霍夫曼编码的MATLAB实现

霍夫曼编码的MATLAB实现

霍夫曼编码的MATLAB实现%哈夫曼编码的MATLAB实现(基于0、1编码):clc;clear;A=[0.3,0.2,0.1,0.2,0.2];信源消息的概率序列A=fliplr(sort(A));%按降序排列T=A;[m,n]=size(A);B=zeros(n,n-1);%空的编码表(矩阵)for i=1:nB(i,1)=T(i);%生成编码表的第一列endr=B(i,1)+B(i-1,1);%最后两个元素相加T(n-1)=r;T(n)=0;T=fliplr(sort(T));t=n-1;for j=2:n-1%生成编码表的其他各列for i=1:tB(i,j)=T(i);endK=find(T==r);B(n,j)=K(end);%从第二列开始,每列的最后一个元素记录特征元素在%该列的位置r=(B(t-1,j)+B(t,j));%最后两个元素相加T(t-1)=r;T(t)=0;T=fliplr(sort(T));endB;%输出编码表END1=sym('[0,1]');%给最后一列的元素编码END=END1;t=3;d=1;for j=n-2:-1:1%从倒数第二列开始依次对各列元素编码for i=1:t-2if i>1 & B(i,j)==B(i-1,j)d=d+1;elsed=1;endB(B(n,j+1),j+1)=-1;temp=B(:,j+1);x=find(temp==B(i,j));END(i)=END1(x(d));endy=B(n,j+1);END(t-1)=[char(END1(y)),'0'];END(t)=[char(END1(y)),'1'];t=t+1;END1=END;endA%排序后的原概率序列END%编码结果for i=1:n[a,b]=size(char(END(i)));endavlen=sum(L.*A)%平均码长H1=log2(A);H=-A*(H1')%熵P=H/avlen%编码效率提取这一列两个最小值相加在后一列中的位置以及其编码。

matlab的哈夫曼树的绘制

matlab的哈夫曼树的绘制

function varargout = gui(varargin)% GUI M-file for gui.fig% GUI, by itself, creates a new GUI or raises the existing% singleton*.%% H = GUI returns the handle to a new GUI or the handle to% the existing singleton*.%% GUI('CALLBACK',hObject,eventData,handles,...) calls the local% function named CALLBACK in GUI.M with the given input arguments. %% GUI('Property','Value',...) creates a new GUI or raises the% existing singleton*. Starting from the left, property value pairs are% applied to the GUI before gui_OpeningFcn gets called. An% unrecognized property name or invalid value makes property application% stop. All inputs are passed to gui_OpeningFcn via varargin.%% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".%% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help gui% Last Modified by GUIDE v2.5 19-Jul-2018 08:21:02% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @gui_OpeningFcn, ...'gui_OutputFcn', @gui_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before gui is made visible.function gui_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)% varargin command line arguments to gui (see VARARGIN)% Choose default command line output for guihandles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes gui wait for user response (see UIRESUME)% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line. function varargout = gui_OutputFcn(hObject, eventdata, handles)% varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structurevarargout{1} = handles.output;function edit1_Callback(hObject, eventdata, handles)% hObject handle to edit1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of edit1 as text% str2double(get(hObject,'String')) returns contents of edit1 as a double% --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles)% hObject handle to edit1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end% --- Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% --- Executes during object creation, after setting all properties. function pushbutton1_CreateFcn(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% --- If Enable == 'on', executes on mouse press in 5 pixel border.% --- Otherwise, executes on mouse press in 5 pixel border or over pushbutton1.function pushbutton1_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% --- Executes on button press in pushbutton2.function pushbutton2_Callback(hObject, eventdata, handles)% hObject handle to pushbutton2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)a=get(handles.edit1,'String');b=unique(a);%计算有多少个不重复的字符串s=length(a);for i=1:length(b)num(i)=length(strfind(a,b(i))); %统计字符的数目p(i)=num(i)/s;enddisp(p)[A,k]=sort(p,'descend');%按降序排列T=A;[~,n]=size(A);B=zeros(n,n);for i=1:nB(i,1)=T(i);%生成编码表的第一列endr=B(i,1)+B(i-1,1);%最后两个元素相加T(n-1)=r;T(n)=0;T=sort(T,'descend');t=n-1;for j=2:n%生成编码表的其他各列for i=1:tB(i,j)=T(i);endif t>1K=find(T==r);B(n,j)=K(end);r=(B(t-1,j)+B(t,j));T(t-1)=r;T(t)=0;T=sort(T,'descend');t=t-1;elseB(n,j)=1;endend%生成Huffman码字矩阵和排序后元素的码表向量 m=3;s1=sym('[2,1]');s2=s1;%码表%从倒数第三列开始建表for i=n-2:-1:1p=B(n,i+1);if p==1s2(1:m-2)=s1(2:m-1);elseif p==ms2(1:m-2)=s1(1:m-2);elseif p==2s2(1)=s1(1);s2(2:m-2)=s1(3:m-1);elses2(1:p-1)=s1(1:p-1);s2(p+1:m-2)=s1(p+1:m-2);ends2(m-1)=[char(s1(p)),'2'];s2(m)=[char(s1(p)),'1'];m=m+1;s1=s2;endL=zeros(1,n);for i=1:n[~,r]=size(char(s2(i)));L(i)=r;end%将码表转换成0和1输出arr=zeros(1,n);arr(1:n)=s2(1:n);str=[];for i=1:ns=num2str(arr(i));s=strrep(s,'1','0');s=strrep(s,'2','1');if i==1str=s;elsestr=[str,' ',s];endendstr=regexp(str,' ','split');set(handles.text1,'string',str);%建立字符对应的哈夫曼编码 cd(i)的编码是cd1(i)for q=1:ncd(q)=b(k(q));endfor i=1:length(b)cd1(i)=str(i);end%对整个序列编码for i=1:length(a)for j =1:length(cd)if strcmp(a(i),cd(j))hfcd(i)=cd1(j)endendendset(handles.text3,'string',cd');set(handles.text4,'string',hfcd');function edit2_Callback(hObject, eventdata, handles)% hObject handle to edit2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of edit2 as text% str2double(get(hObject,'String')) returns contents of edit2 as a double% --- Executes during object creation, after setting all properties. function edit2_CreateFcn(hObject, eventdata, handles)% hObject handle to edit2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end% --- Executes during object creation, after setting all properties. function axes1_CreateFcn(hObject, eventdata, handles)% hObject handle to axes1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called % Hint: place code in OpeningFcn to populate axes1% --- Executes on button press in pushbutton3.function pushbutton3_Callback(hObject, eventdata, handles)% hObject handle to pushbutton3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)clc;a=get(handles.edit1,'String');b=unique(a);%计算有多少个不重复的字符串s=length(a);for i=1:length(b)num(i)=length(strfind(a,b(i))); %统计字符的数目endnum%构造HuffTree%定义HuffTree结构矩阵并初始化HuffTreen=length(b);tree(1,1:2*n-1)=-1; %初始化左子树序号tree(2,1:2*n-1)=-1; %初始化右子树序号tree(3,1:2*n-1)=-1; %初始化根节点序号tree(4,1:2*n-1)=0; %初始化权重for i=1:ntree(4,i)=num(i);endfor i=n+1:2*n-1[min1,min2]=selectmin(tree,i-1); %选择两个权值最小的结点tree(3,min1)=i;tree(3,min2)=i;tree(1,i)=min1; %权值最小的结点作为左子树 tree(2,i)=min2; %权值次小的结点作为右子树 tree(4,i)=tree(4,min1)+tree(4,min2);%合并成新的二叉树enddisp(' Num Weight Lchild Rchild Parent');for p=1:2*n-1disp([p,tree(4,p),tree(1,p),tree(2,p),tree(3,p),]);endtree(3,2*n-1)=0;for i=1:2*n-1nodes(i)=tree(3,i);endaxis(handles.axes1);treeplot(nodes);count=size(nodes,2);[x,y]=treelayout(nodes);x=x';y=y';name1=cellstr(num2str((1:count)'));text(x(:,1),y(:,1),name1,'VerticalAlignment','bottom','HorizontalAlignme nt','right');function edit3_Callback(hObject, eventdata, handles)% hObject handle to edit3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of edit3 as text% str2double(get(hObject,'String')) returns contents of edit3 as a double% --- Executes during object creation, after setting all properties. function edit3_CreateFcn(hObject, eventdata, handles)% hObject handle to edit3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end% --- Executes on button press in pushbutton4.function pushbutton4_Callback(hObject, eventdata, handles)% hObject handle to pushbutton4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% --- Executes on button press in pushbutton5.function pushbutton5_Callback(hObject, eventdata, handles)% hObject handle to pushbutton5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% --- Executes on button press in pushbutton6.function pushbutton6_Callback(hObject, eventdata, handles)% hObject handle to pushbutton6 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% --- Executes during object creation, after setting all properties. function pushbutton6_CreateFcn(hObject, eventdata, handles)% hObject handle to pushbutton6 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called。

在Matlab中进行信号压缩和稀疏表示的技术

在Matlab中进行信号压缩和稀疏表示的技术

在Matlab中进行信号压缩和稀疏表示的技术信号压缩和稀疏表示是信号处理中重要的技术,可以用来减少数据存储和传输的需求,同时提高信号处理的效率。

在Matlab中,有许多方法可以实现信号的压缩和稀疏表示。

本文将介绍一些常用的技术和方法,并探讨它们的优缺点以及在实际应用中的适用范围。

一、信号压缩的基本原理信号压缩的基本原理是利用信号的冗余性来减少数据的存储和传输需求。

在数字信号中,冗余性主要分为两种类型:时域冗余和频域冗余。

时域冗余指的是信号在时间轴上存在重复的信息,频域冗余则是指信号在频率轴上存在冗余的能量。

常见的信号压缩方法包括哈夫曼编码、经典的离散余弦变换(DCT)以及小波变换等。

在Matlab中,可以利用这些方法对信号进行压缩。

二、哈夫曼编码哈夫曼编码是一种基于概率统计的信号压缩方法。

它利用信号中出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,从而减少编码的长度。

在Matlab中,可以使用"Huffman"函数来实现哈夫曼编码。

哈夫曼编码的优点是简单易懂,压缩效率较高。

但是它的缺点也很明显,即编码和解码的过程较为耗时,而且需要首先对信号进行统计分析,得到各个字符出现的概率分布。

三、离散余弦变换(DCT)离散余弦变换是一种利用信号的频域冗余性进行压缩的方法。

它将信号转换到频域,然后只保留少部分重要的频率成分,舍弃掉一部分不重要的频率成分,从而实现信号的压缩。

在Matlab中,可以使用"dct"函数实现离散余弦变换。

离散余弦变换的优点是可以实现较好的信号压缩效果,对保留光谱信息有较好的适应性。

但是它的缺点也比较明显,即离散余弦变换的计算复杂度较高,需要较大的计算量。

四、小波变换小波变换是一种用于信号压缩和稀疏表示的常见方法。

它将信号分解为不同尺度和频率的小波基函数,然后通过把小幅度的系数设为零来实现信号的稀疏表示,从而实现信号的压缩。

哈夫曼编码matlab

哈夫曼编码matlab

哈夫曼编码matlab1. 引言哈夫曼编码是一种广泛应用于数据压缩领域的编码算法,它通过使用变长编码来表示不同符号,使得出现频率高的符号使用较短的编码,而出现频率低的符号使用较长的编码。

这种编码方式可以有效地降低数据的存储空间,提高数据传输效率。

在本文中,我们将使用Matlab编程语言来实现哈夫曼编码算法,并介绍其原理和实现步骤。

2. 哈夫曼编码原理哈夫曼编码的核心思想是根据符号的出现频率来构建一棵哈夫曼树,树中的叶子节点对应着不同的符号,而每个符号的编码则通过从根节点到达对应叶子节点的路径来表示。

构建哈夫曼树的过程可以分为以下几个步骤:2.1 统计符号频率首先,我们需要统计待编码数据中各个符号的出现频率。

在Matlab中,我们可以使用histc函数来实现这一步骤。

2.2 构建哈夫曼树根据频率统计结果,我们可以构建一棵哈夫曼树。

构建哈夫曼树的过程可以简化为以下几个步骤: 1. 将每个符号作为一个单独的节点插入到一个优先队列中。

2. 从优先队列中选择两个频率最低的节点,并合并它们为一个新节点。

该新节点的频率为两个被合并节点的频率之和。

3. 将新节点插入到优先队列中。

4. 重复步骤2和3,直到优先队列中只剩下一个节点为止。

该节点即为哈夫曼树的根节点。

2.3 生成编码表在构建好的哈夫曼树上,每个叶子节点都对应着一个符号,编码就是从根节点到达叶子节点的路径。

我们可以通过遍历哈夫曼树来生成每个符号的编码。

从根节点出发,如果经过左子树则编码为0,经过右子树则编码为1。

遍历到叶子节点时,记录下从根节点到达该叶子节点的路径,即为该符号的编码。

3. 哈夫曼编码的实现接下来,我们将使用Matlab来实现哈夫曼编码算法。

首先,我们需要读取待编码的数据。

3.1 读取数据使用Matlab提供的文件读取函数,我们可以方便地读取文本文件或二进制文件。

在本例中,我们以文本文件为例,假设我们需要对一段文本进行编码。

下面是读取文本文件的示例代码:fid = fopen('input.txt', 'r');textData = fscanf(fid, '%c');fclose(fid);3.2 统计符号频率读取数据后,我们需要统计各个符号的频率。

matlab哈夫曼编码

matlab哈夫曼编码

matlab哈夫曼编码哈夫曼编码是一种常见的数据压缩算法,可以将数据压缩至原始数据的一小部分,从而减少存储空间和传输时间。

Matlab提供了内置函数来实现哈夫曼编码。

1. 哈夫曼树的构建在Matlab中,可以使用huffmandict函数来构建哈夫曼树。

该函数接受一个包含符号和它们对应权重的向量作为输入,并返回一个包含每个符号对应编码的字典。

例如,要将字符串"hello world"进行编码,可以使用以下代码:```s = 'hello world';symbols = unique(s);freq = hist(s,symbols);dict = huffmandict(symbols,freq);```其中,unique函数用于获取字符串中唯一的符号集合,hist函数用于计算每个符号出现的频率。

huffmandict函数则用于构建哈夫曼树并生成字典。

2. 数据压缩有了哈夫曼字典后,就可以将原始数据进行压缩。

在Matlab中,可以使用huffmanenco函数来进行数据压缩。

该函数接受一个包含原始数据的向量和之前生成的哈夫曼字典作为输入,并返回一个包含压缩后二进制数据的向量。

例如,在上面例子中生成的字典下,可以将字符串"hello world"进行压缩:```encoded = huffmanenco(s,dict);```3. 数据解压对于压缩后的数据,可以使用huffmandeco函数进行解压。

该函数接受一个包含压缩后二进制数据的向量和之前生成的哈夫曼字典作为输入,并返回一个包含解压后原始数据的向量。

例如,在上面例子中生成的字典下,可以将上一步得到的压缩数据进行解压:```decoded = huffmandeco(encoded,dict);```4. 完整代码综合以上步骤,可以得到完整的Matlab代码:```s = 'hello world';symbols = unique(s);freq = hist(s,symbols);dict = huffmandict(symbols,freq);encoded = huffmanenco(s,dict);decoded = huffmandeco(encoded,dict);```其中,s是待编码字符串,symbols是符号集合,freq是每个符号出现频率。

霍夫曼编码的matlab实现

霍夫曼编码的matlab实现

霍夫曼编码的matlab实现霍夫曼编码的matlab实现一、实验内容:用Matlab语言编程实现霍夫曼(Huffman)编码。

二、实验原理及编码思想: 霍夫曼(Huffman)编码算法是满足前缀条件的平均二进制码长最短的编-源输出符号,而将较短的编码码字分配给较大概率的信源输出。

算法是:在信源符号集合中,首先将两个最小概率的信源输出合并为新的输出,其概率是两个相应输出符号概率之和。

这一过程重复下去,直到只剩下一个合并输出为止,这个最后的合并输出符号的概率为1。

这样就得到了一张树图,从树根开始,将编码符号1 和0 分配在同一节点的任意两分支上,这一分配过程重复直到树叶。

从树根到树叶途经支路上的编码最后就构成了一组异前置码,就是霍夫曼编码输出。

以本教材P36例题3-2信源为例:离散无记忆信源:U u1 u2 u3 u4 u5P(U) = 0.4 0.2 0.2 0.1 0.1解:概率信符s编码过程 i P(s) i码字W i第一次第二次第三次1W=0 0.4 0.6 S0.4 0.4 11A(1) 1 W=10 S0.4 0.2 0.2 22 0 0.4 1 W=111 S 0.2 0.2 330 0.2 1 W=1101 S 0.1 440.2 0W=1100 S 0.1 550通过上表的对信源缩减合并过程,从而完成了对信源的霍夫曼编码。

三、程序设计思路分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。

然后是码树回溯过程:在码树上分配编码码字并最终得到霍夫曼编码。

1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。

然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。

在这一过程中每一次都把排序后的信源概率存入矩阵G中,位置索引存入矩阵Index中。

这样,由排序之后的概率矩阵 G以及索引矩阵Index就可以恢复原概率矩阵P了,从而保证了回溯过程能够进行下去。

哈夫曼编码

哈夫曼编码

图像编码与压缩——哈夫曼编码专业班级:10 信息安全学生姓名:王猛涛学生学号:_ 20101616310049 _指导教师:姚孝明完成时间:2013年4月13日_数字图像处理实验六:图像编码与压缩——哈夫曼编码一、实验目的1. 了解图像的哈夫曼编码原理。

2. 掌握哈夫曼编码算法。

二、实验主要仪器及设备1. 微型计算机:Intel Pentium及更高。

2. MATLAB软件(含图像处理工具箱)。

三、实验原理(Huffman编码)1. 可变码长最佳编码定理定理:在变长编码中,如果码字长度严格按照信号中符号出现概率大小的相反顺序排列,则平均码字长度一定小于其他符号顺序排列方式的平均码字长度。

D.A.Huffman(哈夫曼)在1952年根据可变长最佳编码定理,提出了依据信源集中符号出现的概率分配不同长度的唯一可译码的算法。

接收端在得到哈夫曼编码后,通过解码可以得到与输入完全一致的信号。

2.前缀码(prefix code)一组唯一可译码中的任意一个码字都只与一种信号存在对应关系。

为了译码的需要,在唯一可译码中的前缀码保证任意一个码字都不是其他码字的前缀。

例如,有一维图像的符号集合为{EMBED Equation.KSEE3 \* MERGEFORMAT |)}fffi)(ff ,设定的码字集合。

编码系统解码时,只要一遇到),3(4({),2(),1(“0”,便知道对应的是。

若接收到的是“1”,则等待下一个比特,若下一个比特为“0”。

即确定是,若下一个比特是“1”,则等待第三个比特。

若第三个比特为“0”,则可判定信号为,否则为。

若一前缀码为010*******,则译码的输出信号序列为。

可见前缀码保证了这样译出的码字具有唯一性和“即时性”。

3.Huffman编码Huffman编码的算法如下:(1)将图像的灰度等级按概率大小进行升序排序。

(2)在灰度级集合中取两个最小概率相加,合成一个概率。

(3)新合成的概率与其他的概率成员组成新的概率集合。

在Matlab中进行数据压缩的技术实现

在Matlab中进行数据压缩的技术实现

在Matlab中进行数据压缩的技术实现数据压缩是一种常见的数据处理技术,用于减少数据占用的存储空间和传输带宽。

在大数据时代,数据压缩成为了非常重要的技术之一。

Matlab作为一种强大的数学计算软件,也提供了丰富的数据压缩工具和算法。

本文将介绍在Matlab中进行数据压缩的技术实现。

1. 概述数据压缩可以分为有损压缩和无损压缩两种类型。

有损压缩是指在压缩过程中会丢失部分数据变化的细节,但可以大幅减少数据的存储空间。

无损压缩则是保证经压缩和解压缩后数据的完全一致性。

2. 无损压缩在Matlab中,无损压缩常常使用的是一些经典的算法,如Huffman编码、Lempel-Ziv-Welch (LZW)编码和自适应算术编码等。

Huffman编码是一种基于字符频率统计的压缩算法。

在Matlab中,可以使用`huffmandict`函数生成Huffman编码所需的编码字典,然后使用`huffmanenco`函数对数据进行编码,使用`huffmandeco`函数进行解码。

LZW编码是一种无损的字典压缩算法。

在Matlab中,可以使用`lzwenc`函数对数据进行编码,使用`lzwdec`函数进行解码。

自适应算术编码是一种根据数据概率动态更新编码表的压缩算法。

在Matlab 中,可以使用`arithenco`函数对数据进行编码,使用`arithdeco`函数进行解码。

这些无损压缩算法在Matlab中的实现简单而高效,能够有效地减少数据的存储空间。

3. 有损压缩有损压缩常用于图像、音频和视频等需要高压缩比的数据。

在Matlab中,有损压缩常常使用的是一些经典的算法,如JPEG和MP3等。

JPEG(Joint Photographic Experts Group)是一种广泛应用于图像压缩的有损压缩算法。

在Matlab中,可以使用`imresize`函数将图像进行降采样,使用`dct2`函数对图像进行离散余弦变换,然后使用量化矩阵将高频分量进行量化,再使用`huffmanenco`函数对量化后的数据进行哈夫曼编码。

基于matlab对哈夫曼编码的实现

基于matlab对哈夫曼编码的实现

在MATLAB中实现哈夫曼编码需要先建立哈夫曼树,然后基于这颗哈夫曼树生成对应的哈夫曼编码。

以下是使用MATLAB实现哈夫曼编码的简单步骤:
假设你有一个要编码的符号集合symSet和这些符号的概率集合probSet。

1.计算频率和概率: 首先,我们需要计算每个符号的频率和概率。

freq = histc(symSet, symSet); % 计算频率
prob = freq / sum(freq); % 计算概率
2.构建哈夫曼树: 使用huffTree函数构建哈夫曼树。

[huffTree, huffCodes] = huffTree(prob);
3.生成哈夫曼编码: 使用huffmanenco函数生成哈夫曼编码。

huffmanCodes = huffmanenco(symSet, huffTree);
4.测试: 使用生成的哈夫曼编码对原始数据进行编码和解码。

originalData = symSet(randperm(length(symSet), 1000)); % 随机生成1000个原始数据
encodedData = huffmanenco(originalData, huffTree); % 对原始数据进行编码
decodedData = huffDeco(encodedData, huffCodes); % 解码编码后的数据
5.比较解码后的数据与原始数据: 检查解码后的数据是否与原始数据匹配。

以上是MATLAB实现哈夫曼编码的基本步骤,具体的代码可能需要根据你的数据和需要进行一些调整。

实验1 Huffman编码生成器-matlab

实验1 Huffman编码生成器-matlab
三、实验环境
1.计算机
2.Windows 2000或以上
3.MatLab
四、实验原理
Huffman编码算法
为使平均码长最短,必须使最后一步缩减信源有m个信源符号。如果第一步给概率最小的符号分配码元时,所取的符号数就不一定是m个。
对于m进制编码,若所有码字构成全树,可分离的码字数必为m+k(m-1),式中k为非负整数,即缩减次数。
% L为编码返回的平均码字长度,q为编码效率%
%*****************************************%
function [W,L,q]=huffman(P)
if (length(find(P<=0))~=0)
error('Not a prob.vector,negative component'); %判断是否符合概率分布条件
% H为信息熵%
%******************************%
function H=entropy(P,r)
if (length(find(P<=0))~=0)
error('Not a prob.vector,negative component'); %判断是否符合概率分布条件
end
s2='Huffman编码平均码字长度L:';
s3='Huffman编码的编码效率q:';
disp(s0);
disp(s1),disp(B),disp(W);
disp(s2),disp(L);
disp(s3),disp(q);
%函数说明:%
% H=entropy(P,r)为信息熵函数%

matlab 哈夫曼编码

matlab 哈夫曼编码

matlab 哈夫曼编码哈夫曼编码是一种可变长度的编码方式,它可以将一组可能不等概率出现的字符序列压缩成一个二进制编码的表示方式,以达到数据压缩的目的。

在哈夫曼编码中,出现频率越高的字符所对应的编码越短,反之越长。

需要注意的是,将字符压缩成的二进制编码只能满足单词不重复的情况下才能唯一的解码出来,因此在实际应用中还需要对编码进行强制分界,以保证无二义性。

在Matlab中进行哈夫曼编码可以使用built-in函数'huffmandict'和'huffmanenco'来完成。

其中'huffmandict'函数根据字符和频率信息来生成哈夫曼字典,'huffmanenco'函数将读入的原始数据运用哈夫曼编码压缩成一个码字,也可以使用'huffmandeco'函数将压缩后的数据解码。

下面我给出一个简单的演示,解释如何使用Matlab实现哈夫曼编码过程。

假设我们要压缩的原始数据如下:matlabcharList = ['a', 'b', 'c', 'd', 'e', 'f'];probList = [0.2, 0.15, 0.1, 0.12, 0.3, 0.13];data = ['a', 'c', 'b', 'a', 'e', 'b', 'f', 'e', 'f', 'c', 'c', 'a', 'd', 'a', 'b', 'e'];首先我们需要生成一个哈夫曼字典:matlabhuffDictionary = huffmandict(charList, probList);这里的'huffmandict'函数通过输入字符符号和对应概率的向量,生成一个哈夫曼字典。

Huffman编码(哈夫曼编码)的Matlab实现

Huffman编码(哈夫曼编码)的Matlab实现

clear 【1 】all fprintf('Reading data...')data=imread('cameraman.tif');data=uint8(data);%读入数据,并将数据限制为uint8 fprintf('Done!\n')%编码紧缩fprintf('compressing data...');[zipped,info]=norm2huff(data);fprintf('Done!\n')%解紧缩fprintf('compressing data...');unzipped=huff2norm(zipped,info);fprintf('Done!\n')%测试是否无掉真isOK=isequal(data(:),unzipped(:))%显示紧缩后果whos datazippedunzippedfunction [zipped,info]=norm2huff(vector)if~isa(vector,'uint8'),error('input argument must be a uint8 vector') endvector=vector(:)';%将输入向量转换为行向量f=frequency(vector);%盘算个元素消失的概率simbols=find(f~=0);f=f(simbols);%将元素按消失的概率分列[f,sortindex]=sot(f);simbols=simbols(sortindex);%产生码字 generate the codeword as the 52 bits of a doublelen=length(simbols);simbols_index=num2cell(1:len);codeword_tmp=cell(len,1);while length(f)>1,index1=simbols_index{1};index2=simbols_index{2};codeword_tmp(index1)=addnode(codeword_tmp(index1),uint8(0)); codeword_tmp(index2)=addnode(codeword_tmp(index2),uint8(1)); f=[sum(f(1:2)) f(3:end)];simbols_index=[{[index1 index2]} simbols_index(3:end)];%将数据从新分列,是两个节点的频率尽量与前一个节点的频率想当resort datainordertohavetwonodeswithlowerfrequencyasfirst to[f,sortindex]=sort(f);simbols_index=simbols_index(sortindex);end%对应响应的元素与码字codeword=cell(256:1);codeword(simbols)=codeword_tmp;%盘算总的字符串长度len=0;for index=1:length(vector),len=len+length(codeword{double(vector(index))+1}); end%产生01序列string=repmat(uint8(0),1,len);pointer=1;for index=1:length(vector),code=codeword{double(vector(index))+1};len=length(code);string(pointer+(0:len-1))=code;pointer=pointer+len;end%假如须要,加零len=length(string);pad=8-mod(len,8);if pad>0,string=[string uint8(zeros(1,pad))];end%保管现实有效的码字codeword=codeword(simbols);codelen=zeros(size(codeword));weights=2.^(0:23);maxcodelen=0;for index 1:length(codeword),len=length(codeword{index});if len>maxcodelen,maxcodelen=len;endif len>0,code=sum(weights(codeword{index}==1)); code=bitset(code,len+1);codeword{index}=code;codelen(index)=len;endendcodeword=[codeword{:}]%盘算紧缩后的向量cols=length(string)/8;string=reshape(string,8,cols);weights=2.^(0:7);zipped=uint8(weights*double(string));%存储一个稀少矩阵huffcodes=sparse(1,1);% init sparse matrixfor index=1:numel(codeword),huffcodes(codeword(index),1)=simbols(index); end%产生信息构造体info.pad=pad;info.ratio=cols./length(vector);info.length=length(vector);info.maxcodelen=maxcodelen;function codeword_new=addnode(codeword_old,item)codeword_new=cell(size(codeword_old));for index=1:length(codeword_old),codeword_new{index}=[item codeword_old{index}];endfunction vector=huff2norm(zipped,info)%HUFF2NORM Huffman 解码器%HUFF2NORM(X,INFO)依据信息体构造 info 返回向量 zipped 的解码成果%%矩阵参数以X(:)情势输入if~isa(zipped,'uint8'),error('input argument must be a uint8 vector')end%产生01序列len=length(zipped);string=repmat(uint8(0),1,len.*8);bitindex=1:8;for index+1:len,string(bitindex+8.*(index-1))=uint8(bitget(zipped(index),bitindex)); end%调剂字符串string=logical(string(:)');% remove 0 paddinglen=length(string);%解码weights=2.^(0:51);vector=repmat(uint8(0),1,info,length);vectorindex=1;codeindex=1;code=0;for index=1:len,code=bitset(code,codeindex,string(index));]codeindex=codeindex+1;byte=decode(bitset(code,codeindex),info);if byte>0,%vector(vectorindex)=byte-1;codeindex=1;code=0;vectorindex=vectorindex+1;endendfunction byte=decode(code,info)byte=info.huffcodes(code);function f=frequency(vector)%FREQUENCY 盘算元素消失概率if~isa(vector,'uint8'),error('input argument must be a uint8 vector') endf=repmat(0,1,256);%扫描向量len=length(vector);for index=0:256,%f(index+1)=sum(vector==uint8(index)); end%归一化f=f./len;。

huffman编码的matlab实现

huffman编码的matlab实现

%生成一个n-1行n列的数组
概率数组q进行从小至大的排序,并且用l数组返回一个数组,该数组表示概率数组q 排序前的顺序编号
%由数组l构建一个矩阵,该矩阵表明概率合并时的顺序,用于后面的编码
%将排序后的概率数组q的前两项,即概率最小的两个数加和,得到新的一组概率序列
end for i=1:n-1
%生成一个n-1行n列,并且每个元素的的长度为n的空白数组,c矩阵用于进行huffman编码,并且在编 码中与a矩阵有一定的对应关系
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:)==j+1)-1)+1:n*find(a(ni+1,:)==j+1)) %矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一
个元素的位置在c矩阵中的编码值
end end for i=1:n
霍夫曼编码方法的具体过程是:首先把信源的各个输出符 号序列按概率递降的顺序排列起来,求其中概率最小的两个序 列的概率之和,并把这个概率之和看作是一个符号序列的概 率,再与其他序依概率递降顺序排列(参与求概率之和的这 两个序列不再出现在新的排列之中),然后,对参与概率求和 的两个符号序列分别赋予二进制数字0和1。继续这样的操作, 直到剩下一个以1为概率的符号序列。最后,按照与编码过程 相反的顺序读出各个符号序列所对应的二进制数字组,就可分 别得到各该符号序列的码字。
%完成huffman码字的分配
ind(a(1,:)==i)*n) %用h表示最后的huffman编码,矩阵h的第i行的元素对应于矩阵c的第一行的第i个元素
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编写Matlab函数实现哈夫曼编码的算法一、设计目的和意义在当今信息化时代,数字信号充斥着各个角落。

在数字信号的处理和传输中,信源编码是首先遇到的问题,一个信源编码的好坏优劣直接影响到了后面的处理和传输。

如何无失真地编码,如何使编码的效率最高,成为了大家研究的对象。

哈夫曼编码就是其中的一种,哈夫曼编码是一种变长的编码方案。

它由最优二叉树既哈夫曼树得到编码,码元内容为到根结点的路径中与父结点的左右子树的标识。

所以哈夫曼在编码在数字通信中有着重要的意义。

可以根据信源符号的使用概率的高低来确定码元的长度。

既实现了信源的无失真地编码,又使得编码的效率最高。

二、设计原理哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。

uffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。

而哈夫曼编码的第一步工作就是构造哈夫曼树。

哈夫曼二叉树的构造方法原则如下,假设有n个权值,则构造出的哈夫曼树有n个叶子结点。

n 个权值分别设为w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;(3)从森林中删除选取的两棵树,并将新树加入森林;(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

具体过程如下图1产所示:(例)图1 哈夫曼树构建过程哈夫曼树构造成功后,就可以根据哈夫曼树对信源符号进行哈夫曼编码。

具体过程为先找到要编码符号在哈夫曼树中的位置,然后求该叶子节点到根节点的路径,其中节点的左孩子路径标识为0,右孩子路径标识为1,最后的表示路径的01编码既为该符号的哈夫曼编码。

可以知道,一个符号在哈夫曼树中的不同位置就有不同的编码。

而且,不同符号的编码长度也可能不一样,它由该结点到父结点的路径长度决定,路径越长编码也就越长,这正是哈夫曼编码的优势和特点所在。

它以各符号出现的概率大小将各符号的编码区分开。

例如对上例图中“1”的编码为“100”,“3”的编码为“101”,“5”的编码为“11”。

对于一个信源消息的熵可以以下公式(1)求得:(1)其中H(x)表示信源的总信息量,既为信源的熵。

p()为信源中一特定符号出现的概率。

三、详细设计步骤1) 首先对设计题目进行系统理论分析。

由给定的8种可能符号的信源,各种符号发生的概率分别为:0.30、0.16、0.14、0.12、0.10、0.09、0.06、0.04。

可以根据哈夫曼树的构造原理得出如下哈夫曼树型结构(图2):图2 哈夫曼树其中每个结点中的上面的整数为结点有编号,下面的小数为该结点的权值,在这里指的各结点的概率。

2) 由以是的哈夫曼树图,根据哈夫曼的编码规则可求该8个输出符号的顺序为:0.30,0.16,0.14,0.12,0.10,0.09,0.06,0.04对应编码输出应该为:1 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 1 1,编码长度为25。

3)由熵的计算公式可知:H(X)=-(0.30.3+0.160.16+0.140.14+0.0.12+0.10.1+0.090.09+0.060.06+0.040.04)=2.78244)哈夫曼树在matlab中的构造,在matlab中用tree(MN,s1,s2,s3……)这个系统函数来构造哈夫曼二叉树。

声明一个tree(5,x)结构的树型结点,一个结点包括有5个变量存储单元。

其中tree(1,x)记录该结点的编号;tree(2,x)记录该结点的概率值;tree(3,x)记录该结点的父结点编号;tree(4,x)记录该结点是左结点还是右结点(其中左结点为“0”,右结点为“1”);tree(5,x)记录该结点是否为根结点标志(该结点为根结点记为“1”,否则决为“0”)。

由哈夫曼树构造原则,先选出所有结点中概率值最小的两个结点,把这两个结点组合在一起形成一个新的二叉树。

新二叉树的根结点为两个子结点的概率这和,同时根据实际情况标记结点的相关属性(如左右子结点,是否为根结点),之后再将新的二叉树跟剩下的结点集合在一起,再选出概率值最小的两个结点,并重复以上的过程,直到把所有的结点都加到二叉树中,开成一根哈夫曼二叉树。

在matlab编程实现中先编写一个子函数用于找出所有结点中概率值最小的两个结点,子函数如下:function [l,r]=findminval(tree)s=find(tree(5,:)==1);if size(s,2)<2error('Error input!');endfirval=realmax;secval=realmax;for i=s;if firval>tree(2,i)if secval>firvalsecond=first;secval=firval;endfirst=i;firval=tree(2,i);elseif secval>tree(2,i)second=i;secval=tree(2,i);endendl=min([first,second]);r=max([first,second]);5)然后再编写代码实现哈夫曼树的构建,通过循环调用tree()函数,并加以判断完成哈夫曼树的构造,代码如下:%哈夫曼树结点数据结构%pro为一概率向量%tree(1,*)结点序号%tree(2,*)概率%tree(3,*)父结点序号%tree(4,*)左右标志%tree(5,*)结点是否是根结点标志%生成的哈夫曼树n=size(pro,2);%得到字符个数tree=ones(5,2*n-1);%构造树数据结构tree(1,:)=1:(2*n-1);%填充结点序号tree(5,(n+1):end)=0;%设置结点是否在集合tree(2,1:n)=pro;%设置概率for i=(n+1):(2*n-1);%循环控制[l,r]=findminval(tree);%找到集合中两个最小的值的序号tree(2,i)=tree(2,l)+tree(2,r);%得到父结点概率值tree(5,i)=1;%设置新构造结点在集合中tree(3,l)=i;tree(3,r)=i;%设置父结点序号tree(4,l)=0;tree(4,r)=1;%设置左右标志tree(5,l)=0;tree(5,r)=0;%设置不在集合中endHuffmanTree=tree;6)调用循环计算信源的熵,代码如下:Entropy=0;%初始化为0for j=1:n;%循环累加求信源的熵Entropy=Entropy-pro(j)*log2(pro(j));end7)由哈夫曼树生成哈夫曼编码,既哈夫曼树的遍历,同时统计编码的长度,此处采用由下往上的遍历方式,获得路径编码后再将编码倒一次序,得到的编码既为信源称号的哈夫曼编码,最后再将所有符号的编码组合在一起,代码如下:%由下至上完成哈夫曼编码HuffmanCode=[];%初始化定义Code=[];SumCode=0;LastPoint=1;int z;for k=1:n;%循环完成n个符号的编码CodeNumber=1;m=k;while(tree(5,m)~=1)%判断是否已遍历到根结点if tree(4,m)==0%判断为左结点编码为0Code(CodeNumber)=0;CodeNumber=CodeNumber+1;elseif tree(4,m)==1%判断为右结点编码为1Code(CodeNumber)=1;CodeNumber=CodeNumber+1;endm=tree(3,m);%指向父结点endCodeNumber=CodeNumber-1;SumCode=SumCode+CodeNumber;%累加计算编码长度for z=LastPoint:SumCode;%将n个符号的编码组合到一起HuffmanCode(z)=Code(CodeNumber);CodeNumber=CodeNumber-1;z=z+1;endLastPoint=z;end8)最后将以上的代码整合到一个子函数中,并设置函数的传入参数为信源符号的概率向量,同时使函数返回哈夫曼树,哈夫曼编码,编码长度以及信源的熵,函数头如下:function [HuffmanTree,HuffmanCode,SumCode,Entropy] = Huffman(pro)四、设计结果及分析完成编写设计后,在matlab中运行并验证结果,首先输入概率向量:>> pro=[0.30,0.16,0.14,0.12,0.10,0.09,0.06,0.04];再调用编写的Huffman函数:>> [HuffmanTree,HuffmanCode,SumCode,Entropy] = Huffman(pro)回车即可得到执行的结果:(见附图3)所得的结果与实际预测的理论结果一致无误。

五、体会通过本次数字通信课程的设计,深刻体会了数字编码的全过程。

认识到了无失真和高效率编码在数字通信中的重要性。

清楚了哈夫曼编码的整体过程和细节,首先构建哈夫曼二叉树,再通过该二叉树遍历得到哈夫曼编码值。

对二叉树的构建过程的判断方式和构建原则有了更深的认识。

同时,进一步使用了matlab 这个软件工具,进一步熟悉了在matlab中的编程的语法和结构。

认识到了软件工具在通信科研仿真方面的重要作用和方便性。

同时在专业方面丰富了知识面,增长了见闻。

了解到了更多的通信方面的专业名词和术语。

对以后的更深入的学习的工作打下了基础。

相关文档
最新文档