MATLAB仿真報告
無線通信
(MATLAB課后作業(yè)仿真)
姓 名:
學(xué) 院:
學(xué) 號:
班 級:
指導(dǎo)教師:
一、分集仿真
現(xiàn)給出最大比合并(MRC)、等增益合并(EGC)和選擇性合并的分集合并程序,理解各程序,完成以下習(xí)題。將程序運行結(jié)果及各題目的解答寫入word中:
1. 用matlab分別運行“BPSKMRC.m”、“BPSKEGC.m”以及“BPSKSEL.m”
(a)在程序中標注“注釋”處加上注釋(英文或中文)
BPSKMRC.m注釋
nd = 10000; %設(shè)置每個循環(huán)中的符號數(shù)
snr_in_dB=[0:15] ;
ber=zeros(1,length(snr_in_dB));
for snr_num=1:length(snr_in_dB)
SNR=exp(snr_in_dB(snr_num)*log(10)/10);
nloop=100; % 循環(huán)次數(shù)
noe = 0; % 錯誤數(shù)
nod = 0; % 傳輸?shù)臄?shù)量
for iii=1:nloop
data1=rand(1,nd)>0.5;
data2=2.*data1-1;
%以下為衰減量的計算
%在瑞利信道下
code_rate=1;
E=1;
sigma=E/sqrt(2*SNR*code_rate);
n =[randn(1,nd) + j*randn(1,nd)];
h1 =1/sqrt(2)*[randn(1,nd) + j*randn(1,nd)]; % 瑞利信道
data41=data2.*h1+sigma.*n;
h11=conj(h1); %計算信道質(zhì)量指數(shù)的復(fù)共軛
data411 = data41.*h11; %計算組合后的價值
%*****************************************
n =[randn(1,nd) + j*randn(1,nd)];
h2 =1/sqrt(2)*[randn(1,nd) + j*randn(1,nd)]; % 瑞利信道
data42=data2.*h2+sigma.*n;
h22=conj(h2);
data422 =data42.*h22;
%*****************************************
data4=data411+data422;%在兩個不相關(guān)的信道下的信號進行組合
% BPSK 解調(diào)
demodata1=data4 > 0;
%誤碼率
noe2=sum(abs(data1-demodata1));
nod2=length(data1);
noe=noe+noe2;
nod=nod+nod2;
end
%輸出結(jié)果
ber(snr_num) = noe/nod
end;
%結(jié)尾
figure;
semilogy(snr_in_dB,ber,O-);
hold on
semilogy(snr_in_dB,0.5*erfc(sqrt(2*10.^(snr_in_dB/10))/sqrt(2)),+-);
hold on
semilogy(snr_in_dB,0.5.*(1-sqrt((10.^(snr_in_dB/10))./(10.^(snr_in_dB/10)+1))),-);
ylabel(BER);
xlabel(E_b/N_0 [dB]);
legend(simulation BPSK MRC L=2,theory gngauss BPSK,theory reyleigh );
BPSKEGC.m注釋
nd = 10000; %設(shè)置每個循環(huán)中的符號數(shù)
snr_in_dB=[0:15] ;
ber=zeros(1,length(snr_in_dB));
for snr_num=1:length(snr_in_dB)
SNR=exp(snr_in_dB(snr_num)*log(10)/10);
nloop=100; % 設(shè)置循環(huán)次數(shù)
noe = 0; % 錯誤數(shù)量
nod = 0; % 傳輸數(shù)量
for iii=1:nloop
data1=rand(1,nd)>0.5;
data2=2.*data1-1;
%衰減量的計算
%瑞利信道下
code_rate=1;
E=1;
sigma=E/sqrt(2*SNR*code_rate);
n =[randn(1,nd) + j*randn(1,nd)];
h1 =1/sqrt(2)*[randn(1,nd) + j*randn(1,nd)]; % 瑞利信道
data41=data2.*h1+sigma.*n;
h11=conj(h1)./abs(h1); %取信道質(zhì)量指數(shù)的單位向量
data411 = data41.*h11; %計算組合后在信道1下的價值
%*****************************************
n =[randn(1,nd) + j*randn(1,nd)];
h2 =1/sqrt(2)*[randn(1,nd) + j*randn(1,nd)]; %瑞利信道
data42=data2.*h2+sigma.*n;
h22=conj(h2)./abs(h2);
data422 =data42.*h22;
%*****************************************
data4=data411+data422;
%BPSK 解調(diào)
demodata1=data4 > 0;
%誤碼率計算
noe2=sum(abs(data1-demodata1));
nod2=length(data1);
noe=noe+noe2;
nod=nod+nod2;
end
%結(jié)果輸出
ber1(snr_num) = noe/nod
end;
%結(jié)尾
figure;
semilogy(snr_in_dB,ber1,O-);
hold on
semilogy(snr_in_dB,0.5*erfc(sqrt(2*10.^(snr_in_dB/10))/sqrt(2)),+-);
hold on
semilogy(snr_in_dB,0.5.*(1-sqrt((10.^(snr_in_dB/10))./(10.^(snr_in_dB/10)+1))),-);
ylabel(BER);
xlabel(E_b/N_0 [dB]);
legend(simulation BPSK EGC L=2,theory gngauss BPSK,theory reyleigh );
BPSKSEL.m注釋
snr_in_dB=0:15;
for k=1:length(snr_in_dB)
k
N=10000;
E=1;
SNR=10^(snr_in_dB(k)/10);
sigma=E/sqrt(2*SNR);
for i=1:N
a=rand;
if(a<0.5)
data(i)=-1;
else
data(i)=1;
end
end
numofber=0;
totolnumber=0;
while numofber<1
totolnumber=totolnumber+1;
for i=1:N
H1 =1/sqrt(2)*[rand + j*rand]; %第一個瑞利信道
H2 =1/sqrt(2)*[rand + j*rand]; %第二個瑞利信道
H=[H1;H2];
y1=H(1)*data(i)+sigma*(rand + j*rand); %在第一個信道下計算數(shù)據(jù)
y2=H(2)*data(i)+sigma*(rand + j*rand); %在第二個信道下計算數(shù)據(jù)
y=[abs(y1),abs(y2)];
s=max(y); %選擇其中最大的數(shù)據(jù)
if (s==abs(y2))
s=y2/H2;
else
s=y1/H1;
end
data2=sign(real(s));
if (data2~=data(i))
numofber=numofber+1; %計算誤比特率
end
end
end
p(k)=numofber/(N*totolnumber); %計算誤碼率
end
figure;
semilogy(snr_in_dB,p,O-);
hold on
semilogy(snr_in_dB,0.5*erfc(sqrt(2*10.^(snr_in_dB/10))/sqrt(2)),+-);
hold on
semilogy(snr_in_dB,0.5.*(1-sqrt((10.^(snr_in_dB/10))./(10.^(snr_in_dB/10)+1))),-);
ylabel(BER);
xlabel(E_b/N_0 [dB]);
legend(simulation BPSK SEL L=2,theory gngauss BPSK,theory reyleigh);
(b)觀察信噪比變化10dB,誤比特率變化多少?
MRC誤比特率變化:0.0588-0.0017=0.0571
EGC誤比特率變化:0.0650-0.0018=0.0632
SEL 誤比特率變化:0.1733-0.0030=0.1703
(c)程序中給出的是2分集,將其換為3分集,觀察信噪比變化10dB,誤比特率變化多少?
MRC 誤比特率變化:0.0248-0.0001=0.0247
EGC 誤比特率變化:0.0330-0.0002=0.0328
SEl 誤比特率變化:0.1780-0.0003=0.1777
(d)將最大比合并和等增益合并及選擇式合并的誤比特率曲線,畫在一張圖上,比較這三種合并方法的優(yōu)劣。
由圖可得,MRC方法所得到的誤碼率是最小的,性能也最穩(wěn)定;EGC方法在誤碼率和穩(wěn)定性方面次之;SEL方法在同一SNR下得到的誤碼率最高,而且穩(wěn)定性很差,有時候能夠得到比MRC、EGC更低的誤碼率,有時候就不行,增大SNR只能使BER總體趨向下降,不保證增大SNR就能直接降低BER。
二、調(diào)制解調(diào)仿真
現(xiàn)給出bpsk、qpsk及“書上習(xí)題”的調(diào)制解調(diào)程序,理解各程序,完成以下習(xí)題。將程序運行結(jié)果及各題目的解答寫入word中:
1.用matlab運行書上習(xí)題中的“bpskqpsk125.m”
(a)說明bpsk、qpsk解調(diào)判決方法
答:由該m文件可得,其中的判決設(shè)置為:
BPSK:if a (zero mean)noise sample is larger than sqrt(Eb) a wrong decsion is made.
如果一個噪聲的樣值比平均比特能量大的話,那么就會產(chǎn)生錯誤的判決。
QPSK:if the constellation point angle is within pi/4 ang -pi/4 a corerect decision is made.
如果星座點上的角偏差在pi/4和-pi/4之間的話,判決就正確了。
(b)誤比特率為1e-2、1e-3及1e-4時的Eb/N0分別是多少?
答:運行該程序,可以得出如下的圖像:
當誤比特率在1e-2時其Eb/N0=4.3dB
當誤比特率在1e-3時其Eb/N0=6.8dB
當誤比特率在1e-4時其Eb/N0=8.3dB
(c)從物理意義上說明為什么bpsk、qpsk誤比特率曲線是重疊的
答:QPSK為四元相位調(diào)制,而BPSK為二元相位調(diào)制。因此,從判決的區(qū)域來看BPSK的誤碼率(誤符號率)是必然大于QPSK的。但是從另一個角度看,每一個QPSK的符號相當于是由兩個BPSK的符號組合而成(如11是由二進制的兩個1組成),最基本的比特的差錯性能都是一樣的,因此BPSK和QPSK的誤比特率是相同的。
(d)當samples減少為100000,10000,1000時觀察誤比特率曲線的變化,你得出什么結(jié)論。
答:當samples=100000,10000,1000時,圖像分別為:
此時誤差已經(jīng)非常明顯
2.用matlab運行“bpsk.m”、“qpsk.m”
(a)在各程序中標注“注釋”處加上注釋(英文或中文)
BPSK:
data1=rand(1,nd)>0.5; %返回一組行向量
code_rate=1;
E=1;
sigma=E/sqrt(2*SNR*code_rate)%計;算編碼后高斯分布隨機變量標準差
for i=1:nd
if (data1(i)==0),
data4(i)=-E+Gngauss(sigma); %傳0碼時加入高斯分布白噪聲干擾
else
data4(i)=E+Gngauss(sigma); %傳1碼時加入高斯分布白噪聲干擾
end;
end;
%BPSK 解調(diào)
demodata1=data4 > 0; % data4中每個元素和0比較
%誤碼率
noe2=sum(abs(data1-demodata1)); %計算誤碼個數(shù)
nod2=length(data1); %計算總碼數(shù)
noe=noe+noe2;
nod=nod+nod2;
end
ber(snr_num) = noe/nod %計算誤碼率
end;
QPSK:
ber=zeros(1,length(snr_in_dB));
for snr_num=1:length(snr_in_dB)
SNR=exp(snr_in_dB(snr_num)*log(10)/10);%計算信噪比
nloop=100; % 設(shè)置循環(huán)次數(shù)
noe = 0; % 錯誤數(shù)量
nod = 0; %傳輸數(shù)量
for iii=1:nloop
data=rand(1,nd*ml)>0.5; %生成同相分量
data1=2*data-1 %此為正交分量
% QPSK 調(diào)制
[tout]=qpskmod(data1,1,nd,ml);
code_rate=1;
E=1/sqrt(2);
sigma=E/sqrt(2*SNR*code_rate); %計算編碼后高斯分布隨機變量標準差
for i=1:nd,
[gsrv1,gsrv2]=Gngauss(sigma);
tout(i)=tout(i)+gsrv1+j*gsrv2;
%sigma=E/sqrt(2*SNR*code_rate);
%n = 1/sqrt(2)*[randn(1,nd) + j*randn(1,nd)];
%sigma.*n %注釋:另一種高斯白噪聲產(chǎn)生方法
end;
%QPSK 解調(diào)
[demodata]=qpskdemod(tout,1,nd,ml);
demodata1=demodata > 0; %與原始碼元對比判決,得到正確的碼元數(shù)
demodata=demodata1;
%誤碼率
noe2=sum(abs(data-demodata)); %錯誤碼元數(shù)
nod2=length(data1); %總碼元數(shù)
noe=noe+noe2;
nod=nod+nod2;
end
ber(snr_num) = noe/nod; %計算誤碼率
(b)說明加性高斯白噪聲的產(chǎn)生方法,請再給出一種加性高斯白噪聲的產(chǎn)生方法,并驗證其正確性。
原始方法為Gngauss.m
if nargin == 0,
m=0; sgma=1;
elseif nargin == 1,
sgma=m; m=0;
end;
u=rand;
z=sgma*(sqrt(2*log(1/(1-u))));
u=rand;
gsrv1=m+z*cos(2*pi*u);
gsrv2=m+z*sin(2*pi*u);
nargin為輸入變量的個數(shù),如果nargin為零,即空號,產(chǎn)生均值為0,標準差為1的高斯分布系列。如果傳號,產(chǎn)生均值為0,方差為m的隨機序列。
另一種方法:y = awgn(m,n,p) 產(chǎn)生一個m行n列的高斯白噪聲的矩陣,p以dBW為單位指定輸出噪聲的強度。但與實際差距較大。
data2=2*data1-1;
data4=awgn(data2,snr_in_dB(snr_num))
(c)參考“bpskqpsk125.m”的畫圖功能,給出Eb/N0---誤比特率曲線和高斯信道下的理論誤比特率曲線。
Bpsk時,在末尾加上如下程序段,得到圖樣:
figure;
semilogy(snr_in_dB,ber,O);
hold on
semilogy(snr_in_dB,0.5*erfc(sqrt(2*10.^(snr_in_dB/10))/sqrt(2)),+);
ylabel(BER);
xlabel(E_b/N_0 [dB]);
legend(simulation BPSK,theory gngauss BPSK );
Qpsk時,在末尾加上如下程序段,得到圖樣:
figure;
semilogy(snr_in_dB,ber,O);
hold on
semilogy(snr_in_dB,0.5*erfc(sqrt(2*10.^(snr_in_dB/10))/sqrt(2)),+);
ylabel(BER);
xlabel(E_b/N_0 [dB]);
legend(simulation QPSK,theory gngauss QPSK );
(d)觀察nd及nloop參數(shù)變化時,曲線的現(xiàn)象,并說明原因。
答:當參數(shù)nd、參數(shù)nloop足夠大時,Eb/N0---誤比特率曲線越平滑,可以從圖得到信噪比越大誤碼率越小的結(jié)論;當參數(shù)nd、參數(shù)nloop足夠小時,Eb/N0---誤比特率曲線越不平滑,不能從圖得到信噪比越大誤碼率越小的結(jié)論。
原因:參數(shù)nd的意義為Number of symbols that simulates in each loop,即每個循環(huán)運算中取的符號個數(shù),而nloop的意義為Number of simulation loops,即循環(huán)次數(shù)。參數(shù)取得越大,當然仿真精確性越高,參數(shù)越低,仿真精確性就越低。(此處就不附圖樣了)(e)畫出不同信噪比條件下的的星座圖,解釋其對誤碼率的影響。
BPSK的不同性噪比條件下的星座圖如下:
QPSK的不同性噪比條件下的星座圖如下:
結(jié)論:性噪比越大,落在判決范圍內(nèi)的的點越多,即誤碼率越低。
(f)通過程序畫出QPSK和BPSK的Eb/N0---誤比特率曲線,觀察曲線的現(xiàn)象,能得出什么結(jié)論。
答:由之前的結(jié)果可以看到,二者的誤比特率曲線是一致的。
3.若信源是你的學(xué)號,結(jié)合程序說明其在qpsk (調(diào)制mod)和(解調(diào)demod)子程序中的具體實現(xiàn)過程。
學(xué)號為11211041,
將其編碼:0001 0001 0010 0001 0001 0000 0100 0001 ,將其做正負電平值變換,之后編程:
Qpsk調(diào)制:
m2=ml./2;
paradata2=paradata;
count2=0;
for jj=1:nd
isi = zeros(para,1);
isq = zeros(para,1);
for ii = 1 : m2
isi = isi + 2.^( m2 - ii )
isq = isq + 2.^( m2 - ii ) ;
end
iout((1:para),jj)=isi/sqrt(2);
qout((1:para),jj)=isq/sqrt(2);
count2=count2+ml;
end
用isi和isp這兩個集合存儲虛部和實部,每次取出兩個信號進行調(diào)制,得到編碼為11(1/sqrt(2), 1/sqrt(2)),10(1/sqrt(2), -1/sqrt(2)),01(-1/sqrt(2), 1/sqrt(2)),00(-1/sqrt(2), -1/sqrt(2))
解調(diào)
demodata=zeros(para,ml*nd);
demodata((1:para),(1:ml:ml*nd-1))=idata((1:para),(1:nd)); demodata((1:para),(2:ml:ml*nd))=qdata((1:para),(1:nd));
解調(diào)時將數(shù)據(jù)按先虛部后實部的順序存入demodata里面,在根據(jù)主程序的方法demodata1=demodata > 0,判斷0或是1
4.針對題目2中的BPSK、QPSK,
(a)若信道使信號幅度呈瑞利衰落,畫出Eb/N0---誤比特率曲線和瑞利衰落下的理論誤比特率曲線 ,說明與題目2觀察結(jié)果的異同,并說明原因。
(a)bpsk:
Qpsk:
結(jié)論:加性高斯噪聲的誤比特率比瑞利信道的誤比特率高,說明在瑞利信道對信號的影響大,我們可以通過提高信噪比來降低誤碼率。
(b)若信道使信號幅度呈萊斯衰落,更改K值的大小,畫出Eb/N0---誤比特率曲線、瑞利衰落下的理論誤比特率曲線和高斯信道下的理論誤比特率曲線,觀察曲線的現(xiàn)象,能得出什么結(jié)論。
Bpsk:
Qpsk
從上述兩圖可以看出當信噪比較小時,萊斯信道衰落接近于瑞利信道 ,當信噪比逐漸增大時,萊斯信道越來越接近高斯信道。