中南学
信息编码实验报告
题 目
信源编码实验
指导教师
学 院
专业班级
姓名
学号
日期
目录
香农编码………………………………………3
实验目3
实验求3
编码算法3
调试程3
参考代码4
调试验证7
实验总结7
二哈夫曼编码………………………………………8
实验目8
实验原理8
数记录9
实验心10
香农编码
1实验目
(1)进步熟悉Shannon编码算法
(2)掌握C语言程序设计调试程中数值进制转换数值字符串间转换等技术
2实验求
(1)输入:信源符号数q信源概率分布p
(2)输出:信源符号应Shannon编码码字
3Shannon编码算法
1:procedure SHANNON(q{})
2 降序排列{}
3 for i1 q do
4 F()
5:
6:累加概率F()(十进制数)变换成二进制数
7:取数点二进制数字作第i消息码字
8:end for
9:end procedure
4 调试程
1fatal error C1083 Cannot open include file 'unistdh' No such file or directory
fatal error C1083 Cannot open include file 'valuesh' No such file or directory
原:unistdhvalueshUnix操作系统头文件
纠错:删
2error C2144 syntax error missing ')' before type 'int'
error C2064 term does not evaluate to a function
原:l_i(int *)calloc(nsizeof(int)) l_i缺少赋值符号通编译
纠错:添加赋值符号
3 error C2018 unknown character '0xa1'
原:识符号
纠错:错误处识符号改符合C语言规范符号
4 error C2021 expected exponent value not ' '
原:if(fabs(sum10)>DELTA) 行中DELTA宏定义正确
纠错:# define DELTA 0000001
5 error C2143 syntax error missing '' before '}'
原:少写号
纠错:应位置添加号
5 参考代码
# include
# include
# include
# include
# define DELTA 0000001*精度*
void sort(float*int)*排序*
int main(void)
{
register int ij
int n *符号数*
int temp*中间变量*
float *p_i *符号概率*
float *P_i *累加概率*
int *l_i *码长*
char * *C *码集合*
*sum检验数p缓存中间数*
float sump
*输入符号数*
fscanf(stdind&n)
*分配存址 *
p_i(float *)calloc(nsizeof(float))
P_i(float *)calloc(nsizeof(float))
l_i(int *)calloc(nsizeof(int))
* 存储信道传输概率*
for(i0i
*确认输入数*
sum00
for(i0i
if(fabs(sum(10))>DELTA)
fprintf(stderrInvalid input data \n)
fprintf(stdoutStarting…\n\n)
*降序排列概率*
sort (p_in)
*计算符号码长*
for(i0i
p(float)((log(p_i[i])))log(20)
l_i[i](int)ceil(p)
}
*码字分配存址*
C(char **)calloc(nsizeof(char *))
for(i0i
C[i](char *)calloc(l_i[i]+1sizeof(char))
C[i][0]'\0'
}
*计算概率累加*
P_i[0]00
for(i1i
*概率转变二进制编码*
for(i0i
for(j0j
*2整数部分位二进制码元*
P_i[i]P_i[i]*2
temp(int)(P_i[i])
P_i[i]P_i[i]temp
*整数部分01等00*
if(temp0)
C[i]strcat(C[i]0)
else
C[i]strcat(C[i]1)
}
}
*显示编码结果*
fprintf(stdoutThe output coding is \n)
for(i0i
fprintf(stdout\n\n)
*释放存空间*
for(in1i>0i)
free(C[i])
free(C)
free(p_i)
free(P_i)
free(l_i)
exit(0)
}
*泡排序法*
void sort(float *kint m)
{
int i1*外层循环变量*
int j1*层循环变量*
int finish0*结束标志*
float temp*中间变量*
while(i
finish1
for(j0j
*数移*
if(k[j]
tempk[j]
k[j]k[j+1]
k[j+1]k[j]
finish0
}
i++
}
}
}
6 调试验证:
程序结果:
7 实验总结
1949年香农噪声时通信文中提出信道容量概念信道编码定理信道编码奠定理基础噪信道编码定理(称香农第定理)指出码字均长度等信源熵噪信道编码定理(称香农第二定理)编码存定理指出信息传输速率信道容量存类编码信息传输错误概率意着计算技术数字通信发展纠错编码密码学迅速发展香农编码定理然指出理想编码器存性没出实码结构构造方法编码理正解决问题发展起科学理编码目优化通信系统
香农编码码符号概率短码表示概率长码表示程序中概率排序求码字次排序符号概率应
二 哈夫曼编码
1实验目务
1 理解信源编码意义
2 熟悉 MATLAB程序设计
3 掌握哈夫曼编码方法计算机实现
4 定信源进行香农编码计算编码效率
2实验原理介绍
1信源符号概率序排列 设法逆次序分配码字长度
2分配码字长度时首先出现概率 两符号概率相加合成概率
3合成概率成新组合符号概率重复述做法直剩两符号概率止
4完成概率序排列反逐步前进行编码次二分支赋予二进制码概率赋零概率赋1
5级开始前返回信源符号应码元序列相应码字
3实验容步骤
信源进行哈夫曼编码计算编码效率
(1) 计算该信源信源熵信源概率进行排序
(2) 首先出现概率两符号概率相加合成概率合成概率概率进行组合新概率组合重复述做法直剩两概率止反逐步前进行编码次两分支赋予二进制码概率赋1概率赋0
(3)级开始前返回信源符号应码元序列相应码字
(4)计算码字均码长出编码效率
4实验数记录
>> clear all
>> p[020 018 015 017 019 010 001]
l0
H0
Nlength(p)
for i1N
HH+(p(i)*log2(p(i)))
end
fprintf('信源信息熵:\n')
disp(H)
for i1N1
for ji+1N
if p(i)
mp(j)
p(j)p(i)
p(i)m
end
end
end
for i1N1
c(i)blanks(N*N)
end
c(N1N)'0'
c(N12*N)'1'
for i1N1 字符数组c码字赋值程记路径10
c(Ni1N1)c(Ni+1N*(find(m(Ni+1)1))(N2)N*(find(m(Ni+1)1)))
c(NiN)'0'
c(NiN+12*N1)c(Ni1N1)
c(Ni2*N)'1'
for j1i1
c(Ni(j+1)*N+1(j+2)*N)c(Ni+1N*(find(m(Ni+1)j+1)1)+1N*find(m(Ni+1)j+1))
end
end
for i1N
h(i1N)c(1N*(find(m(1)i)1)+1find(m(1)i)*N)码字赋值
ll(i)length(find(abs(h(i))~32))码字码长
end
lsum(p*ll)计算均码长
nHl计算编码效率
fprintf('编码码字:\n')
disp(h)输入序排列码字
fprintf('均码长:\n')
disp(l)输出均码长
fprintf('编码效率:\n')
disp(n)输出编码效率
5 实验心
知识浅薄验足阅历颇浅该程序设计方面足会学程中根学知识断修改完善争取慢慢趋完美
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档