% %  [ 0 、预处理] 
clc; 
clear; 
close all;
% %  [ 1 、配置参数] 
N= 1000000 ;             % 数据点数(个)
SNR_dB= 0 : 10 ;          % 信噪比(dB形式)
SNR= 10. ^ ( SNR_dB/ 10 ) ;  % 信噪比(一般形式,Eb/ N0)
Ps= 1 ;                 % 信号功率,为1 时其dB形式为0 。
Pn= Ps. / SNR;           % 噪声功率
Error_Count= zeros ( 1 , length ( SNR_dB) ) ;       % 码元错误个数
SER_simu= zeros ( 1 , length ( SNR_dB) ) ;          % 仿真误码率
SER_theory= zeros ( 1 , length ( SNR_dB) ) ;        % 理论误码率
Demod= zeros ( length ( SNR_dB) , N) ;             % 解调信号
xn= zeros ( length ( SNR_dB) , N) ;                % 加噪信号xn
% %  [ 2 、生成信号] 
sn= round ( rand ( 1 , N) ) ;          %  原信号: 0 , 1 序列sn
sn1= round ( ( sn- 1 / 2 ) * 2 ) ;        %  原信号:- 1 , 1 序列sn1
var ( sn1) 
for  i= 1 : length ( SNR_dB)  
      %  这里给出三种加噪方法,三种方法的最终结果基本一致。
%      % 1 、wgn函数生成白噪声
%      noise= wgn ( 1 , N, 10 * log10 ( Pn ( i) / 2 ) ) ; % 第三个参数指噪声的功率(dBW)
%      xn ( i, : ) = sn1+ noise; 
    
      % 2 、awgn函数生成白噪声
%        xn ( i, : ) = awgn ( sn1, SNR_dB ( i) + 10 * log10 ( 2 ) , "measured" ) ; % 第二个参数指SNR(dB)
    % 3 、randn函数生成白噪声
    noise =  sqrt ( Pn ( i) / 2 ) * randn ( 1 , N) ;  % 高斯白噪声
    xn ( i, : ) = sn1+ noise; 
end
% %  [ 3 、解码] 
for  i= 1 : length ( SNR_dB) 
     for  j= 1 : N
         if  ( xn ( i, j) > 0 ) 
             Demod ( i, j) = 1 ;          % 接收信号大于0 ,则判1 
         else 
             Demod ( i, j) = 0 ;        % 接收信号小于0 ,则判0 
         end
     end
     % 计算错误比特个数
     for  j= 1 : N
         if ( Demod ( i, j) ~ = sn ( 1 , j) ) 
              Error_Count ( i) = Error_Count ( i) + 1 ; 
         end
     end
     % 计算误码率
     SER_simu ( i) = Error_Count ( i) / N;            %  仿真误码率
     SER_theory ( i) = qfunc ( sqrt ( 2 * SNR ( i) ) ) ;     %  理论误码率
end
% %  [ 4 、显示结果] 
semilogy ( SNR_dB, SER_simu, 'go-' , SNR_dB, SER_theory, 'r*-' ) ;      
axis ( [ 0  10  10 ^ - 5  10 ^ - 1 ] ) ;                       
xlabel ( '信噪比SNR/dB' ) ;   % 横轴坐标
ylabel ( '误码率BER' ) ;      % 纵轴坐标
title ( "AWGN在BPSK信道下的理论误码率和仿真误码率" ) ; 
grid on;                     % 显示表格线
legend ( "仿真值" , "理论值" ) ;