清晰的唯一可译码判决准则

清晰的唯一可译码判决准则
清晰的唯一可译码判决准则

唯一可译码判决准则

已知:心愿符号个数r 、码字集合C

算法:

1、考查C 中所有的码字,若i W 是j W 的前缀,则将相应的后缀作为一个尾随后

缀码放入集合0F 中;

j j i 1i i i i i C F W C W F W F W C F +∈∈∈∈2、考查和两个集合,是的前缀或是的前缀,则将相应的后缀作为尾随后缀码放入集合中;

3、i i

F F = 即为码C 的尾随后缀集合; 4、若F 中出现了C 中的元素,则算法终止,返回假(C 不是唯一可译码);否则若F 中没有出现新的元素,则返回真。

要求:

1、使用的编程:C++;

2、输入:任意的一个码,码字个数和每个具体的码字在运行时从键盘输入。

3、输出:判决(是唯一可译码/不是唯一可译码)。

4、源程序格式整齐清晰,注释简单明了。

创建C++工程和源文件:

代码如下:

#include

#include

#include

using namespace std;

struct strings

{char *string;

struct strings *next;

};

struct strings m_str, *m_h, *m_P;

inline int min(int a, int b)

{return a>b?b:a;}

inline int max(int a, int b)

{return a>b?a:b;}

#define length_a (strlen(CP))

#define length_b (strlen(tempPtr))

//判断一个码是否在一个码集合中,在则返回0,不在返回1

int Comparing(strings *st_string,char *code)

{

while(st_string->next)

{

st_string=st_string->next;

if(!strcmp(st_string->string,code))

return 0;

}

return 1;

}

//判断两个码字是否一个是另一个的前缀,如果是,则生成后缀码

void HZ(char *CP,char *tempPtr)

{

if (!strcmp(CP,tempPtr))

{

cout<<"判断结果:这个不是唯一可译码!"<

exit(1);

}

if (!strncmp(CP, tempPtr, min(length_a,length_b)))

{

struct strings *cp_temp;

cp_temp=new (struct strings);

cp_temp->next=NULL;

cp_temp->string=new char[abs(length_a-length_b)+1];

char *longstr;

longstr=(length_a>length_b ? CP : tempPtr); //将长度长的码赋给longstr

//取出后缀

for (int k=min(length_a,length_b); k

cp_temp->string[k - min(length_a,length_b)]=longstr[k];

cp_temp->string[abs(length_a-length_b)]=NULL;

//判断新生成的后缀码是否已在集合F里,不在则加入F集合

if(Comparing(m_h,cp_temp->string))

{

m_P->next=cp_temp;

m_P=m_P->next;

}

}

//主函数如下:

void main()

{

//提示

cout<<"唯一可译码的判别!"<

struct strings Cstr, *Ch, *CP,*tempPtr;

Ch=&Cstr;

CP=Ch;

m_h=&m_str;

m_P=m_h;

//输入待检测码的个数

int a;

cout<<"请输入码字符号的个数(输入后按回车键):"<

cin>>a;

if(cin.fail() || a<1)

{

cout<<"输入错误!请重新编译!"<

exit(1);

}

//输入待检测码

cout<<"请输入"<

for(int i=0; i

{

cout<

char tempstr[1];

cin>>tempstr;

CP->next=new (struct strings);

CP=CP->next;

CP->string=new char[strlen(tempstr)] ;

strcpy(CP->string, tempstr);

CP->next = NULL;

}

CP=Ch;

while(CP->next->next)

{

CP=CP->next;

tempPtr=CP;

do

{

tempPtr=tempPtr->next;

HZ(CP->string,tempPtr->string);

}while(tempPtr->next);

}

struct strings *Fbegin,*Fend;

Fend=m_h;

while(1)

{

if(Fend == m_P)

{

cout<<"判断结果:这个是唯一可译码!"<

exit(1);

}

Fbegin=Fend;

Fend=m_P;

CP=Ch;

while(CP->next)

{

CP=CP->next;

tempPtr=Fbegin;

for(;;)

{

tempPtr=tempPtr->next;

HZ(CP->string,tempPtr->string);

if(tempPtr == Fend)

break;

}

}

}

}

执行程序结果如下:

第一种情况:

输入:0

显示:输入错误!请重新编译!

如图:

第二种情况:

输入:4

然后输入4个码字:000,10,00,11 显示:这个不是唯一可译码!

如图:

第三种情况:

输入:4

然后输入4个码字:100,101,0,11 显示:这个是唯一可译码!

如图:

降到最小BCJR算法是利用最大后验概率准则把

引言 未来的无线通信系统必须能为用户提供高速率、高质量、实时的多媒体业务,然而无线信道,特别是移动无线信道是典型的随机时变信道,其在时间域、频率域以及空间角域均存在着随机性的扩散,这些扩散将造成接收信号在相对应的频率域、时间域以及空间域产生严重的衰落现象,衰落将严重地恶化无线通信系统的传输可靠性及频谱效率。为了实现高效、可靠的无线数据传输,两种手段是必要的:①利用各种分集对抗衰落,②利用信道编码实现差错控制。频率分集、时间分集、空间分集是主要的分集手段,充分利用这些分集方法将衰落信道尽可能地改造为AWGN信道,然后利用信道编码进行检错和纠错。一般的信道编译码方案,难以在无线通信中以较低的信噪比达到数据业务的服务质量(QoS)(例如一般要求误比特率 BER≤10-6),即使在以前的无线移动通信系统中通常采用的RS码与卷积码串行 级联的信道编码方案,与香农(C.E. Shannon)界有较大的差距,直到1993年出现的Turbo码的性能与香农界的差距仅为0.5dB。他们发明的Turbo码的创新之处在于:用两个递归系统卷积成员码并行级联编码,这两个系统递归卷积成员码之间用一个伪随机交织器相连接,并且采用软入软出(SISO, Soft-In-Soft-Out)的迭代译码算法。从此,Turbo 码就成为编码界的一个研究热点。S. Ten Brink在[2]得到的Turbo码的性能与香农界的差距仅为0.1dB。

一、3G 移动通信系统的特点&Turbo 码的应用 1.13G 移动通信系统的特点 第三代移动通信系统的数据速率可从几kbps 到2 Mbps ;高速移动时为144 kbps ;慢速移动时为384 kbps ;静止时为2 Mbps 。 多媒体化:提供高质量的多媒体业务,如话音、可变速率数据、活动视频和高清晰图像等多种业务,实现多种信息一体化。 全球性:公用频段, 全球漫游, 大市场。 在设计上具有高度的通用性,该系统中的业务以及它与固定网之间的业务可以兼容,拥有足够的系统容量和强大的多种用户管理能力,能提供全球漫游。是一个覆盖全球的、具有高度智能和个人服务特色的移动通信系统。 综合化:多环境、灵活性,能把现存的寻呼、无绳、蜂窝(宏蜂窝、微蜂窝、微微蜂窝)、卫星移动等通信系统综合在统一的系统中(具有从小于50m 的微微小区到大于500km 的卫星小区) ,与不同网络互通,提供无缝漫游和业务一致性。 网络终端具有多样性。 平滑过渡和演进:与第二代系统的共存和互通,开放结构,易于引入新技术。 智能化:主要表现在优化网络结构方面(引入智能网概念)和收发信机的软件无线电化。 个人化:用户可用唯一个人电信号码(PTN )在任何终端上获取所需要的电信业务,这就超越了传统的终端移动性,真正实现个人移动性 目前,Turbo 码的理论和应用研究仍在进行,这些研究将主要集中在如下几个方面: 1)最优分量码与交织器的联合设计。 2)低复杂性译码算法。 3)译码迭代过程的优化,收敛性以及迭代停止准则的设计。 4)联合信道估计/多用户检测/均衡和译码算法。 5)Turbo 码与高阶调制技术的结合。 6)Turbo 编译码器的硬件实现。 7)Turbo 码在无线通信,移动通信以及多媒体通信中的应用, 特别是在移动通信网络,IMT-2000及加密系统中的应用等等。 1.2 Turbo 码在第三代移动通信中的中的应用 WCDMA 和cdma2000都同时采用了卷积码和并行级联卷积Turbo 码(PCCC)作为纠错编码。Turbo 码主要用于对时延要求不高的高速数据业务。并行级联卷积码Turbo 码的对应的两个相同的递归系统卷积成员码的生成多项式如[34]中所规定的321)(1D D D g ++=, 31)(2D D D g ++=。在cdma2000-1XHDR 中, 串行级联卷积Turbo 码(SCCC)作为信道编码方

信息论实验报告

信息论实验报告 班级: 姓名: 学号:

实验一:信道容量的迭代算法 1.实验目的 (1)进一步熟悉信道容量的迭代算法; (2)学习如何将复杂的公式转化为程序; (3)掌握C 语言数值计算程序的设计和调试技术。 2、实验要求 (1)已知:信源符号个数r 、信宿符号个数s 、信道转移概率矩阵P 。 (2)输入:任意的一个信道转移概率矩阵。信源符号个数、信宿符号个数和每 个具体的转移概率在运行时从键盘输入。 (3)输出:最佳信源分布P*,信道容量C 。 3.算法分析 1:procedure CHANNEL CAPACITY(r,s,( ji p )) 2:initialize:信源分布 i p =1/r ,相对误差门限σ,C=—∞ 3:repeat 4: 5: 6: C 2211log [exp(log )] r s ji ij r j p φ==∑∑ 7:until C C σ ?≤ 8:output P*= ()i r p ,C 9:end procedure 4.程序调试 21211exp(log )exp(log )s ji ij j r s ji ij r j p p φφ===∑∑∑i p 1i ji r i ji i p p p p =∑ij φ

1、头文件引入出错 f:\visualc++\channel\cpp1.cpp(4) : fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory ————#include 纠错://#include f:\visualc++\channel\cpp1.cpp(5) : fatal error C1083: Cannot open include file: 'values.h': No such file or directory ————#include 纠错://#include 2、变量赋值错误 f:\visualc++\channel\cpp1.cpp(17) : error C2065: 'ij' : undeclared identifier f:\visualc++\channel\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'int' to 'float ** ' Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast ————float **phi_ij=ij=NULL; 纠错:float **phi_ij=NULL; 3、常量定义错误 f:\visualc++\channel\cpp1.cpp(40) : error C2143: syntax error : missing ';' before 'for' ————for(i=0;iDELTA) f:\visualc++\channel\Cpp1.cpp(84) : error C2021: expected exponent value, not ' ' ————if(fabs(p_j)>=DELTA) f:\visualc++\channel\Cpp1.cpp(100) : error C2021: expected exponent value, not ' ' ————if(fabs(phi_ij[i][j])>=DELTA) f:\visualc++\channel\Cpp1.cpp(116) : error C2021: expected exponent value, not ' ' ————while(fabs(C-C_pre)/C>DELTA); 纠错:#define DELTA 0.000001; F:\visualc++\channel\Cpp1.cpp(68) : error C2065: 'MAXFLOAT' : undeclared identifier F:\visualc++\channel\Cpp1.cpp(68) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data ————C=-MAXFLOAT; 纠错:#define MAXFLOAT 1000000; 3、引用中文逗号 f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1' f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1' f:\visualc++\channel\cpp1.cpp(60) : error C2065: 'Starting' : undeclared identifier f:\visualc++\channel\cpp1.cpp(60) : error C2059: syntax error : '.' f:\visualc++\channel\cpp1.cpp(60) : error C2017: illegal escape sequence f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'

实验2 唯一可译码判决准则

实验2: 唯一可译码判决准则 一、实验目的 1.进一步熟悉唯一可译码判决准则; 2.掌握C语言字符串处理程序的设计和调试技术。 二、实验要求和注意事项 1.输入:任意的一个码字集合。码字个数和每个具体的码字在运行时从键盘输入; 2.输出:判决(是/不是唯一可译码); 3.源程序格式整齐清晰,注释简单明了。 三、算法描述 见教材P96或P213 四、实验题目 判断以下编码是否唯一可译? (1)码字集合为 C={a,c,ad,abb,bad,deb,bbcde} (2)码字集合为 C={a,c,abb,bad,deb,bbcde} (3)码字集合为 C={xx,xz,y,zz,xyz} (4)码字集合为 C={01,111,011,00,010,110} (5)码字集合为 C={01,100,011,00,111,1010,1011,1101} 五、实验程序及结果 唯一可译码的判断! 输入待检测码的个数:7 输入待检测码 1 :a 2 :c

3 :ad 4 :abb 5 :bad 6 :deb 7 :bbcde C : a c ad abb bad deb bbcde F : d bb F : d bb eb cde F : d bb eb cde de

F : d bb eb cde de b F : d bb eb cde de b ad bcde 集合C和集合F中有相同码字: ad 不是唯一可译码码组! Press any key to continue... 唯一可译码的判断! 输入待检测码的个数:7 输入待检测码 1 :a 2 :c 3 :ad

Viterbi译码的MATLAB仿真研究

BUPT 卷积码编码及Viterbi译码 班级:07114 学号:070422 姓名:吴希龙 指导老师:彭岳星 邮箱:FusionBupt@https://www.360docs.net/doc/313128578.html,

1. 序言 卷积码最早于1955年由Elias 提出,稍后,1957年Wozencraft 提出了一种有效地译码方法即序列译码。1963年Massey 提出了一种性能稍差但是比较实用的门限译码方法,使得卷积码开始走向实用化。而后1967年Viterbi 提出了最大似然译码算法,它对存储级数较小的卷积码很容易实现,被称作Viterbi 译码算法,广泛的应用于现代通信中。 2. 卷积码编码及译码原理 2.1 卷积码编码原理 卷积码是一种性能优越的信道编码,它的编码器和解码器都比较易于实现,同时还具有较强的纠错能力,这使得它的使用越来越广泛。卷积码一般表示为(n,k,K)的形式,即将k 各信息比特编码为n 个比特的码组,K 为编码约束长度,说明编码过程中相互约束的码段个数。卷积码编码后的n 各码元不经与当前组的k 个信息比特有关,还与前K-1个输入组的信息比特有关。编码过程中相互关联的码元有K*n 个。R=k/n 是编码效率。编码效率和约束长度是衡量卷积码的两个重要参数。典型的卷积码一般选n,k 较小,但K 值可取较大(>10),以获得简单而高性能的卷积码。 卷积码的编码描述方式有很多种:冲激响应描述法、生成矩阵描述法、多项式乘积描述法、状态图描述,树图描述,网格图描述等。 2.1.1 卷积码解析表示法 卷积码的解析表示发大致可以分为离散卷积法,生成矩阵法,码多项式法。下面以离散卷积为例进行说明。 卷积码的编码器一般比较简单,为一个具有k 个输入端,n 个输出端,m 级移位寄存器的有限状态有记忆系统。下图所示为(2,1,7)卷积码的编码器。 若输入序列为u =(u 0u 1u 2u 3……), 则对应两个码字序列c ①=(c 0①c 1①c 2①c 3①……)和c ②=(c 0②c 1②c 2②c 3② ……) 相应的编码方程可写为c ①=u ?g ①,c ②=u ?g ②,c=(c ①,c ②)。 “?” 符号表示卷积运算,g ①,g ②表示编码器的两个冲激响应,即编码器的输出可以由输入序列和编码器的两个冲击响应卷积而得到,故称为卷积码。这里的冲激响应指:当输入为[1 0 0 0 0 … … ]序列时,所观察到的两个输出序列值。由于上图K 值为7,故冲激响应至

清晰的唯一可译码判决准则

唯一可译码判决准则 已知:心愿符号个数r 、码字集合C 算法: 1、考查C 中所有的码字,若i W 是j W 的前缀,则将相应的后缀作为一个尾随后 缀码放入集合0F 中; j j i 1i i i i i C F W C W F W F W C F +∈∈∈∈2、考查和两个集合,是的前缀或是的前缀,则将相应的后缀作为尾随后缀码放入集合中; 3、i i F F = 即为码C 的尾随后缀集合; 4、若F 中出现了C 中的元素,则算法终止,返回假(C 不是唯一可译码);否则若F 中没有出现新的元素,则返回真。 要求: 1、使用的编程:C++; 2、输入:任意的一个码,码字个数和每个具体的码字在运行时从键盘输入。 3、输出:判决(是唯一可译码/不是唯一可译码)。 4、源程序格式整齐清晰,注释简单明了。 创建C++工程和源文件: 代码如下: #include #include #include using namespace std; struct strings {char *string; struct strings *next; }; struct strings m_str, *m_h, *m_P; inline int min(int a, int b) {return a>b?b:a;} inline int max(int a, int b) {return a>b?a:b;} #define length_a (strlen(CP)) #define length_b (strlen(tempPtr))

唯一可译码判决算法.

云南大学数学与统计学实验教学中心实验报告 一、实验目的: 通过实验掌握唯一可译码的判决算法,以及其重要思想。 二、实验内容: 理解唯一可译码的判决算法 编制程序 参考北京邮电大学信息论方面的实验指导书 参考英文教材第二版中的习题5.27 三、实验环境 Win7、Eclipse 四、实验过程(请学生认真填写): 实验过程、结果以及相应的解释: 1. 预备知识 首先要对唯一可译码有一个清晰的认识。 唯一可译码:编码的扩展是非奇异的则称作唯一可译码。 及时码:码中无任何码字是其他码字的前缀,则称为前缀码或者及时码。 认清码之间的关系有助于我们在编写算法实现的时候有一个宏观的思路。 Sardings_Patterson算法是判决是否是唯一可译码的重点。Sardings_Patterson算法如是: A、判断C(x)中码字是否有其他码字的前缀,若是有,则构造一个尾随后缀集合List。 B、找出C(x)中是否有List中元素的前缀,有则将其尾随后缀加入List中,反过来再

找出List相对C(x)中的前缀,并将其尾随后缀加入List中。 C、若是list中存在尾随后缀为C(x)中的码字,则表示不是唯一可译码,若不存在则 为唯一可译码。 2. 实验过程 A、原理分析: 对于唯一可以码来说就目前掌握的知识来说我们可以使用两种方法来进行试验:Kraft不等式以及A.A.Sardings-Patterson算法两种。这里用的是后者。 B、具体代码如下: 代码整体结构如下:

结果如下: 1)及时码:1 01 001 0001 结果: 2)奇异码:1 1 11 10 0100 01 结果: 3)不是唯一可译码:a c ad abb bad deb bbcde 、0 10 1100 1110 1011 1101 结果: 4)唯一可译码:11 01 1110 00001 结果: 具体代码如下: /** * @author卢富毓 * 唯一可译码的判断算法的实现 * Sardings_Patterson算法来求唯一可译码 * step1:判断是否奇异 * step2:判断码字中是否有前缀存在 * step3:Sardings_Patterson算法的实现 */ package UDC;

信息论实验报告

实验报告 学院:专业:班级: 姓名:学号:实验日期: 实验名称: 实验一:唯一可译码判别准则的代码实现 实验二:霍夫曼编码的代码实现 实验目的: 实验一: 1.进一步熟悉唯一可译码判别准则; 2.掌握C 语言字符串处理程序的设计和调试技术。 实验二: 1.进一步熟悉Huffman 编码过程; 2.掌握C 语言递归程序的设计和调试技术。 实验仪器: 装有visual studio 2010 的电脑一台 实验原理: 实验一: 根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。 算法:1、考察 C 中所有的码字,若Wi 是Wj 的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1 中; 2、考察C 和Fi 俩个集合,若Wi ∈C 是Wj∈F 的前缀或Wi ∈F 是Wj∈C 的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1 中; 3、F=∪Fi 即为码C 的尾随后缀集合; 4、若F 中出现了C 中的元素,算法终止,返回假(C 不是唯一可译码);否

则若F 中没有出现新的元素,则返回真。 实验二: 1.将q 个信源符合按概率大小递减排列; 2.用“0,1”码符号分别代表概率最小的两个信源符号,并将这两个概率最小的信源符号合并成一个,从而得到只包含q-1 个符号的新信源,称为缩减信源s 1; 3.把缩减信源s1的符号仍按概率大小递减次序排列,再将其最后两个概率最小的信源符号分别用“0”和“1”码符号表示,并且合并成一个符号,这样又形成了q-2 个信源符号的缩减信源s 2; 4.依次继续下去,直至信源符号最后只剩下两个信源符号为止,将这最后两个信源符号分别用二元码符号“0”和“1”表示; 5.然后从最后一级缩减信源开始,进行回溯,就得到各信源符号所对应的码符号序列,即对应的码字。 实验内容与步骤: 实验一: 1.已知:信源符号数和码字集合C; 2.输入:任意的一个码,码字的个数和每个具体的码字在运行时从键盘输入; 3.输出:判决(是唯一可译码/不是唯一可译码);循环(若继续判决则输入1 循环判决,否则输入0 结束运行)。 实验二: 1. 输入:信源符号个数r、信源的概率分布P; 2. 输出:每个信源符号对应的Huffman 编码的码字。 实验数据: 实验一源代码: #include #include char c[100][50]; char f[300][50]; int N,sum=0; int flag; void patterson(char c[],char d[]) { int i,j,k; for(i=0;;i++)

信息与编码理论实验指导书

实验一 信道容量的迭代算法 一、 实验目的 1、掌握信道容量的概念。 2、了解迭代法计算信道容量的流程。 3、熟悉Matlab 程序的设计和调试方法。 二、 实验要求 1、学习Matlab 软件编程和调试方法; 2、输入:任意一个信道转移概率矩阵。包括信源符号个数、信宿符号个数、 信道转移概率,在程序运行时从键盘输入; 3、输出:输入的信道矩阵、信道容量C 。 三、 算法描述 1. 初始化信源分布),,,,,(21)0(r i p p p p p ??????= (一般初始化为均匀分布), 置迭代计数器0=k ,设信道容量相对误差门限为,0,>δδ可设-∞=)0(C ; 2. r i p p p p i k i ij k i ij k ji ,,2,1)() () (???==∑?;s j ,,1???= 3. r i p p p i j k ji ij j k ji ij k i ,,1ln exp ln exp )()()1(???=?? ????????????????????=∑∑∑+?? 4. ????????????????=∑∑+i j k ji ij k p C )() 1(ln exp ln ? 5. 如果,)1() ()1(δ≤-++k k k C C C 转向7 6. 置迭代序号k k →+1,转向2

7. 输出)1(+k i p 和)1(+k C 的结果 8. 停止 四、 实验报告内容 1、画出信道容量迭代算法流程图; 2、给出实验结果的截图(输入信道矩阵和信道容量计算结果); 3、对各种情况的实验结果进行分析和检验。 附:实验用Matlab 源程序。(如果使用了非给定源程序) 实验报告提交:电子文档(邮箱:yangxiaoping2004@https://www.360docs.net/doc/313128578.html, ) 实验过程:结果出来时,请实验老师检查并做记录(1个结果即可)。 实验二 唯一可译码判决准则 一、 实验目的 1、了解唯一可译码的概念。 2、掌握唯一可译码判决准则。 3、掌握Matlab 程序调试方法。 二、 实验要求 1、使用Matlab 软件编程; 2、输入:任意的一个码。码字个数和每个具体的码字在运行时从键盘输入; 3、输出:判决(是唯一可以码/不是唯一可以码)。 三、 算法描述 1. 考查C 中所有的码字,若i W 是j W 的前缀,则将相应的后缀作为一个尾随后缀码放入集合0F 中; 2. 考查C 和i F 两个集合,若C W i ∈是i j F W ∈的前缀或i i F W ∈是C W j ∈的

唯一可译码尾随后缀判断

肖志勇 2011522127 唯一可译码尾随后缀判断 一.唯一可译码尾随后缀判别法的编程流程图

二. 编程要求 已知:信源符号个数q,码字集合C; 输入:任意码字个数C与每个具体的码字在程序具体运行时从键盘输入; 输出:判别结果(是否唯一可译码) 三.程序验证举例 (1)唯一可译码 C={0,10,1100,1110,1011,1101} 程序运行结果如下图所示 (2)非唯一可译码 C={110,11,100,00,10} 运行结果如下图所示

四.编程实现 编程语言种类:C++ 运行坏境:Microsoft Visual C++ 6.0(SP6)英文版 运行时方法:打开*.dsw文件,点击链接(build),然后运行。 五.程序源代码 /*//////////////////////////////////////// ****唯一可译码尾随后缀判别法测试程序******* *姓名:肖志勇学号:2011522127* //////////////////////////////////////*/ #include"weiyikeyima.h" int main() { int Cnt; cout<<"请输入码字的个数:"<>Cnt; Cp=input(Cp,Cnt);//读取用户输入构造码字集合C

if(!is_singal_code(Cp))//如果是奇异码则一定不是唯一可译码 { if(fc_can_construt(Cp,Cp))//如果可以构成F集合 { Fp=init_fset(Cp);//构造第一个初始集合F for(;;) { if(fitem_is_setc(Cp,Fp))//判断F中是否有元素为C中码字 { result_output(false);//输出结果,不是唯一可译码 } else { if(fc_can_construt(Cp,Fp)&&!is_repeated)//判断C和F是否能够继续构造F集合 Fp=construct_fset(Cp,Fp);//如果可以构造继续构造集合F else result_output(true);//输出判决结果,是唯一可译码,并结束程序 } } } else { result_output(true);//是唯一可译码,输出结果结束程序 } } else { result_output(false);//不是唯一可译码,输出结果并且结束程序。 } return 0; }

信息论与编码实验报告

信息论与编码实验报告 学院:计算机与通信工程学院 专业:计算机科学与技术 班级:计1203班 学号: 姓名: 2014年12月29日

实验一唯一可译码判别准则 实验目的: 1.进一步熟悉唯一可译码判别准则; 2.掌握C语言字符串处理程序的设计和调试技术。 实验内容: 1.已知:信源符号数和码字集合C; 2.输入:任意的一个码,码字的个数和每个具体的码字在运行时从键盘输入; 3.输出:判决(是唯一可译码/不是唯一可译码);循环(若继续判决则输入1循环判决,否则输入0结束运行)。 实验原理: 根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。 算法:1、考察C 中所有的码字,若Wi是Wj的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1中; 2、考察C和Fi俩个集合,若Wi ∈C是Wj∈F的前缀或Wi ∈F是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中; 3、F=∪Fi即为码C的尾随后缀集合; 4、若F中出现了C中的元素,算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。 实验环境及实验文件存档名: 1.实验环境:visual C++ 6.0 2.文件名:weiyikeyi.cpp 实验结果及分析: 1.源代码: #include #include char c[100][50]; char f[300][50]; int N,sum=0; //N为输入码字的个数,sum为尾随后缀集合中码字的个数 int flag;//判断是否唯一可译标志位 void patterson(char c[],char d[]) //检测尾随后缀 { int i,j,k; for(i=0;;i++) { if(c[i]=='\0'&&d[i]=='\0')//2字符串一样,跳出

信息论上机实验

信道容量的迭代算法: #include #include #include #include #include #define DELTA 1e-6 /*delta 阈值*/ float log2(float x) { return log(x)/log(2); } int main(void) { register int i,j; register int k; int r,s; float *p_i = NULL; float **p_ji = NULL; float **phi_ij = NULL; float C,C_pre,validate; float *sum = NULL; float p_j; fscanf(stdin,"%d",&r); fscanf(stdin,"%d",&s); p_i = (float *) calloc(r,sizeof(float)); p_ji = (float **) calloc(r,sizeof(float)); for(i = 0;i

p_ji[i] = (float *)calloc(s,sizeof(float)); phi_ij = (float **)calloc(r,sizeof(float *)); for(i = 0; iDELTA) { fprintf(stdout,"invalid input data.\n"); exit(-1); } } fprintf(stdout,"Starting... \n"); for(i = 0; i

信息论与编码 实验内容

<信息论与编码> 实验内容 1. 信息熵 输入信源X 和Y 的概率分布(信源X,Y 的概率,联合概率,条件概率),输出各种信息的各种熵值。 (包括单符号信源,离散无记忆信源,离散平稳有记忆信源,马尔可夫信源。) (),(),(),()(),()(),(;)n H X H Y H X Y H Y X H XY H Y H Y X I Y X H , 2. 信道容量 输入信道矩阵,输出信道矩阵的类型;对不同的类型,计算相应的信道容量。 (三种特殊信道;三种对称信道;一般信道;组合信道) 3. 无失真信源编码 3.1 统计编码:输入信源符号概率,输出对应的码子 和编码效率。(香农编码,香农-费诺-艾利斯编码,霍夫曼编码,费诺编码;比较各种编码的优劣) 3.2 LZW 编码,算数编码:输入信源符号概率,输出 对应的码子和编码效率。

4.有噪信道编码 4.1 输入信道矩阵和信源概率,以及信源N次扩展后, 输出译码规则和平均错误率。(最优译码和最大释然译码规则;信源N次扩展后,选择的码字个数与最小码距和平均错误率的关系) 4.2 纠错编码: 4.2.1 线性分组码:输入校验方程和接收码子, 输出校验矩阵和生成矩阵,所有的可用码子,最小距离,标准阵列和预估的发送码字。 4.2.2 循环系统码:输入(n,k)和接收码子,输 出校验矩阵和生成矩阵,所有的可用码子,最小距离,标准阵列和预估的发送码字。 5.其他 5.1 编程验证平均互信息是输入分布的上凸函数;是 条件概率的下凸函数。 5.2 唯一可译码的判决准则。 5.3 。。。。。。

<信息论与编码> 实验报告1.封面 2.正文 一.实验项目 二.实验内容 三.主要程序代码 四.实验结果 五.实验体会

唯一可译码的判别程序实现

唯一可译码的判另I」 程序实现 姓名:周浩勇 学号:1023013455 专业:通信工程

引言 信源编码的设计准则是,设计完成的编码必须是唯一可译码才能够被使用。根据唯一可译码的定义:任意有限长的码元序列,只能被唯一地分割成一个个的码字,便被称为唯一可译码[2 ], 希望在得到一组编码之后,能够判断所设 计出来的是否是唯一可译码。唯一可译码存在性的判别,可以通过Kraft不等式给出唯一可译码存在的充分必要条件 , 即:D进制码字集合C = {C1, C2,…,Cn }, 码集中每一C i (i =1,2,…,n)都是一个D进制符号串,设C1, C2,…,Cn 对应的码长分别是L1, L 2,…,Ln , 则存在唯一可译码的 n 充要条件是i±D i < 1 显然,克劳夫特不等式只涉及唯一可译码的存在问题而不涉及具体的码。它强调的是存在,但这并不是唯一可译码判断的充要条件。也就是说,唯一可译码一定满足克拉夫特不等式,但是反之,满足克拉夫特不等式的码不一定是唯一可译码。 二算法的实现 目前,常用的判别唯一可译码的方法有两种:一种是根据异前缀码来进行判断的方法,另一种是由A. A. Sardinas 和 G. W. patterson 于1957年提出的算法。以下具体描述这两

种算法。 方法一:根据异前缀码是唯一可译码来进行判断。其步骤如下:首先,观察是否为非奇异码。若是奇异码,肯定不是唯一可译码;其次,计算是否满足Kraft不等式。若不满足一 定不是唯一可译码;最后,将码画成一棵码树图,观察是否满足异前缀码的码树图的构造,若满足则是唯一可译码。这 种方法的理论基础是异前缀码一定是唯一可译码,通过经典的Kra ft不等式及码树图进行判别。但它的缺点也是显而易见的,若不是异前缀码时,则此方法无法判断是否是唯—可译码。方法二:使用A. A. Sardinas 和G. W. Patterson 设计的 判断法。其判断准则为:计算分组码C中所有可能的尾随后缀集合F,观察F中有没有包含任一码字,若无则为唯一可译码;若有则一定不是唯一可译码。算法中的关键为尾随后缀集合F的构造。步骤如下: (1)考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中; ⑵考查C和Fi两个集合,若Wj € C是Wi€ Fi的前缀或 Wi€ Fi是Wj €C的前缀,则将相应的后缀作为尾随后缀码 放入集合Fi+1 (3)F= U Fi即为码C (4)若F中出现了C中的元素,则算法终止,返回假(C不是

优秀唯一可译码判断实验报告

实验三唯一可译码判断 一、实验目的 (1)进一步熟悉唯一可译码判决准则; (2)掌握C语言字符串处理程序的设计和调试技术 二、实验要求 (1)已知:信源符号个数,码字集合C。 (2)输入:任意的一个码。码字个数和每个具体的码字在运行时从键盘输入(3)输出:判决(是唯一可译码/不是唯一可译码) (4)源程序格式整齐清晰,注释简单明了。 三、算法 for all do if 是的前缀then 将相应的后缀作为一个尾随后缀码放入集合中 end if end for loop for all do for all do if 是的前缀then 将相应的后缀作为一个尾随后缀码放入集合中 else if 是的前缀then 将相应的后缀作为一个尾随后缀码放入集合中 end if end for end for if return False else if F 中没有出现新的元素then return True

end if end loop 四、实验数据源 判断的码字可以由键盘输入或者是程序中预先设置 五、实验组织运行要求 以学生自主训练为主的开放模式组织教学 六、实验条件 (1)微机 (2)MATLAB或者C语言编程 七、实验报告 实验预习:唯一可译码的判断的基本原理 实验记录:实验报告 实验代码: #include #include #include intN,max=0; char q[100][100]; char m[300][100]; bool flag;/*字符串c与d的比较*/ void mycmp(char c[],char d[]) { inti,j,k; for(i=0;;i++) { if(c[i]=='\0'&&d[i]=='\0')//2字符串一样,跳出 break; if(c[i]=='\0')//d字符串比c字符串长,且c字符串的前面与d字符串一样,并把d 字符串多余的存到m[i]中

信息与编码理论实验报告

实验一:唯一可译判决准则 1、实验目的 (1)进一步熟悉唯一可译判决准则; (2)掌握C语言字符串处理程序的设计和调试技术。 2、实验要求 (1)已知:信源符号个数N,码字集合C; (2)输入:任意一个码字集合C。码字个数和每个具体的码字在运行时从键盘输入;(3)输出:判决(是唯一可译码/不是唯一可译码)。 3、算法 (1)设So为原始码字的集合,首先考察So中所有码字,如果So中有相同码字若码字,则不是唯一可译,停止;否则,若码字wj是码字wi的前缀,则将后缀列为S1中的元素;(2)若产生的新集合为空,则为唯一可译,停止;否则转入步骤(1)继续比较考察So和这个新的集合。 4、代码 #include #include #include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #include"iostream.h" typedef struct mazi { char zifu[10]; struct mazi *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue;

int InitQueue(LinkQueue &Q)//构造一个空的队列Q { Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front)exit(OVERFLOW); Q.front->next=NULL; return OK; } int QueueLength(LinkQueue Q)//求队列长 { int i=0; QueuePtr p; p=Q.front; while(Q.rear!=p) { i++; p=p->next; } return i; } int EnQueue(LinkQueue &Q,char i[])//插入字符串i为Q的新队尾元素{ QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); if(!p)exit(OVERFLOW); strcpy(p->zifu,i); p->next=NULL; Q.rear->next=p; Q.rear=p; return OK; } int ClearQueue(LinkQueue &Q)//清空队列 { QueuePtr p,q; Q.rear=Q.front; p=Q.front->next; Q.front->next=NULL; while(p) { q=p; p=p->next; free(q); } return OK; }

试验三 信息编码

实验三:唯一可译码判断 实验学时:3 实验类型:(演示、验证、综合、√设计、研究) 实验要求:(√必修、选修) 一、实验目的 通过本次试验了解唯一可译码地判断原理;实现用C语言编写判断唯一可译码地程序二、实验内容 编程实现唯一可译码的判决准则―――Sardinas-Patterson算法 三、实验原理、方法和手段 Sardinas-Patterson算法描述: 设C为码字集合,按以下步骤构造此码的尾随后缀集合F: (1) 考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放 入集合F0中; (2) 考查C和Fi两个集合,若Wj∈C是Wi∈Fi的前缀或Wi∈Fi是Wj∈C的前缀, 则将相应的后缀作为尾随后缀码放入集合Fi+1中; (3)F=∪Fi即为码C的尾随后缀集合; (4) 若F中出现了C中的元素,则算法终止,返回假(C不是唯一可译码);否则若F 中没有出现新的元素,则返回真。 在我们设计的算法中,需要注意的是我们需要的是先输出所有尾随后缀的集合,然后再判断该码是否是唯一可译码,即如F中出现了C中的元素,则C不是唯一可译码,否则若F中没有出现新的元素,则C为唯一可译码。而不是F中出现C中的元素就终止,这也是在本题的要求中需要注意的问题。 1、概要设计: 由于需要判断尾随后缀,所以我们需要反复的比较C和F中的码字。 1)首先我们用一个b[30][30]的数组来存放所有的尾随后缀的集合;用Q记录所有尾随后缀的个数; 2)用数组a[30][30]来存放输入的码字,L[30]来存放码字的长度; 通过一个双重循环并调用houzhui(a[i],a[j],L[i],L[j])函数来找到a[30][30]中的为随后缀,即: for(i=0;i

实验二唯一可译码判决准则

湖南大学 信息科学与工程学院 实验报告 实验名称唯一可译码判决准则课程名称信息论与编码

1、实验目的 (1)进一步熟悉唯一可译码判决准则; (2)掌握C语言字符串处理程序的设计和调试技术。 2、实验要求 (1)已知:信源符号个数q、码字集合C。 (2)输入:任意的一个码。码字个数和每个具体的码字在运行时从键盘输入。(3)输出:判决(是唯一可译码/不是唯一可译码)。 3、算法的流程 输入码字集合X0 for 所有W i,W j∈X0 if 码字W i 是码字W j的前缀, 即将相应的后缀作为一个尾随后缀放入新集合X1 end if end for for 所有W i∈X0 for 所有W j∈X n-1 if W i 是W j的前缀, 即将相应的后缀作为一个尾随后缀放入新集合X n中 else if W j是W i的前缀, 即将相应的后缀作为一个尾随后缀放入新集合X n中 end if end for end fo r 构造尾随后缀集合X←X i if 有码字W i∈X0,W i∈X,则非唯一可译码 4、算法的程序 #include #include #include struct strings { char *string; struct strings *next;

}; struct strings Fstr, *Fh, *FP; //输出当前集合 void outputstr(strings *str) { do { cout<string<next; }while(str); cout<b?b:a; } inline int MAX(int a, int b) { return a>b?a:b; } #define length_a (strlen(CP)) #define length_b (strlen(tempPtr)) //判断一个码是否在一个码集合中,在则返回0,不在返回1 int comparing(strings *st_string,char *code) { while(st_string->next) { st_string=st_string->next; if(!strcmp(st_string->string,code)) return 0;

相关文档
最新文档