數字通訊系統

fpga&matlab發表於2020-11-09

PCM抽樣的MATLAB程式設計按如下步驟進行:

(1)確定輸入的模擬訊號為sa(200t);

(2)根據輸入的模擬訊號,確定抽樣頻率,對輸入訊號進行抽樣,並將正常抽樣和會產生失真的抽樣進行對比,對抽樣定理加以驗證;

(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;                             %訊號持續的時間

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;         %訊號持續的時間

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抽樣模擬結果:

原始訊號的波形和頻譜

 

PCM正常抽樣時訊號的波形及頻譜

PCM抽樣失真時訊號的波形及頻譜

3.3.2 PCM均勻量化的模擬

PCM均勻量化的MATLAB程式設計按如下步驟進行:

(1)確定輸入模擬訊號為sin(t);

(2)根據均勻量化的原理均勻量化的演算法程式;

(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);

 

 

 

 

模擬結果:

3.3.3 PCM A律非均勻量化的MATLAB實現

PCM A律非均勻量化的MATLAB程式設計按如下步驟進行:

(1)確定輸入模擬訊號;

(2)根據非均勻量化的原理確定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

模擬結果:

PCM均勻量化的MATLAB程式設計按如下步驟進行:

(1)確定輸入模擬訊號;

(2)根據給均勻量化的原理確定非均勻量化的演算法程式;

(3)將上述編碼的十進位制數轉化成8位二進位制數。

源程式如下:

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

程式執行結果:

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.通道編碼和譯碼

在數字電視和通訊系統中,為提高資訊傳輸可靠性,廣泛使用了具有一定糾錯能力的通道編碼技術,如奇偶校驗碼、行列監督碼、恆比碼、漢明碼、迴圈碼(CRC)等編碼技術。通道編碼的本質是增加通訊的可靠性,或者說增加整個系統的抗干擾性。對通道編碼有以下要求:1.透明性:要求對所傳訊息的內容不加任何限制;2.有糾錯能力;3.效率高:為了與通道頻譜匹配和具有糾錯能力,通常要向原訊號新增一些碼,要求加入最少的位元數而得到最大的利益;4.包含適當的定時資訊。在這些要求中,除編碼的必須資訊外,所作的處理主要有兩條:一是要求碼列的頻譜特性適應通道的頻譜特性從而使傳輸過程中能量損失最小,提高訊雜比。減少發生差錯的可能性;二是增加糾錯能力,使得即便出現差錯,也能得到糾正。

4.1差錯控制的基本概念

4.1.1差錯的特點

由於通訊線路上總有噪聲存在,噪聲和有用資訊中的結果,就會出現差錯。噪聲可分為兩類,一類是熱噪聲,另一類是衝激噪聲,熱噪聲引起的差錯是一種隨機差錯,亦即某個碼元的出錯具有獨立性,與前後碼元無關。衝激噪聲是由短暫原因造成的,例如點選的啟動、停止,電器裝置的放弧等。衝擊噪聲引起的差錯是成群的,其差錯持續時間稱為突發錯的長度。

衡量通道傳輸效能的指標之一是誤位元速率PO,PO=錯誤接收的碼元數/接收的總碼元數。目前普通電話線路中,當傳輸速率在600~2400bit/s時,PO在之間,對於大多數通訊系統,PO在之間,而計算機之間的資料傳輸則要求誤位元速率低於

4.1.2 差錯控制的基本方式

差錯控制方式基本上分為兩類,一類稱為“反饋糾錯”,另一類稱為“前向糾錯”。在這兩類基礎上又派生出一種稱為“混合糾錯”。

(1)反饋糾錯

這種方式在是發信端採用某種能發現一定程度傳輸差錯的簡單編碼方法對所傳資訊進行編碼,加入少量監督碼元,在接收端則根據編碼規則收到的編碼訊號進行檢查,一量檢測出(發現)有錯碼時,即向發信端發出詢問的訊號,要求重發。發信端收到詢問訊號時,立即重發已發生傳輸差錯的那部分發資訊,直到正確收到為止。所謂發現差錯是指在若干接收碼元中知道有一個或一些是錯的,但不一定知道錯誤的準確位置。

(2)前向糾錯

這種方式是發信端採用某種在解碼時能糾正一定程度傳輸差錯的較複雜的編碼方法,使接收端在收到信碼中不僅能發現錯碼,還能夠糾正錯碼。採用前向糾錯方式時,不需要反饋通道,也無需反覆重發而延誤傳輸時間,對實時傳輸有利,但是糾錯裝置比較複雜。

(3)混合糾錯

混合糾錯的方式是:少量糾錯在接收端自動糾正,差錯較嚴重,超出自行糾正能力時,就向發信端發出詢問訊號,要求重發。因此,“混合糾錯”是“前向糾錯”及“反饋糾錯”兩種方式的混合。

對於不同型別的通道,應採用不同的差錯控制技術,否則就將事倍功半。

反饋糾錯可用於雙向資料通訊,前向糾錯則用於單向數字訊號的傳輸,例如廣播數字電視系統,因為這種系統沒有反饋通道。

4.1.3 誤碼控制編碼的分類

隨著數字通訊技術的發展,研究開發了各種誤碼控制編碼方案,各自建立在不同的數學模型基礎上,並具有不同的檢錯與糾錯特性,可以從不同的角度對誤碼控制編碼進行分類。

按照誤碼控制的不同功能,可分為檢錯碼、糾錯碼和糾刪碼等。檢錯碼僅具備識別錯碼功能而無糾正錯碼功能;糾錯碼不僅具備識別錯碼功能,同時具備糾正錯碼功能;糾刪碼則不僅具備識別錯碼和糾正錯碼的功能,而且當錯碼超過糾正範圍時可把無法糾錯的資訊刪除。

按照誤碼產生的原因不同,可分為糾正隨機錯誤的碼與糾正突發性錯誤的碼。前者主要用於產生獨立的區域性誤碼的通道,而後者主要用於產生大面積的連續誤碼的情況,例如磁帶數碼記錄中磁粉脫落而發生的資訊丟失。按照資訊碼元與附加的監督碼元之間的檢驗關係可分為線性碼與非線性碼。如果兩者呈線性關係,即滿足一組線性方程式,就稱為線性碼;否則,兩者關係不能用線性方程式來描述,就稱為非線性碼。

按照資訊碼元與監督附加碼元之間的約束方式之不同,可以分為分組碼與卷積碼。在分組碼中,編碼後的碼元序列每n位分為一組,其中包括k位資訊碼元和r位附加監督碼元,即n=k+r,每組的監督碼元僅與本組的資訊碼元有關,而與其他組的資訊碼元無關。卷積碼則不同,雖然編碼後碼元序列也劃分為碼組,但每組的監督碼元不但與本組的資訊碼元有關,而且與前面碼組的資訊碼元也有約束關係。

按照資訊碼元在編碼之後是否保持原來的形式不變,又可分為系統碼與非系統碼。在系統碼中,編碼後的資訊碼元序列保持原樣不變,而在非系統碼中,資訊碼元會改變其原有的訊號序列。由於原有碼位發生了變化,使譯碼電路更為複雜,故較少選用。

根據編碼過程中所選用的數字函式式或資訊碼元特性的不同,又包括多種編碼方式。對於某種具體的數字裝置,為了提高檢錯、糾錯能力,通常同時選用幾種誤碼控制編碼方式。以下,以線性分組碼為例,對幾種簡單的編碼方式進行介紹。

4.2迴圈碼(CRC)

迴圈碼是線性碼的一個重要的子類,它有以下兩大特點:第一,碼的結構可以用代數方法來構造和分析,並且可以找到各種實用的譯碼方法;第二,由於其迴圈特性,編碼運算和伴隨式計算,可用反饋移位暫存器來實現,硬體實現簡單。

迴圈碼是在嚴密的代數學理論基礎上建立起來的,這種碼的編碼和解碼裝置都不太複雜,而且糾錯的能力較強。顧名思義,迴圈碼除具有線性碼的一般性質之外,還具有迴圈性,即任一碼組迴圈一位以後,仍為該碼中的一個碼組。

5.2  2FSK二進位制數字調製的模擬

附錄程式:

i=10;                               %基帶訊號碼元數

j=5000;

a=round(rand(1,i));                 %產生隨機序列

t=linspace(0,5,j);

f1=10;                              %載波1頻率

f2=5;                               %載波2頻率

fm=i/5;                             %基帶訊號頻率

B1=2*f1;                            %載波1頻寬

B2=2*f2;                            %載波2頻寬

                                    %產生基帶訊號

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');

                                      %調製

    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('二進位制頻移鍵控調製訊號')         %二進位制頻移鍵控調製訊號

4.3.2 調製解調模擬程式:

fs=2000;                                   %取樣頻率

dt=1/fs;

f1=20;

f2=120;                                    %兩個訊號的頻率

a=round(rand(1,10));                       %隨機訊號

g1=a

g2=~a;                                     %訊號反轉,和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;                             %產生的訊號

no=0.01*randn(1,t1);                       %噪聲

sn=fsk+no;

subplot(311);

plot(t,no);                                %噪聲波形

title('噪聲波形')

ylabel('幅度')

subplot(312);

plot(t,fsk);

title('產生的波形')

ylabel('幅度')

subplot(313);

plot(t,sn);

title('將要通過濾波器的波形')

ylabel('幅度的大小')

xlabel('t')

figure(2)                                 %FSK解調         

b1=fir1(101,[10/800 20/800]);

b2=fir1(101,[90/800 110/800]);            %設定帶通引數

H1=filter(b1,1,sn);

H2=filter(b2,1,sn);                       %經過帶通濾波器後的訊號

subplot(211);

plot(t,H1);

title('經過帶通濾波器f1後的波形')

ylabel('幅度')

subplot(212);

plot(t,H2);

title('經過帶通濾波器f2後的波形')

ylabel('幅度')

xlabel('t')

sw1=H1.*H1;

sw2=H2.*H2;                               %經過相乘器

figure(3)

subplot(211);

plot(t,sw1);

title('經過相乘器h1後的波形')

ylabel('幅度')

subplot(212);

plot(t,sw2);

title('經過相乘器h2後的波形')

ylabel('•幅度')

xlabel('t')

bn=fir1(101,[2/800 10/800]);             %經過低通濾波器

figure(4)

st1=filter(bn,1,sw1);

st2=filter(bn,1,sw2);

subplot(211);

plot(t,st1);

title('經過低通濾波器sw1後的波形')

ylabel('幅度')

subplot(212);

plot(t,st2);

title('經過低通濾波器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('經過抽樣判決器後的波形')ylabel('幅度') subplot(212);plot(t,sn); title('原始的波形')

ylabel('幅度')  xlabel('t')

相關文章