数字通信系统
PCM抽樣的MATLAB程序設(shè)計按如下步驟進行:
(1)確定輸入的模擬信號為sa(200t);
(2)根據(jù)輸入的模擬信號,確定抽樣頻率,對輸入信號進行抽樣,并將正常抽樣和會產(chǎn)生失真的抽樣進行對比,對抽樣定理加以驗證;
(3)編寫程序,畫出滿足采樣定理和不滿足的時、頻域圖形。
MATLAB源程序:
function sample()
t0=10;?????????? ?????????????????%定義時間長度
ts=0.001;??? fs=1/ts;
t=[-t0/2:ts:t0/2]; ???????????????%定義時間序列
df=0.5;?????? ????????????????????%定義頻率分辨率
x=sin(200*t); m=x./(200*t+eps);
w=t0/(2*ts)+1;?? ?????????????????%確定t=0的點
m(w)=1;???????? ??????????????????%修正t=0點的信號值
m=m.*m;
[M,mn,dfy]=fft_seq(m,ts,df); ?????%傅立葉變換
M=M/fs;
f=[0:dfy:dfy*length(mn)-dfy]-fs/2; %定義頻率序列
figure(1)
subplot(2,1,1); plot(t,m);
xlabel('時間');ylabel('幅值');title('原始信號(fh=200/2piHz)的波形');
axis([-0.15,0.15,0,1.5]);
subplot(2,1,2);
plot(f,abs(fftshift(M)));
xlabel('頻率');ylabel('幅值');
axis([-500,500,0,0.03]);title('原始信號的頻譜');
t0=10;??? ?????????????????????????%信號持續(xù)的時間
ts1=0.005;?? ??????????????????????%滿足抽樣條件的抽樣間隔
fs1=1/ts1;
t1=[-t0/2:ts1:t0/2];????????????? ?%定義滿足抽樣條件的時間序列
x1=sin(200*t1);? m1=x1./(200*t1+eps);? w1=t0/(2*ts1)+1;???
m1(w1)=1;???? ?????????????????????%修正t=0時的信號值
m1=m1.*m1;?? ??????????????????????%定義信號
[M1,mn1,df1]=fft_seq(m1,ts1,df); ??%對滿抽樣條件的信號進行傅立葉變換
M1=M1/fs1;N1=[M1,M1,M1,M1,M1,M1,M1,M1,M1,M1,M1,M1,M1];
f1=[-7*df1*length(mn1):df1:6*df1*length(mn1)-df1]-fs1/2;
figure(2)??
subplot(2,1,1); stem(t1,m1);
xlabel('時間');ylabel('幅值');
title('抽樣正常(fs=200Hz)時的信號波形');axis([-0.15,0.15,0,1]);
subplot(2,1,2)
plot(f1,abs(fftshift(N1)));
xlabel('頻率');ylabel('幅值');axis([-500,500,0,0.05]);
title('抽樣正常時的信號頻譜');axis([-500,500,-0.01,0.03]);
t0=10;???? ??? %信號持續(xù)的時間
ts2=0.01;?? ??????? %不滿足抽樣條件的抽樣間隔
fs2=1/ts2;
t2=[-t0/2:ts2:t0/2]; ?%定義不滿足抽樣條件的時間序列
x2=sin(200*t2); m2=x2./(200*t2+eps);? w2=t0/(2*ts2)+1;??
m2(w2)=1;???? ? %修正t=0時的信號值
m2=m2.*m2;??? ??%定義信號
[M2,mn2,df2]=fft_seq(m2,ts2,df);%對不滿足抽樣條件的信號進行傅立葉變換
M2=M2/fs2;N2=[M2,M2,M2,M2,M2,M2,M2,M2,M2,M2,M2,M2,M2];
f2=[-7*df2*length(mn2):df2:6*df2*length(mn2)-df2]-fs2/2;
figure(3)
subplot(2,1,1); stem(t2,m2);
xlabel('時間');ylabel('幅值');title('抽樣失真(fs=100Hz)時的信號波形');
axis([-0.15,0.15,0,1]);subplot(2,1,2)
plot(f2,abs(fftshift(N2)));
xlabel('頻率');ylabel('幅值');axis([-500,500,0,0.02]);
title('抽樣失真時的信號頻譜');axis([-500,500,0.005,0.02]);
function [M,m,df]=fft_seq(m,ts,df)
fs=1/ts;
if nargin==2? ?n1=0
else? n1=fs/df
end
n2=length(m);n=2^(max(nextpow2(n1),nextpow2(n2)));
M=fft(m,n);m=[m,zeros(1,n-n2)];df=fs/n
PCM抽樣仿真結(jié)果:
原始信號的波形和頻譜
?
PCM正常抽樣時信號的波形及頻譜
PCM抽樣失真時信號的波形及頻譜
3.3.2 PCM均勻量化的仿真
PCM均勻量化的MATLAB程序設(shè)計按如下步驟進行:
(1)確定輸入模擬信號為sin(t);
(2)根據(jù)均勻量化的原理均勻量化的算法程序;
(3)繪制并比較模擬輸入信號與量化輸出的波形。
PCM均勻量化源程序如下:
function average()
t=[0:0.01:4*pi];
y=sin(t);
w=jylh(y,1,64);
subplot(2,1,1);
plot(t,y);
xlabel('時間');
ylabel('幅度');
axis([0,4*pi,-1.1,1.1]);
title('原始信號');
subplot(2,1,2);
plot(t,w);
xlabel('時間');
ylabel('幅度');
axis([0,4*pi,-1.1,1.1]);
title('均勻量化后的信號');
function h=jylh(f,V,L)
n=length(f);t=2*V/L;
p=zeros(1,L+1);
for i=1:L+1,p(i)=-V+(i-1)*t;end
for i=1:n
?????? if f(i)>V,h(i)=V;end
?????? if f(i)<=-V,h(i)=-V;end
?????? flag=0;
?????? for j=2:L/2+1
?????????? if(flag==0)
?????????????? if(f(i)<p(j))
?????????????????? h(i)=p(j-1);
?????????????????? flag=1;
?????????????? end;
?????????? end;
?????? end;
?????? for j=L/2+2:L+1
?????????? if(flag==0)
?????????????? if(f(i)<p(j))
?????????????????? h(i)=p(j);
?????????????????? flag=1;
?????????????? end
?????????? end
?????? end
end
nq=V^2/(3*L^2);
?
?
?
?
仿真結(jié)果:
3.3.3 PCM A律非均勻量化的MATLAB實現(xiàn)
PCM A律非均勻量化的MATLAB程序設(shè)計按如下步驟進行:
(1)確定輸入模擬信號;
(2)根據(jù)非均勻量化的原理確定A律非均勻量化的算法程序;
(3)繪制并比較模擬輸入信號與量化輸出的波形。
源程序如下:
function a_quantize()
t=0:0.00000125:0.0005;
y=sin(8000*pi*t);
figure
subplot(2,1,1)
plot(t,y)
axis([0 0.0005 -1.2 1.2])
xlabel('時間')??? ylabel('幅度')
title('原始信號')
z=a_pcm(y,87.6);
subplot(2,1,2)???? plot(t,z)
axis([0 0.0005 -1.2 1.2])
xlabel('時間')???
ylabel('幅度')
title('A律量化后的信號')
function y=a_pcm(x,a)
t=1/a;
for i=1:length(x)
??? if x(i)>=0
??????? if(x(i)<=t)
????? ??????y(i)=(a*x(i))/(1+log(a));
??????? else
??????????? y(i)=(1+log(a*x(i)))/(1+log(a));
??????? end
??? else
??????? if(x(i)>=-t)
??????????? y(i)=-(a*-x(i))/(1+log(a));
??????? else
??????????? y(i)=-(1+log(a*-x(i)))/(1+log(a));
??????? end
??? end
end
仿真結(jié)果:
PCM均勻量化的MATLAB程序設(shè)計按如下步驟進行:
(1)確定輸入模擬信號;
(2)根據(jù)給均勻量化的原理確定非均勻量化的算法程序;
(3)將上述編碼的十進制數(shù)轉(zhuǎn)化成8位二進制數(shù)。
源程序如下:
function a_13code()
t=0:0.000025:0.00025;
y=sin(8000*pi*t)
z=line13(y)
c=pcmcode(z)
function y=line13(x)
x=x/max(x);
z=sign(x);
x=abs(x);
for i=1:length(x)
??? if((x(i)>=0)&(x(i)<1/64))
??????? y(i)=16*x(i);
??? else
??????? if((x(i)>=1/64)&(x(i)<1/32))
??????????? y(i)=8*x(i)+1/8;
??????? else
??????????? if((x(i)>=1/32)&(x(i)<1/16))
??????????????? y(i)=4*x(i)+2/8;
??????? ????else
??????????????? if((x(i)>=1/16)&(x(i)<1/8))
??????????????????? y(i)=2*x(i)+3/8;
??????????????? else
??????????????????? if((x(i)>=1/8)&(x(i)<1/4))
??????????????????????? y(i)=x(i)+4/8;
??????????????????? else
??????????????????????? if((x(i)>=1/4)&(x(i)<1/2))
??????????????????????????? y(i)=1/2*x(i)+5/8;
??????????????????????? else
??????????????????????????? if((x(i)>=1/2)&(x(i)<=1))
??????????????????????????????? y(i)=1/4*x(i)+6/8;
??????????????????????????? end
??????????????????????? end
??????????????????? end
??????????????? end
??????????? end
??????? end
??? end
end
y=z.*y;
function f=pcmcode(y)
f=zeros(length(y),8);
z=sign(y);
y=y.*128;
y=fix(y);
y=abs(y);
for i=1:length(y)
??? if(y(i)==128)
??????? y(i)=127.999;
??? end
end
for i=1:length(y)
??? for j=6:-1:0
??????? f(i,8-j)=fix(y(i)/2^j);
??????? y(i)=mod(y(i),(2^j));
??? end
end
for i=1:length(y);
??? if(z(i)==1)
??????? f(i,1)=0;
??? else
??????? f(i,1)=1;
??? end
end
程序運行結(jié)果:
y =
?0??? 0.5878??? 0.9511??? 0.9511??? 0.5878??? 0.0000?? -0.5878?? -0.9511?? -0.9511?? -0.5878?? -0.0000
z =
? 0??? 0.9045??? 1.0000??? 1.0000??? 0.9045??? 0.0000?? -0.9045?? -1.0000?? -1.0000?? -0.9045?? -0.0000
c =
???? 1???? 0???? 0???? 0???? 0???? 0???? 0???? 0
???? 0???? 1???? 1???? 1???? 0???? 0???? 1???? 1
???? 0???? 1???? 1???? 1???? 1???? 1???? 1???? 1
???? 0???? 1???? 1???? 1???? 1???? 1???? 1???? 1
???? 0???? 1???? 1???? 1???? 0???? 0???? 1???? 1
???? 0???? 0???? 0???? 0???? 0???? 0???? 0???? 0
???? 1???? 1???? 1???? 1???? 0???? 0???? 1???? 1
??? ?1???? 1???? 1???? 1???? 1???? 1???? 1???? 1
???? 1???? 1???? 1???? 1???? 1???? 1???? 1???? 1
???? 1???? 1???? 1???? 1???? 0???? 0???? 1???? 1
???? 1???? 0???? 0???? 0???? 0???? 0???? 0???? 0
4.信道編碼和譯碼
在數(shù)字電視和通信系統(tǒng)中,為提高信息傳輸可靠性,廣泛使用了具有一定糾錯能力的信道編碼技術(shù),如奇偶校驗碼、行列監(jiān)督碼、恒比碼、漢明碼、循環(huán)碼(CRC)等編碼技術(shù)。信道編碼的本質(zhì)是增加通信的可靠性,或者說增加整個系統(tǒng)的抗干擾性。對信道編碼有以下要求:1.透明性:要求對所傳消息的內(nèi)容不加任何限制;2.有糾錯能力;3.效率高:為了與信道頻譜匹配和具有糾錯能力,通常要向原信號添加一些碼,要求加入最少的比特數(shù)而得到最大的利益;4.包含適當(dāng)?shù)亩〞r信息。在這些要求中,除編碼的必須信息外,所作的處理主要有兩條:一是要求碼列的頻譜特性適應(yīng)通道的頻譜特性從而使傳輸過程中能量損失最小,提高信噪比。減少發(fā)生差錯的可能性;二是增加糾錯能力,使得即便出現(xiàn)差錯,也能得到糾正。
4.1差錯控制的基本概念
4.1.1差錯的特點
由于通信線路上總有噪聲存在,噪聲和有用信息中的結(jié)果,就會出現(xiàn)差錯。噪聲可分為兩類,一類是熱噪聲,另一類是沖激噪聲,熱噪聲引起的差錯是一種隨機差錯,亦即某個碼元的出錯具有獨立性,與前后碼元無關(guān)。沖激噪聲是由短暫原因造成的,例如點擊的啟動、停止,電器設(shè)備的放弧等。沖擊噪聲引起的差錯是成群的,其差錯持續(xù)時間稱為突發(fā)錯的長度。
衡量信道傳輸性能的指標之一是誤碼率PO,PO=錯誤接收的碼元數(shù)/接收的總碼元數(shù)。目前普通電話線路中,當(dāng)傳輸速率在600~2400bit/s時,PO在之間,對于大多數(shù)通信系統(tǒng),PO在之間,而計算機之間的數(shù)據(jù)傳輸則要求誤碼率低于。
4.1.2 差錯控制的基本方式
差錯控制方式基本上分為兩類,一類稱為“反饋糾錯”,另一類稱為“前向糾錯”。在這兩類基礎(chǔ)上又派生出一種稱為“混合糾錯”。
(1)反饋糾錯
這種方式在是發(fā)信端采用某種能發(fā)現(xiàn)一定程度傳輸差錯的簡單編碼方法對所傳信息進行編碼,加入少量監(jiān)督碼元,在接收端則根據(jù)編碼規(guī)則收到的編碼信號進行檢查,一量檢測出(發(fā)現(xiàn))有錯碼時,即向發(fā)信端發(fā)出詢問的信號,要求重發(fā)。發(fā)信端收到詢問信號時,立即重發(fā)已發(fā)生傳輸差錯的那部分發(fā)信息,直到正確收到為止。所謂發(fā)現(xiàn)差錯是指在若干接收碼元中知道有一個或一些是錯的,但不一定知道錯誤的準確位置。
(2)前向糾錯
這種方式是發(fā)信端采用某種在解碼時能糾正一定程度傳輸差錯的較復(fù)雜的編碼方法,使接收端在收到信碼中不僅能發(fā)現(xiàn)錯碼,還能夠糾正錯碼。采用前向糾錯方式時,不需要反饋信道,也無需反復(fù)重發(fā)而延誤傳輸時間,對實時傳輸有利,但是糾錯設(shè)備比較復(fù)雜。
(3)混合糾錯
混合糾錯的方式是:少量糾錯在接收端自動糾正,差錯較嚴重,超出自行糾正能力時,就向發(fā)信端發(fā)出詢問信號,要求重發(fā)。因此,“混合糾錯”是“前向糾錯”及“反饋糾錯”兩種方式的混合。
對于不同類型的信道,應(yīng)采用不同的差錯控制技術(shù),否則就將事倍功半。
反饋糾錯可用于雙向數(shù)據(jù)通信,前向糾錯則用于單向數(shù)字信號的傳輸,例如廣播數(shù)字電視系統(tǒng),因為這種系統(tǒng)沒有反饋通道。
4.1.3 誤碼控制編碼的分類
隨著數(shù)字通信技術(shù)的發(fā)展,研究開發(fā)了各種誤碼控制編碼方案,各自建立在不同的數(shù)學(xué)模型基礎(chǔ)上,并具有不同的檢錯與糾錯特性,可以從不同的角度對誤碼控制編碼進行分類。
按照誤碼控制的不同功能,可分為檢錯碼、糾錯碼和糾刪碼等。檢錯碼僅具備識別錯碼功能而無糾正錯碼功能;糾錯碼不僅具備識別錯碼功能,同時具備糾正錯碼功能;糾刪碼則不僅具備識別錯碼和糾正錯碼的功能,而且當(dāng)錯碼超過糾正范圍時可把無法糾錯的信息刪除。
按照誤碼產(chǎn)生的原因不同,可分為糾正隨機錯誤的碼與糾正突發(fā)性錯誤的碼。前者主要用于產(chǎn)生獨立的局部誤碼的信道,而后者主要用于產(chǎn)生大面積的連續(xù)誤碼的情況,例如磁帶數(shù)碼記錄中磁粉脫落而發(fā)生的信息丟失。按照信息碼元與附加的監(jiān)督碼元之間的檢驗關(guān)系可分為線性碼與非線性碼。如果兩者呈線性關(guān)系,即滿足一組線性方程式,就稱為線性碼;否則,兩者關(guān)系不能用線性方程式來描述,就稱為非線性碼。
按照信息碼元與監(jiān)督附加碼元之間的約束方式之不同,可以分為分組碼與卷積碼。在分組碼中,編碼后的碼元序列每n位分為一組,其中包括k位信息碼元和r位附加監(jiān)督碼元,即n=k+r,每組的監(jiān)督碼元僅與本組的信息碼元有關(guān),而與其他組的信息碼元無關(guān)。卷積碼則不同,雖然編碼后碼元序列也劃分為碼組,但每組的監(jiān)督碼元不但與本組的信息碼元有關(guān),而且與前面碼組的信息碼元也有約束關(guān)系。
按照信息碼元在編碼之后是否保持原來的形式不變,又可分為系統(tǒng)碼與非系統(tǒng)碼。在系統(tǒng)碼中,編碼后的信息碼元序列保持原樣不變,而在非系統(tǒng)碼中,信息碼元會改變其原有的信號序列。由于原有碼位發(fā)生了變化,使譯碼電路更為復(fù)雜,故較少選用。
根據(jù)編碼過程中所選用的數(shù)字函數(shù)式或信息碼元特性的不同,又包括多種編碼方式。對于某種具體的數(shù)字設(shè)備,為了提高檢錯、糾錯能力,通常同時選用幾種誤碼控制編碼方式。以下,以線性分組碼為例,對幾種簡單的編碼方式進行介紹。
4.2循環(huán)碼(CRC)
循環(huán)碼是線性碼的一個重要的子類,它有以下兩大特點:第一,碼的結(jié)構(gòu)可以用代數(shù)方法來構(gòu)造和分析,并且可以找到各種實用的譯碼方法;第二,由于其循環(huán)特性,編碼運算和伴隨式計算,可用反饋移位寄存器來實現(xiàn),硬件實現(xiàn)簡單。
循環(huán)碼是在嚴密的代數(shù)學(xué)理論基礎(chǔ)上建立起來的,這種碼的編碼和解碼設(shè)備都不太復(fù)雜,而且糾錯的能力較強。顧名思義,循環(huán)碼除具有線性碼的一般性質(zhì)之外,還具有循環(huán)性,即任一碼組循環(huán)一位以后,仍為該碼中的一個碼組。
5.2? 2FSK二進制數(shù)字調(diào)制的仿真
附錄程序:
i=10;?????????????????????????????? %基帶信號碼元數(shù)
j=5000;
a=round(rand(1,i));???????????????? %產(chǎn)生隨機序列
t=linspace(0,5,j);
f1=10;????????????????????????????? %載波1頻率
f2=5;?????????????????????????????? %載波2頻率
fm=i/5;???????????????????????????? %基帶信號頻率
B1=2*f1;??????????????????????????? %載波1帶寬
B2=2*f2;??????????????????????????? %載波2帶寬
??????????????????????????????????? %產(chǎn)生基帶信號
st1=t;
for n=1:10
??? if a(n)<1;
??????? for m=j/i*(n-1)+1:j/i*n
???????????? st1(m)=0;
???????????? end
??????? else
???????? for m=j/i*(n-1)+1:j/i*n
???????????? st1(m)=1;
???????????? end
??????? end
end
??? st2=t;
??????????????????????????????????? %基帶信號求反
??? for n=1:j;
???????? if st1(n)>=1;
???????????? st2(n)=0;
???????????? else
?????????? st2(n)=1;
???????????? end
??? end;
??? figure(1);
??? subplot(411);
??? plot(t,st1);
??? title('基帶信號');
??? axis([0,5,-1,2]);
??? subplot(412);
??? plot(t,st2);
??? title('基帶信號反碼');
??? axis([0,5,-1,2]);
???????????????????????????????????? %載波信號
??? s1=cos(2*pi*f1*t);
??? s2=cos(2*pi*f2*t);
??? subplot(413)
??? plot(s1);
??? title('載波信號1');
??? subplot(414),
??? plot(s2);
??? title('載波信號2');
???????????????? ?????????????????????%調(diào)制
??? F1=st1.*s1;?????????????????????? %加入載波1
??? F2=st2.*s2;?????????????????????? %加入載波2
??? figure(2);
??? subplot(311);
??? plot(t,F1);?????????????????????? %s1*st1信號
??? title('s1*st1');
??? subplot(312);
??? plot(t,F2);
??? title('s2*st2');????????????????? %s2*st2信號
??? e_fsk=F1+F2;
??? subplot(313);
??? plot(t,e_fsk);
title('二進制頻移鍵控調(diào)制信號')???????? %二進制頻移鍵控調(diào)制信號
4.3.2 調(diào)制解調(diào)仿真程序:
fs=2000;???? ??????????????????????????????%采樣頻率
dt=1/fs;
f1=20;
f2=120;??????????????????????????????????? %兩個信號的頻率
a=round(rand(1,10));?????????????????????? %隨機信號
g1=a
g2=~a;???????????????????????????????????? %信號反轉(zhuǎn),和g1反向
g11=(ones(1,2000))'*g1;??????????????????? %抽樣
g1a=g11(:)';
g21=(ones(1,2000))'*g2;
g2a=g21(:)';
t=0:dt:10-dt;
t1=length(t);
fsk1=g1a.*cos(2*pi*f1.*t);
fsk2=g2a.*cos(2*pi*f2.*t);
fsk=fsk1+fsk2;???????????????????????????? %產(chǎn)生的信號
no=0.01*randn(1,t1);?????????????????????? %噪聲
sn=fsk+no;
subplot(311);
plot(t,no);??????????????????????????????? %噪聲波形
title('噪聲波形')
ylabel('幅度')
subplot(312);
plot(t,fsk);
title('產(chǎn)生的波形')
ylabel('幅度')
subplot(313);
plot(t,sn);
title('將要通過濾波器的波形')
ylabel('幅度的大小')
xlabel('t')
figure(2)???????????????????????????????? %FSK解調(diào) ????????
b1=fir1(101,[10/800 20/800]);
b2=fir1(101,[90/800 110/800]);??????????? %設(shè)置帶通參數(shù)
H1=filter(b1,1,sn);
H2=filter(b2,1,sn);?????????????????????? %經(jīng)過帶通濾波器后的信號
subplot(211);
plot(t,H1);
title('經(jīng)過帶通濾波器f1后的波形')
ylabel('幅度')
subplot(212);
plot(t,H2);
title('經(jīng)過帶通濾波器f2后的波形')
ylabel('幅度')
xlabel('t')
sw1=H1.*H1;
sw2=H2.*H2;?????????????????????????????? %經(jīng)過相乘器
figure(3)
subplot(211);
plot(t,sw1);
title('經(jīng)過相乘器h1后的波形')
ylabel('幅度')
subplot(212);
plot(t,sw2);
title('經(jīng)過相乘器h2后的波形')
ylabel('?幅度')
xlabel('t')
bn=fir1(101,[2/800 10/800]);???????????? %經(jīng)過低通濾波器
figure(4)
st1=filter(bn,1,sw1);
st2=filter(bn,1,sw2);
subplot(211);
plot(t,st1);
title('經(jīng)過低通濾波器sw1后的波形')
ylabel('幅度')
subplot(212);
plot(t,st2);
title('經(jīng)過低通濾波器sw2后的波形')
ylabel('幅度')
xlabel('t')
????????????????? ???????????????????????%判決
for i=1:length(t)
??? if(st1(i)>=st2(i))
??????? st(i)=0;
??? else st(i)=st2(i);
??? end
end
figure(5)
st=st1+st2;
subplot(211);plot(t,st); title('經(jīng)過抽樣判決器后的波形')ylabel('幅度') subplot(212);plot(t,sn); title('原始的波形')
ylabel('幅度')? xlabel('t')
總結(jié)
- 上一篇: xp系统支持的python版本_xp系统
- 下一篇: JSP旅游景点网站系统myeclipse