matlab通信系统建模2.信源编解码

本文介绍了MATLAB中三种常见的信源编码方法:算术编码、哈夫曼编码和LZ编码,并详细展示了MATLAB如何实现算术编码的编解码过程。同时,讨论了信源编码在模拟信号数字化传输中的作用,包括抽样、量化和编码。此外,还探讨了A率压缩的压缩与解压缩原理。最后,通过示例演示了Huffman编码的创建、编码和解码操作,验证了解码结果的正确性。
摘要由CSDN通过智能技术生成

关于信源编码:

一、信源编码的三种常见方式:

算术编码、哈夫曼编码、LZ编码

二、信源编码的作用

1、有效性(去冗杂)

2、模/数转换:模拟信号的数字传输,需要利用信源编码器,进行采样、量化和编码将模拟信号转换成数字信号,再利用数字基带/频带传输系统传输信号,最后在接收端利用信源解码器,将数字信号转换成模拟信号.

三、matlab实现

1、算术二进制编解码

算数编码实际的编译码过程比较复杂,但在性能上具有许多优点,特别是所需要的参数很少,不像哈夫曼编码那样需要一个很大的码表。从理论上说,只要已知信源符号集及其符号概率,算数编码的平均码长可以接近符号熵。

(1)编码:arithenco

code = arithenco(seq,counts)

code:算术编码序列

seq:信源产生的待编码序列

counts:信源产生序列的不同符合出现次数

clc;
clear;
length = 100;
seq = randsrc(1,length,[1,2;0.10,0.90]);%信源
counts = [0.10*length,0.90*length];%信源序列不同符合的出现次数
code = arithenco(seq,counts);%算术二进制编码

seq:

2    1    2    1    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    1    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    1    2    1    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    1    2    2    1    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2

code:

0    0    0    1    1    1    0    1    0    1    1    1    1    1    1    1    0    1    0    1    0    1    0    1    1    1   1    1    1    0    0    0    0    0    0    0    0    0    0    1    1    1    0    1    0    1

(2).解码

arthdeco

dseq = arthdeco(code,counts,length)

验证解码结果:

clc;
clear;
length = 100;
seq = randsrc(1,length,[1,2;0.10,0.90]);%信源
counts = [0.10*length,0.90*length];%信源序列不同符合的出现次数
code = arithenco(seq,counts);%算术二进制编码
dseq = arithdeco(code,counts,length);%解码
isequal(seq,dseq)%比较两个序列是否一样

ans=1 

2、模拟信号的数字传输——信源编码器之A率压缩

信源编码也称作量化/信号格式化、常用的有A/Mu率压缩

抽样是把时间连续的模拟信号转换成时间上离散、幅度连续的抽样信号;

量化是把时间离散、幅度连续的抽样信号转换成时间离散、幅度离散的数字信号;

编码是将量化后的信号(非二进制)编码形成多位二进制码组成的码组表示抽样值,完成模拟信号到数字信号的转换。编码后的二进制码组经数字信道传输,在接收端,经过译码和滤波,还原为模拟信号。

(1).压缩:

compressed = compand(in,A,v,'A/compressor');

A = 87.6

V:输入信号最大幅度

'A/compressor':表示进行压缩

(2).解压缩(扩展)

expanded = compand(in,A,v,'A/expander');

不同A下:

 代码:

clc;
clear;
x =[0:0.001:1];
y1 = compand(x,1,max(x),'A/compressor');
y2 = compand(x,10,max(x),'A/compressor');
y3= compand(x,87.6,max(x),'A/compressor');
plot(x,y1,'*',x,y2,'-.',x,y3,'--');
legend('A=1','A=10','A=87.6')

3、Huffman编码

对概率大的符号分配较短码字,对概率小的符号分配较长码字。

3.1创建Huffman编码词典——对信源符号编码

[dict,avglen] = huffmandict(symbols,p)

dict = huffmandict(symbols,p)

symbols:信源符号

p:信源符号的概率向量

dict:编码词典,只对信源符号编码

avglen:平均码长

 3.2对信源序列编码

code = huffmanenco(sig,dict)

3.3解码

sige = huffmandeco(code,dict)

clc;
clear;
%% 信源
symbols = 1:6;%信源符号 
p = [.5 .125 .125 .125 .0625 .0625];%信源符号的概率分布
inputSig = randsrc(100,1,[symbols;p]);%信源序列
%% Huffman编码
dict = huffmandict(symbols,p);%Huffman的编码词典,对所有信源符号编码
code = huffmanenco(inputSig,dict);%编码,对信源序列
%% Huffman解码
sig = huffmandeco(code,dict);
%% 验证
isequal(inputSig,sig)%信源序列与解码后序列是否相同


结果:

ans=1

matlab的诸多函数很方便,我们每次编程时都不用再“造轮子”,需要做的工作是“组装”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值