www.pudn.com > awgn$qpsk.rar > QPSK_BER.m
> QPSK系统仿真:Rayleigh信道,Awgn下的BER
clear;
SNRindB1=0:2:8; > 设置SNR范围
SNRindB2=0:0.1:8;
for ii=1:length(SNRindB1),
counter=0; > 计数器置0
nse=0; >错误码元的个数
nbe=0; >错误比特的个数
while (nbe<500) > 循环终止条件:100个误比特
N=10000;
E=1; > 码元能量
snr=10^(SNRindB1(ii)/10); > 信噪比
sgma=sqrt(E/snr)/2; > 噪声功率
s00=[1 0]; s01=[0 -1]; s11=[-1 0]; s10=[0 1]; > 信号映射
> 信源产生
for i=1:N,
temp=rand; > 生成取值在0和1之间的服从均匀分布的随机变量
if (temp<0.25), > 信源输出00,概率均为1/4
dsource1(i)=0; dsource2(i)=0;
elseif (temp<0.5), > 信源输出01,概率均为1/4
dsource1(i)=0; dsource2(i)=1;
elseif (temp<0.75), > 信源输出10,概率均为1/4
dsource1(i)=1; dsource2(i)=0;
else
dsource1(i)=1; dsource2(i)=1; > 信源输出11,概率均为1/4
end;
end;
> ------------------------------------差错检测及误码率计算----------------------
for i=1:N,
mm=raylrnd(0.7); > 生成服从Rayleigh分布的随机变量
n=sgma*randn(1,2); > 生成两个服从N(0,sgma)的随机变量
if ((dsource1(i)==0) &amt; (dsource2(i)==0)),
r=mm*s00+n; > 加入噪声
elseif ((dsource1(i)==0) &amt; (dsource2(i)==1)),
r=mm*s01+n;
elseif ((dsource1(i)==1) &amt; (dsource2(i)==0)),
r=mm*s10+n;
else
r=mm*s11+n;
end;
> 判决
c00=dot(r,s00); c01=dot(r,s01); c10=dot(r,s10); c11=dot(r,s11);
c_max=max([c00,c01,c10,c11]);
if (c00==c_max), decis1=0; decis2=0;
elseif (c01==c_max), decis1=0; decis2=1;
elseif (c10==c_max), decis1=1; decis2=0;
else decis1=1; decis2=1;
end;
>--------------------------------- 计算误码率及误符号率------------------------
symbolerror=0;
if (decis1~=dsource1(i)), nbe=nbe+1; symbolerror=1;
end;
if (decis2~=dsource2(i)), nbe=nbe+1; symbolerror=1;
end;
if (symbolerror==1), nse=nse+1;
end;
end;
counter=counter+1;
end;
ps=nse/(N*counter);
pb=nbe/(2*N*counter);
smld_bit_err_prb(ii)=pb;
smld_symbol_err_prb(ii)=ps;
disp([ps,pb]);
end;
>--------------------------------------BER的理论值-------------------------------
for i=1:length(SNRindB2),
SNR=10^(SNRindB2(i)/10); > 信噪比
theo_err_prb(i)=0.5*erfc(sqrt(SNR)); > AWGN信道下的误码率理论值
theo_err_ray(i)=0.5*(1-1/sqrt(1+1/SNR)); > Rayleigh衰落信道下的误码率理论值
end;
>--------------------------------------画 BER的图--------------------------------
semilogy(SNRindB1,smld_bit_err_prb,'r*');
hold on;
semilogy(SNRindB1,smld_symbol_err_prb,'ro');
hold on;
semilogy(SNRindB2,theo_err_prb,'b');
hold on;
semilogy(SNRindB2,theo_err_ray,'b');
grid on;
hold off;