⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ber.m

📁 用MATLAB生成QPSK信号
💻 M
字号:
% QPSK系统仿真:AWGN信道,BER

clear;
SNRindB1=0:2:8;                                     % 设置SNR范围
SNRindB2=0:0.1:8;
for ii=1:length(SNRindB1),

counter=0;                                          % 计数器置0
numofsymbolerror=0;
numofbiterror=0;
while (numofbiterror<100)

N=1000;
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,10,11,01的概率均为1/4
        dsource1(i)=0; dsource2(i)=0;
        tt(ii,i)=complex(s00(1),s00(2));
    elseif (temp<0.5),                              
        dsource1(i)=0; dsource2(i)=1;
        tt(ii,i)=complex(s01(1),s01(2));
    elseif (temp<0.75),                             
        dsource1(i)=1; dsource2(i)=0;
        tt(ii,i)=complex(s10(1),s10(2));
    else                                            
        dsource1(i)=1; dsource2(i)=1;
        tt(ii,i)=complex(s11(1),s11(2));
    end;
end;

% 差错检测及误码率计算

for i=1:N,
        mm=raylrnd(0.7); 
    n=sgma*randn(1,2);                              % 生成两个服从N(0,sgma)的随机变量
    if ((dsource1(i)==0) & (dsource2(i)==0)), 
        r=mm*s00+n;                                    % 加入噪声
    elseif ((dsource1(i)==0) & (dsource2(i)==1)), 
        r=mm*s01+n;
    elseif ((dsource1(i)==1) & (dsource2(i)==0)), 
        r=mm*s10+n;
    else 
        r=mm*s11+n;
    end;
    
    % 判决
    rr(ii,i)=complex(r(1),r(2));
    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)), numofbiterror=numofbiterror+1; symbolerror=1; 
    end;
    if (decis2~=dsource2(i)), numofbiterror=numofbiterror+1; symbolerror=1; 
    end;
    if (symbolerror==1), numofsymbolerror=numofsymbolerror+1; 
    end;
end;
counter=counter+1;
end;
ps=numofsymbolerror/(N*counter);                    
pb=numofbiterror/(2*N*counter);                     

    smld_bit_err_prb(ii)=pb;
    smld_symbol_err_prb(ii)=ps;
    disp([ps,pb]);
end;

% 理论值
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;

% 画图
figure(1)                                           % BER图
semilogy(SNRindB1,smld_bit_err_prb,'bs');
% legend('AWGN Simulation');
hold on;
semilogy(SNRindB1,smld_symbol_err_prb,'ro');
% legend('Rayleigh Simulation');
hold on;
semilogy(SNRindB2,theo_err_prb,'b');
% legend('AWGN Theory');
hold on;
semilogy(SNRindB2,theo_err_ray,'r');
legend('AWGN Simulation','Rayleigh Simulation','AWGN Theory','Rayleigh Theory');
title('Error performance under the AWGN and Rayleigh fading channels')
grid on;
hold off;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -