通信原理折线PM量化编码解码.docx

上传人:b****3 文档编号:3750488 上传时间:2022-11-25 格式:DOCX 页数:19 大小:409.45KB
下载 相关 举报
通信原理折线PM量化编码解码.docx_第1页
第1页 / 共19页
通信原理折线PM量化编码解码.docx_第2页
第2页 / 共19页
通信原理折线PM量化编码解码.docx_第3页
第3页 / 共19页
通信原理折线PM量化编码解码.docx_第4页
第4页 / 共19页
通信原理折线PM量化编码解码.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

通信原理折线PM量化编码解码.docx

《通信原理折线PM量化编码解码.docx》由会员分享,可在线阅读,更多相关《通信原理折线PM量化编码解码.docx(19页珍藏版)》请在冰豆网上搜索。

通信原理折线PM量化编码解码.docx

通信原理折线PM量化编码解码

通信原理折线PM量化编码解码

作者:

日期:

程序用matlab实现,全都运行过,完美实现PCM功能

班级

通信原理大作业

--抽样量化编码译码的Matlab实现

电子工程学院

********

学院学号学生姓名授课老师

一、前言

通信系统的信源有两大类:

模拟信号和数字信号。

例如:

话筒输出的语音信号属于模拟信号;而文字、计算机数据属于数字信号。

数字信号相比于模拟信号有抗干扰能力强、无噪声积累的优点。

因此,若输入是模拟信号,则在数字通信系统的信源编码部分需对输入模拟信号进行数字化。

数字化需要三个步骤:

抽样、量化和编码。

抽样是指用每隔一定时间的信号样值序列来代替原来在时间上连续的信号,也就是在时间上将模拟信号离散化。

量化是用有限个幅度值近似原来连续变化的幅度值,把模拟信号的连续幅度变为有限数量的有一定间隔的离散值。

编码则是按照一定的规律,把量化后的值用二进制数字表示,然后转换成二值或多值的数字信号流。

三个步骤如下图所示:

一孔0

*1r、

J

J

1—

I

/抽;

模拟信号

「抽样

二痒量化

I

rl…i

t

二、模拟信号的抽样

(1)低通模拟信号的抽样原理

抽样定理:

设一个连续模拟信号m(t)中的最高频率

T<1/2fH的周期性冲激脉冲对它抽样时,m(t)将被这些抽样值所完全确定。

下面对这个定理进行证明。

设有一个最高频率小于fH的信号m(t)。

将这个

信号和周期性单位冲激脉冲T(t)相乘,乘积就是抽样信号,它是一系列间隔为T

秒的强度不等的冲激脉冲。

这些冲激脉冲的强度等于相应时刻上信号的抽样值。

现用mS(t)m(kT)表示此抽样信号序列。

故有mS(t)m(t)T(t)

令M(f)、(f)和Ms(f)分别表示m(t)、T(t)和ms(t)的频谱。

计算可得:

11

Ms(f)M(f)(fnfs)M(fnfs)

n

上式表明,抽样信号的频谱Ms(f)是无数间隔频率为nfs的原信号频谱M(f)相叠加而成。

m(t)、丁⑴和ms(t)的时域和频域波形如下图所示:

信号m(t)的最高频率小于fH,若频率间隔fs2fH,则Ms(f)中包含的每个原信号频谱M(f)之间互不重叠。

这样就能够从Ms(f)中用一个低通滤波器分离出m(t)的频谱M(f),也就是能从抽样信号中恢复原信号。

(2)模拟信号抽样的Matlab实现及采样定理的验证

(a)编程思想

令输入的模拟信号m(t)=2.53sin(400t)2cos(140t),由已学知识可知:

m(t)的最高频率fH=200Hz,由抽样定理知:

当采样频率fs400Hz(采样周期小于1/400s)时,抽样信号可以完全确定原信号。

由傅里叶变换知识得:

模拟信号m(t)=2.53sin(400t)2cos(140t)的频谱M(f)=2.5(f)1.5(f200)(f70)1.5(f200)(f70)。

分别令

采样频率fs400Hz和fsV400Hz,绘制出两种情况下各自抽样信号的频谱,与原

模拟信号的频谱进行比较。

若只有当采样频率大于400Hz时,抽样信号的频谱

才与原模拟信号相同,则可以验证采样定理的正确性。

(b)Matlab输出波形图

模拟信号时域波形

3000

2000

1000

0

-500-400-300-200-1000100200300400500

模拟信号频域波形

采样序列时域(不符合采样定理)

10

5

0

采样序列时域(符合采样定理)

-5

0100200300400500600700800

采样序列频域(符合采样定理)

2000

LILL

1:

L

L.

L

1500

-

-

1000

-

-

500

--

r-

1

rr甲

r

1

r

011111

-400-300-200-1000100200300400

(C)结论

由上图可知:

当采样频率小于2fH时,抽样信号的频谱发生了混叠。

而采样

频率大于2fH时,抽样信号的频谱与原模拟信号频谱相同

(d)Matlab源代码

%sampling.m$对模拟信号采样产生序列信号,并验证采样定理

t=0:

0.001:

1;%模拟信号时域和频域波形

x=2.5+3.*sin(200*2*pi*t)+2.*cos(70*2*pi*t);

figure

(1)

subplot(2,1,1)

plot(t,x);

title('模拟信号时域波形')

fs=linspace(-1000/2,1000/2,length(t));

xf=fftshift(fft(x));

subplot(2,1,2)

plot(fs,abs(xf))%可知,信号最大频率200Hz

title('模拟信号频域波形')

T=0.009;%不满足采样定理,采样周期大于1/400

n=0:

1:

1/T;

xn=2.5+3.*sin(200*2*pi*n*T)+2.*cos(70*2*pi*n*T);figure

(2)

subplot(2,1,1)

stem(n,xn)

title('采样序列时域(不符合采样定理)')

fns=linspace(-0.5/T,0.5/T,length(n));

xnf=fftshift(fft(xn));

subplot(2,1,2)

plot(fns,abs(xnf))

title('采样序列频域(不符合采样定理)')

T=0.0013;%满足采样定理,采样周期小于1/400

n=0:

1:

1/T;

xn=2.5+3.*sin(200*2*pi*n*T)+2.*cos(70*2*pi*n*T);figure(3)

subplot(2,1,1)

stem(n,xn)

title('采样序列时域(符合采样定理)')

fns=linspace(-0.5/T,0.5/T,length(n));

xnf=fftshift(fft(xn));

subplot(2,1,2)

plot(fns,abs(xnf))

title('采样序列频域(符合采样定理)')

三、抽样信号的非均匀量化编码(13折线法)

(1)脉冲编码调制简介

模拟信号抽样后变成时间离散的信号,经过量化后,此抽样信号才能成为数

字信号。

分析可知:

最简单的均匀量化器对于小输入信号很不利。

为了改善小信号时的信号量噪比,在实际应用中常采用非均匀量化。

非均匀量化时,量化间隔随信号抽样值的不同而变化。

信号抽样值小时,量化间隔V也小;信号抽样值大时,量化间隔V也变大。

1/81/41/2Ix

1/16

实际应用中,用13折线法近似A压缩律,来进行非均匀量化

图中横坐标x在0至1区间中分为不均匀的8段。

1/2至1间的线段称为第

8段;1/4至1/2间的线段称为第7段;1/8至1/4间的线段称为第6段;依此类推。

图中纵坐标y则均匀地划分作8段。

将与这8段相应的座标点(x,y)相连,就得到了一条折线。

在语音通信中,通常采用8位的PCM编码就能够保证满意的通信质量。

在13折线法中采用的折叠码有8位。

第一位c1表示量化值的极性正负。

面的7位分为段落码和段内码两部分,用于表示量化值的绝对值。

其中第2至4

位(c2c3c4)是段落码,共计3位,可以表示8种斜率的段落;其他4位(c5--c8)为段内码,可以表示每一段落内的16种量化电平。

段内码代表的16个量化电平是均匀划分的。

所以,这7位码总共能表示27二128种量化值

在下面的表中给出了段落码和段内码的编码规则

段落

序号

段落码

c2c3c4

段落范围(量

化单位)

8

111

1024~2048

7

110

512~1024

6

101

256~512

5

100

128~256

4

011

64~128

3

010

32~64

2

001

16~32

1

000

0~16

量化间隔

段内码

c5c6c7c8

15

1111

14

1110

14

1101

12

1100

11

1011

10

1010

9

1001

8

1000

7

0111

6

0110

5

0101

4

0100

3

0011

2

0010

1

0001

0

0000

 

在上述编码方法中,段内码是按量化间隔均匀编码的,但是因为各个段落的

斜率不等,长度不等,故不同段落的量化间隔是不同的。

其中第1和2段最短,

斜率最大,其横坐标x的归一化动态范围只有1/128。

再将其等分为16小段后,每一小段的动态范围只有(1/128)/(1/16)=1/2048。

第8段最长,其横坐标x的动态范围为1/2。

将其16等分后,每段长度为1/32。

假若采用均匀量化而仍希望对于小电压保持有同样的动态范围1/2048,则需要用11位的码组才行。

在采用非均匀量化,只需要7位就够了。

(2)13折线法编码的Matlab实现

(a)编程思想

上面“模拟信号的抽样”已经得到了时间离散、幅度连续的抽样信号。

若将

对抽样信号非均匀量化编码编出的8位码组用CiC2C3C4C5C6C7C8表示。

(1)抽样信号是ixn的矩阵,例如采样周期T=0.0013;n=0:

1:

1/T;贝U有770个抽样值,13折现法编码后得到的则是770X8的矩阵,一行对应一个抽样值的8位PC刚组。

每个抽样值的编码思想都是一样的,若要进行多个抽样值的编码,进行for循环即可。

下面阐述单个抽样值的编码思路。

(2)确定极性码c1:

利用matlab的符号函数sign(x):

x<0时,sign(x)=-1;

x=0时,sign(x)=0;x>0时,sign(x)=1。

所以,若sign(x)大于等于0,d=1;

否则C1=0o

例如:

+1000,sign(1000)=1,所以&=1。

(3)确定段落码c2c3c4:

PCM1折线编码的动态范围为-2048--2048,而上

一步骤中已经求出了各抽样信号极性,于是只要对抽样信号的绝对值分析即可。

故对抽样值依次进行取模、归一、乘以2048、取整的操作,可以将抽样值转化为0--2048之间的整数。

根据段落码与段落范围的关系,使用if语句即可确定

C2C3C4。

例如:

+1000,因为1000>128,故C2=1;又1000》512,故C3=1;又1000

<1024,故C4=0。

对于其他取值情况,判断方法与此类似。

(4)确定段内码C5C6C7C8:

每一段落均被均匀地划分为16个量化间隔,不过不同段落的量化间隔是不同的。

(3)中确定了段落编码,可以确定每段的起始值,再根据待编码值、所在段的起始值、所在段量化间隔的大小即可确定段内码。

例如:

+1000,C2C3C4=110,故1000处于第7段(二进制110转化为十进制得到6,6+1=7)

sp=[0,16,32,64,128,256,512,1024];%每段起始值

spmin=[1,1,2,4,8,16,32,64];%每段的最小量化间隔

再得到段起始值sp(7)=512,段最小量化间隔spmin(7)=32。

1000512

32

15.25,向负无穷方向取整得到15,再将15十进制转化为二进制,

得到1111,故C5C6C7C8=1111

令Matlab程序输入为S=1000,可得:

s=

1000

抽样信号进行13折线编码后的码组为(每一行代表一个抽样值,共1个值)

code=

11101111

(可知:

程序运行结果与上述分析结果相同)

(5)若码组矩阵初始化为全0阵,则只有当某个码为1时,才需要进行赋值。

例如:

-100,sign(-100)=-1,&=0。

而c,初始化值就为0,故可以不采取任何操作,保持初始值即可。

(b)Matlab输出结果

抽样得到的序列

取模、归一、乘2048、取整后的序列

 

1

1

0

0

0

0

0

1

1

0

0

1

1

1

1

0

1

0

0

1

1

0

770个值)

抽样信号进行13折线编码后的码组为(每一行代表一个抽样值,共

code=

1

0

1

1

0

1

1

0

1

1

0

0

0

1

0

0

0

1

1

1

0

1

(C)源代码

%pcmdepcmcomp.m对抽样信号进行量化编码译码,将译码输出值与原抽样值比较%13折线法编码源代码

T=0.0013;

n=0:

1:

1/T;

xn=2.5+3.*sin(200*2*pi*n*T)+2.*cos(70*2*pi*n*T);%采样产生的抽样信号

figure(4)

subplot(2,1,1)

stem(n,xn)

title('抽样得到的序列')

z=sign(xn);%判断S的正负

xnnor=abs(xn)/max(abs(xn));%xn取模并且归一化

S=2048*xnnor;

S=floor(S);%向负无穷方向取整

subplot(2,1,2)

stem(n,S)

axis([0,800,-2020,2020])

title('取模、归一、乘2048、取整后的序列')

code=zeros(length(S),8);%初始化码组矩阵为全零阵

%极性码第一位和段落码第二三四位

fori=1:

length(S)

ifz(i)>=0code(i,1)=1;%不改变依旧为0

end

if(S(i)>=128)

code(i,2)=1;

if(S(i)>=512)

code(i,3)=1;

if(S(i)>=1024)code(i,4)=1;

end

else

if(S(i)>=256)code(i,4)=1;

end

end

else

if(S(i)>=32)

code(i,3)=1;

if(S(i)>=64)code(i,4)=1;

end

else

if(S(i)>=16)

code(i,4)=1;

end

end

end

end

%段内码,第五六七八位

N=zeros(1,length(S));

fori=1:

length(S)

N(i)=bin2dec(num2str(code(i,(2:

4))))+1;%找到code位于第几段

end

sp=[0,16,32,64,128,256,512,1024];%每段起始值

spmin=[1,1,2,4,8,16,32,64];%每段的最小量化间隔

fori=1:

length(S)

loc=floor((S(i)-sp(N(i)))/spmin(N(i)));%向负无穷方向取整,段内第几段

if(loc==16)

loc=loc-1;

end%正负2048时,loc=16,当做15处理

fork=1:

4

code(i,9-k)=mod(loc,2);loc=floor(loc/2);

end%十进制数转化为4位二进制

end

fprintf('抽样信号进行13折线编码后的码组为(每一行代表一个抽样值,共%d个值)

',length(S))

code%code为13折线译码后的码组,是length(S)*8的矩阵

(3)8位PCM码的译码实现

(a)编程思想

(1)由q可以确定抽样值的正负,&=1,抽样值为正;否则为负。

(2)c2C3C4确定抽样值的段落序号,GC6C7Q确定抽样值在段内第几个量化间隔。

(3)译码时,通常是将码组转化为此量化间隔的中间值。

例如:

+1000编码后的8位码组为1110111,对1110111进行解码。

G=1,故抽样值为正。

qC3C4=110,二进制转化为十进制为6,6+1=7,故抽样值在第7段。

液落起点值

%最小量化间隔

sp=[0,16,32,64,128,256,512,1024];

spmin=[1,1,2,4,8,16,32,64];

C5C6C7C8=1111,二进制转为十进制为15,故抽样值在段内第15段。

sp(7)=512,spmin(7)=32。

11101111译码值为(992+1024)/2=1008。

也就是sp(7)+spmin(7)x(15+0.5)=512+32X15.5=1008

故利用段落码和段内码即可编程实现译码。

令Matlab译码程序输入为[11101111],运行结果如下:

dcode=

11101111

8位PCM码译码后的数值为(共1个值)

dS=

1008

(可知:

与上面理论分析结果一致)

(b)Matlab输出结果(将前面编码得到770x8的码组矩阵作为输入)

8位PCM码译码后的归一化数值为(共770个值)

dS=

Columns1through10

0.60940.9531

0.3984

-0.0996

0.2578

0.4609

-0.0684-0.2070

0.4922

0.7969

Columns11through20

0.32030.2891

0.8281

0.7344

-0.0149

-0.0801

0.4141

0.2734

-0.19920.1523

Columns21through30

0.82810.6719

0.2070

0.5156

0.8594

0.2891

-0.2461

0.1289

0.47660.0645

Columns31through40

-0.08010.6094

0.9219

0.4141

0.2148

0.6719

0.6094

-0.1191

-0.19920.3828

Columns41through50

0.3984-0.0361

0.2578

0.9219

0.7656

0.1758

0.3359

0.6719

0.2070-0.3203

(c)源代码

%十三折线解码源代码

dcode=code;%将上面产生的770个码值作为输入‘decode是length(S)*8的矩阵sp=[0,16,32,64,128,256,512,1024];%段落起点值

spmin=[1,1,2,4,8,16,32,64];%最小量化间隔

dS=zeros(1,size(dcode,1));

fori=1:

size(dcode,1)

par=bin2dec(num2str(dcode(i,(2:

4))))+1;%段落位置

parmid=bin2dec(num2str(dcode(i,(5:

8))));%段间位置dS(i)=sp(par)+spmin(par)*(parmid+0.5);

ifdcode(i,1)==0%符号位

dS(i)=-dS(i);

end

end

dS=dS/2048;%归一化

fprintf('8位PCM码译码后的归一化数值为(共%d个值)',size(dcode,1))

dS%dS为将8位PCM码解码后的归一化值

四、总结

对抽样信号进行量化、编码、译码三个步骤后,得到770个归一化数值,将

这些数值与归一化的原抽样信号比较,可分析13折线A律特性编码法的优劣性。

由于数值较多,用Matlab只比较0至0.05的抽样信号与解码所得值,即比较前39个值。

输出图形如下:

1

原抽样值

编码解码后的值

原抽样值与解码后的值比较图(均归一化)

0.8

0.6

0.4

0.2

-0.2

-0.4

0

10

15

20

25

30

35

40

源代码:

%作图比较原抽样值与量化编码译码后的值(简便起见,比较0至0.05)

T=0.0013;

nbuf=0:

1:

0.05/T;

xnbuf=2.5+3.*sin(200*2*pi*nbuf*T)+2.*cos(70*2*pi*nbuf*T);%0至0.05的抽样值

figure(5)

plot(nbuf,xnbuf/max(abs(xxnbuf)),'p',nbuf,dS(1:

(length(nbuf))),'ro')%原模拟信号幅度归一化legend('原抽样值','编码解码后的值')

title('原抽样值与解码后的值比较图(均归一化)')

分析:

由上图知,除个别数值外,解码所得值与原抽样信号基本相同。

而且,误差较大的点,其幅度也较大,这也与预期相符。

因为13折线法不同段落的量化间

隔是不同的,幅度越大,量化间隔也就越大,误差越大;幅度较小值时,误差较小。

这也是13折线法的优点:

对于不同的信号强度可以保持信号量躁比恒定。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1