%File: c9_MCBPSK.m
clear all
snrdB_min=-3;snrdB_max=8; %信噪比范围
snrdB=snrdB_min:1:snrdB_max; %从最小值逐1加到最大值
Nsymbols=input('Enter number of symbols > '); %输入发送符号总数
snr=10.^(snrdB/10); %单位换算(去dB)
h=waitbar(0,'SNR Iteration'); %调用waitbar
len_snr=length(snrdB);
for j=1:len_snr
waitbar(j/len_snr)
sigma=sqrt(1/(2*snr(j))); %噪声标准差
error_count=0;
for k=1:Nsymbols %开始模拟循环
d=round(rand(1)); %生产随机数
x_d=2*d-1; %发射机输出
n_d=sigma*randn(1); %噪声
y_d=x_d+n_d; %接收机输入
if y_d>0
d_est=1;
else
d_est=0;
end
if(d_est~=d)
error_count=error_count+1; %误差计数器
end
end
errors(j)=error_count; %存储误差计数值
end
close(h) %关闭waitbar
ber_sim=errors/Nsymbols; %误码率估计值
ber_theor=0.5*erfc(sqrt(snr)); %误码率理论值
semilogy(snrdB,ber_theor,snrdB,ber_sim,'o')
axis([snrdB_min snrdB_max 0.0001 1])
xlabel('SNR in dB')
ylabel('BER')
legend('Theoretical', 'Simulation')
%End of script file.
对于每一个SNR值,发送Nsymbols=10000个符号,运行结果如下图所示。注意,当SNR增加时,BER估计器的可靠度会变差,由于差错发生次数减小。这一现象表明,仿真所发送的符号数可能与SNR有关,或者是连续运行仿真程序,直到对每一个SNR值都记录到相同数目的差错为止。