zoukankan      html  css  js  c++  java
  • 数字通信—BPSK在Rayleigh信道下误码率仿真

    1 实验原理

    在本实验中均是假设的准静态平坦衰落,即多径中每个径到达的时间差都 差不多,远小于一个符号的码元周期。而且信道随时间变化比较慢,在一个时 间选择性衰落的周期内。这样经过信道的相移就可以准确估计出来,首先根据 上个实验已知 BPSK 调制在 AWGN 信道下的误码率为:

    [P_{e}=mathrm{Q}left(sqrt{frac{2 varepsilon_{b}}{N_{0}}} ight) ag{1} ]

    由于可以估计出相位,此时的接收信号可以用下式表示:

    [r(t)=alpha s(t)+n(t) ag{2} ]

    其中 $ alpha$ 就是对信号幅度的影响,即服从瑞利分布。对于某一个特定的 (alpha),此时的接收端信噪比变成了(frac{alpha^2varepsilon_{b}}{N_0}) ,所以此时的 BPSK 误码率可以表示成:

    [P_{e,alpha}=mathrm{Q}left(sqrt{alpha^2frac{2 varepsilon_{b}}{N_{0}}} ight) ag{3} ]

    由于 (alpha) 是个随机变量,所以应该对 (alpha) 进行积分运算求误码率:

    [P_{e, B P S K}=int_{0}^{infty} P_{e,alpha}cdotunderbrace{frac{alpha}{sigma^{2}} e^{-frac{alpha^{2}}{2 sigma^{2}}}}_{ ext {Rayleigh }} d alpha ag{4} ]

    最终得到BPSK在瑞利信道下的理论误码率公式为:

    [P_{e,BPSK}=frac{1}{2}left(1-sqrt{frac{ar{gamma}_{b}}{1+ar{gamma}_{b}}} ight) ag{5} ]

    其中 (ar{gamma}_{b}) 是平均信噪比,即:

    [ar{gamma}_{b}=frac{varepsilon_{b}}{N_{0}} Eleft(alpha^{2} ight) ag{6} ]

    对于BPSK误码率和误比特率是一样的

    2 实验仿真

    仿真结果如下图所示:

    1. 瑞利衰落信道即服从复高斯分布,实部和虚部是均值为0、方差为(sigma^2)的独立同分布高斯随机变量。注意这里的方差和后面计算平均信噪比的 (Eleft(alpha^{2} ight)) 有关:(Eleft(alpha^{2} ight)=2sigma^2)。仿真的时候要前后对应上。
    2. 未估计出信道指的是对经过瑞利信道的信号直接进行接收判决,这时候基本上误码率在50%,和瞎猜一样。

    3 仿真代码

    %% 初始化参数
    clc
    clear
    close all;
    M = 2;
    nsymbol = 100000;                       %原始数据长度
    SNR_dB = 0:35;                          %信噪比dB形式
    data_source = round(rand(1,nsymbol));   %生成二进制随机序列 
    %% 坐标点映射
    data_send = (data_source - 1/2)*2;      
    %%
    Eb = norm(data_send).^2/nsymbol;        %每比特能量
    snr = 10.^(SNR_dB/10); 
    N0 = Eb./snr; 
    sigma=sqrt(N0/2);
    sigma_rayleigh = 1; %复高斯分布的方差,实部和虚部方差分别除以2
    h=(normrnd(0,sqrt(sigma_rayleigh),...
        [1 nsymbol])+i*normrnd(0,sqrt(sigma_rayleigh),[1 nsymbol]))/sqrt(2);
    r = abs(h); %取幅度值
    
    for Eb_N0 = 1:length(SNR_dB)
         n=sigma(Eb_N0)*randn(1,nsymbol) + 1j*sigma(Eb_N0)*randn(1,nsymbol); 
         receive=data_send.*h+n;    %加噪声
         m1 = find(real(receive) > 0);
         m2 = find(real(receive) <= 0);
         redata(m1) = 1;
         redata(m2) = 0;
         % =====================
         % 假设已经估计出了信道相位
         % =====================
         receive_estimated = data_send.*r+n;    %「1」估计出相位后只影响幅度
         %receive_estimated = receive./h;       %「2」或者直接用接收信道除上CSI
         m3 = find(real(receive_estimated) > 0);
         m4 = find(real(receive_estimated) <= 0);
         redata_estimated(m3) = 1;
         redata_estimated(m4) = 0;
         [total,~]=symerr(data_source,redata);
         [total_estimated,~]=symerr(data_source,redata_estimated);
         Pe_simu(Eb_N0) = total/nsymbol;                           %未估计出信道的仿真误码率
         Pe_simu_estimated(Eb_N0) = total_estimated/nsymbol;       %已估计出信道的仿真误码率
         Pe_theory(Eb_N0) = ...
         (1-sqrt(sigma_rayleigh*snr(Eb_N0)/(1+sigma_rayleigh*snr(Eb_N0))))/2; %理论误码率
         Pe_theory_Awgn(Eb_N0) = qfunc(sqrt(2*snr(Eb_N0)));        %高斯信道下的理论误码率
    end
    
    figure(1);
    semilogy(SNR_dB,Pe_simu,'-r*',SNR_dB,Pe_simu_estimated,...
    'M-X',SNR_dB,Pe_theory,'k-s',SNR_dB,Pe_theory_Awgn,'b-p');     
    
    grid on;                                      
    axis([0 35 10^-5 10^0])   
    title('BPSK调制信号在Rayleigh信道下的性能')
    xlabel('信噪比/dB');                     
    ylabel('误码率');                                  
    legend('BPSK仿真误码率(未估计出信道)', 'BPSK仿真误码率(已估计出信道)',...
    'BPSK理论误码率', 'AWGN信道下理论误码率');  
    
    
  • 相关阅读:
    Qt MFC 混合编程的问题
    DECLARE_MESSAGE_MAP用法
    DECLARE_DYNCREATE与DECLARE_DYNAMIC区别
    Qt unsigned char* (uchar*) 转为QImage
    C++ SafeArrayAccessData,SafeArrayUnaccessData使用
    C++ 实现 COM → IUnknown → 接口
    C++ COM编程之IUnknown接口
    C++ COM三大接口:IUnknown、IClassFactory、IDispatch。
    C++ COM组件QueryInterface函数
    C++ COM组件的AddRef和Release()方法使用
  • 原文地址:https://www.cnblogs.com/MayeZhang/p/14752754.html
Copyright © 2011-2022 走看看