关于信源编码:
一、信源编码的三种常见方式:
算术编码、哈夫曼编码、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的诸多函数很方便,我们每次编程时都不用再“造轮子”,需要做的工作是“组装”。