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折线法的优点:
对于不同的信号强度可以保持信号量躁比恒定。