用MATLAB程序开发设计PCM编码调制系统文档格式.docx
《用MATLAB程序开发设计PCM编码调制系统文档格式.docx》由会员分享,可在线阅读,更多相关《用MATLAB程序开发设计PCM编码调制系统文档格式.docx(19页珍藏版)》请在冰点文库上搜索。
式中表示归一化输入,定义为
以分贝(dB)计的SQNR为
量化以后,这些已量化的电平用比特对每个已量化电平进行编码.编码通常使用自然二进制码(NBC),即最低电平映射为全0序列,最高电平映射为全1序列,全部其余的电平按已量化值的递增次序映射。
非均匀量化的基本原理
正变换:
,其中是归一化输入(),是一个参数,在标准律的非线性中它等于255。
反变换:
在非均匀量化PCM中,输入信号首先通过一非线性环节以减小输入的动态范围,再将输出加到某一均匀PCM系统上。
在接收端,输出再通过另一非线形环节,该环节是在发送端所用的非线性环节的逆特征。
这样,总的效果就等效于一个在量化电平之间具有非均匀间隔的PCM系统。
非均匀量化时,量化器随着输入信号的大小采用不同的量化间隔,大信号时采用大的量化间隔,小信号时采用小的量化间隔,可以以较少的量化电平数达到输入动态范围的要求
一般对语音信号传输来说,所使用的非线性可以是律的非线性,或是A律的非线性,中国和欧洲采用A率压缩特性(A=87.56),北美和日本采用律压缩特性(=255),压缩特性分别如下:
μ律:
A律:
式中,x为归一化输入,y为归一化输出,A、为压缩系数,上式也可以表示为,
由于A律在工程上不好实现,所以我们经常用近似的13折线压缩法去代替A率压缩
下表列出了计算值与13折线时的值的比较。
计算值与A律13折线时值的比较
1
按折线
分段时的
段落
2
3
4
5
6
7
8
斜率
16
表中第二行的值是根据时计算得到的,第三行的值是13折线分段时的值。
可见,13折线各段落的分界点与曲线十分逼近,同时按2的幂次分割有利于数字化。
A律压扩特性是连续曲线,A律不同压扩特性也不同,在电路上实现这样的函数规律是相当复杂的。
实际中,往往采用近似于A律函数规律的13折线()的压扩特性。
这样,它基本上保持了连续压扩特性曲线的优点,。
本设计中所用到的PCM编码正是采用这种压扩特性来编码的。
在13折线法中,无论输入信号是正是负,均按8段折线(8个段落)进行编码。
若用8位折叠二进制码来表示输入信号的抽样量化值,其中用第一位表示量化值的极性,其余七位(第二位至第八位)则表示抽样量化值的绝对大小。
具体的做法是:
用第二至第四位表示段落码,它的8种可能状态来分别代表8个段落的起点电平。
其它四位表示段内码,它的16种可能状态来分别代表每一段落的16个均匀划分的量化级。
这样处理的结果,8个段落被划分成128个量化级。
段落码和8个段落之间的关系如表1所示;
段内码与16个量化级之间的关系见表2所示。
表1段落码表2段内码
段落序号
段落码
段落范围
量化间隔
段内码
111
1024-2048
15
1111
0111
110
512-1024
14
1110
0110
101
256-512
13
1101
0101
100
128-256
12
1100
0100
011
64-128
11
1011
0011
010
32-64
10
1010
0010
001
16-32
9
1001
0001
000
0-16
1000
0000
在13折线中,用8位的折叠二进制码表示信号量化值的具体步骤为:
用第2到4位表示段落码,8个段落的起点电平由它的8种可能状态来分别表示。
其他四位表示段内码,每一个段落它的16个均匀的划分量化级由它的16种可能状态来分别表示。
这样就使得8个段落被划分为128个量化级。
再加上负的,相当于一共有256种量化电平数。
解码时,码字电平=段落起始电平+8M5+4M6+2M7+M8*Δk
解码电平=码字电平+Δk2
三、MATLAB程序及仿真结果
注:
1、为便于阅读,本节仅仅给出核心代码,详细代码请见本文附录。
2、文中的图片若不够清晰,子文件夹中还有高清输出的图片(600ppi)
1、生成题中要求的动态信号
题中要求输入模拟信源的最高频率限制在4KHz以内(可以是正弦信号,也可随机产生信号);
信号平均功率的动态范围≥30dB(自行设定幅度区间)。
为了能够适应不同条件,本文生成的是频率范围在0~4k之间变化,动态范围在30~35dB之间的随机信号。
fana=10^4;
%analogfreq
T=1/fana;
%analoginterval
SignalLength=64;
tana=(0:
SignalLength-1)*T;
RealDynamicRange=0;
while(RealDynamicRange<
=30||RealDynamicRange>
=35)
while(RealDynamicRange<
signal=randi([-300,300],1,SignalLength)/10;
%raiseaccuracy
idx=find(signal==0);
%findall0
signal(idx)=1;
%set0.1totheseindexes
RealDynamicRange=20*log10(max(abs(signal))/min(abs(signal)));
end
%checkfreqrange-------------------
NFFT=2^nextpow2(SignalLength);
ini_fft=fft(signal,NFFT)/NFFT*2;
%showrealityamplitude
f=fana/NFFT*(0:
1:
NFFT-1);
abs_ini_fft=abs(ini_fft);
%limitbandbelow4k
k_stop_freq=floor(4000*NFFT*T);
ini_fft(:
k_stop_freq:
NFFT-k_stop_freq)=0;
%lpf
inisignal=real(ifft(ini_fft)*NFFT/2);
%gettheinputsignal
RealDynamicRange=20*log10(max(abs(inisignal))/min(abs(inisignal)));
end
%checkfreqrangeagain
inisignal_fft=fft(inisignal,NFFT)/NFFT*2;
abs_inisignal_fft=abs(inisignal_fft);
原始产生的随机信号,按照题目要求处理过之后的信号以及频谱如下图所示:
分别为原始随机信号、原始随机信号的带宽;
处理之后带限在0~4kHz之内的信号,处理之后的信号的带宽。
生成信号的动态范围RealDynamicRange本次随机产生结果为34.8dB。
2、信号采样
本节对上述产生的信号进行采样,采样的频率为10000Hz。
%%%%%%%%%%%%%%%%%%%%sampling%%%%%%%%%%%%%%%%%%%%%%%%%
fsam=10^5;
%samplingfreq
Tsam=1/fsam;
tsam=0:
Tsam:
max(tana);
sigsampling=interp1(tana,inisignal,tsam,'
linear'
);
subplot(2,1,1);
plot(tana,inisignal);
title('
analogsignal'
xlabel('
t/s'
ylabel('
f(t)'
subplot(2,1,2);
stem(tsam,sigsampling,'
Marker'
'
none'
samplingsignal'
fs(t)'
print-r600-djpegAnalogAndSamplingSignal;
采样前后信号为
3、信号的均匀量化
%%%%%%%%%%%%%%%%%%%uniformquantization%%%%%%%%%%%%%%%%%%%%%%
N_uniquan=round((25-20*log10(min(abs(inisignal))/max(abs(inisignal)))-4.77)/6.02);
M_uniquan=2^N_uniquan;
sig_uniquan=quant(inisignal,M_uniquan,max(abs(inisignal)))'
;
plot(tana,inisignal,'
b'
holdon;
plot(tana,sig_uniquan,'
r'
print-r600-djpegUniQuan;
delta=2*(max(abs(sig_uniquan)))/(M_uniquan);
sig_uniquancode=round((sig_uniquan-min(sig_uniquan))/delta);
sig_uniquancode_s=dec2bin(sig_uniquancode,N_uniquan);
fid=fopen('
sig_uniquancode_s.txt'
w'
fori=1:
length(inisignal)
fprintf(fid,'
%s\r\n'
sig_uniquancode_s(i,:
));
fclose('
all'
量化之前的信号与量化之后恢复的信号分别为,本次信号均匀量化所需的量化位数为9。
量化信噪比小于25dB。
均匀编码结果如附2所示。
4、PCM编解码
%%%%%%%%%%%%%%%%%%%%%%A_PCM%%%%%%%%%%%%%%%%%%%%%%%%
UniTo1=inisignal/max(abs(inisignal));
%jxmdlmdnm
jxm=zeros(1,length(UniTo1));
dlm=jxm;
dnm=jxm;
quannumdlm=jxm;
length(UniTo1)
%jxm
if(UniTo1(i))<
jxm(i)=0;
elsejxm(i)=1;
%dlm
tmpsig=abs(UniTo1(i));
quannumdlm(i)=round(tmpsig/(1/2048));
startquanV=[0,16,32,64,128,256,512,1024];
quaninterval=[1,1,2,4,8,16,32,64];
if(quannumdlm(i)<
16)
dlm(i)=0;
elseif(quannumdlm(i)>
=16&
&
quannumdlm(i)<
32)
dlm(i)=1;
=32&
64)
dlm(i)=2;
=64&
128)
dlm(i)=3;
=128&
256)
dlm(i)=4;
=256&
512)
dlm(i)=5;
=512&
1024)
dlm(i)=6;
else
dlm(i)=7;
%dnm
dnm(i)=floor((quannumdlm(i)-(startquanV(dlm(i)+1)))/quaninterval(dlm(i)+1));
if(dnm(i)==16)
dnm(i)=15;
jxm_s=dec2bin(jxm);
dlm_s=dec2bin(dlm,3);
dnm_s=dec2bin(dnm,4);
sig_pcmquancode_s.txt'
length(jxm);
%s%s%s\r\n'
jxm_s(i,:
),dlm_s(i,:
),dnm_s(i,:
decodeV=zeros(1,length(inisignal));
recodeV=zeros(1,length(inisignal));
diffpcmquan=zeros(1,length(inisignal));
decodeV(i)=startquanV(dlm(i)+1)+(dnm(i)+0.5)*quaninterval(dlm(i)+1);
diffpcmquan(i)=quannumdlm(i)-decodeV(i);
recodeV(i)=decodeV(i)/2048*max(abs(inisignal));
if(jxm(i)==0)
recodeV(i)=-recodeV(i);
采用了A律13折线PCM编解码,所得的原始信号、解码信号、量化误差如下图所示:
可见,很好地复原了原始信号,量化误差的最大值不超过30,编码结果在附3。
附1:
完整程序
clc;
clear;
tic;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%É
ú
³
É
¶
¯
Ì
¬
Ð
Å
º
-------------
subplot(2,2,1);
plot(tana,signal);
%forbettervisualeff
randomsignal'
%saveas(gcf,'
randomsignal.bmp'
bmp'
subplot(2,2,2);
plot(f(1:
NFFT/2),abs_ini_fft(1:
NFFT/2));
randomsignalband'
f/hz'
f(w)'
randomsignalband.bmp'
subplot(2,2,3);
initialsignal'
initialsignal.bmp'
subplot(2,2,4);
NFFT/2),abs_inisignal_fft(1:
initialsignalband'
print-r600-djpeginputsignal;
initialsignalband.bmp'
%checkdynamicrangeagain
%RealDynamicRange=20*log10(max(abs(sigsampling))/min(abs(sigsampling)));
leng