Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序

Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序

完整程序:

clc;
clear;
close all;
warning off;
addpath(genpath(pwd));

%%%%%%%%%%%%%%%%%%%%%%%%% Initialization %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 10^6; 
r_n = rand(1,N)>0.5;
BPSK = 2*r_n-1;
E_n_dB = -2:1:15; 
E_n_ln = 10.^(E_n_dB/10);
n_rcv =  [1 2];
n_trans=2;
th_Ber_ray = 0.5.*(1-sqrt(E_n_ln./(E_n_ln+1))); 
p_R_MRC = 1/2 - 1/2*(1+1./E_n_ln).^(-1/2);
th_Ber_R_MRC = p_R_MRC.^2.*(1+2*(1-p_R_MRC)); 
p_Alamouti = 1/2 - 1/2*(1+2./E_n_ln).^(-1/2);
th_Ber_Alamouti = p_Alamouti.^2.*(1+2*(1-p_Alamouti)); 
%%%%%%%%%%%%%%%%%%%%%%%%% One by One System  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for p = 1:length(E_n_dB)
   W_n = 1/sqrt(2)*[randn(1,N) + 1j*randn(1,N)]; 
   C_h = 1/sqrt(2)*[randn(1,N) + 1j*randn(1,N)]; 
   R_x= C_h.*BPSK + 10^(-E_n_dB(p)/20)*W_n; 
   E_x = R_x./C_h;
   D_x = real(E_x)>0;
   N_Errors_ray(p) = size(find([r_n- D_x]),2);
end
S_Ber_ray = N_Errors_ray/N;
semilogy(E_n_dB,th_Ber_ray,'-g','LineWidth',2);hold on;
semilogy(E_n_dB,S_Ber_ray,'-pr','LineWidth',2);
%%%%%%%%%%%%%%%%%%% Receive MRC one by Two System  %%%%%%%%%%%%%%%%%%%%%%%%
for p = 1:length(n_rcv)
    for q = 1:length(E_n_dB)
        W_n = 1/sqrt(2)*[randn(n_rcv(p),N) + 1j*randn(n_rcv(p),N)];
        C_h = 1/sqrt(2)*[randn(n_rcv(p),N) + 1j*randn(n_rcv(p),N)]; 
        M_BPSK = kron(ones(n_rcv(p),1),BPSK);
        R_x = C_h.*M_BPSK + 10^(-E_n_dB(q)/20)*W_n;
        E_x = sum(conj(C_h).*R_x,1)./sum(C_h.*conj(C_h),1); 
        D_x = real(E_x)>0;
        N_Errors_MRC(p,q) = size(find([r_n- D_x]),2);
    end
end
S_Ber_R = N_Errors_MRC/N;
S_Ber_R_MRC = S_Ber_R(2,:);
semilogy(E_n_dB,th_Ber_R_MRC,'-r','LineWidth',2);hold on;
semilogy(E_n_dB,S_Ber_R_MRC,'-ob','LineWidth',2);
%%%%%%%%%%%%%% Transmit beamforming for two by One System  %%%%%%%%%%%%%%%%
for p = 1:length(E_n_dB)
    W_n = 1/sqrt(2)*[randn(1,N) + 1j*randn(1,N)]; 
    C_h = 1/sqrt(2)*[randn(n_trans,N) + 1j*randn(n_trans,N)]; 
    M_BPSK = (1/sqrt(n_trans))*kron(ones(n_trans,1),BPSK); 
    C_h_E = C_h.*exp(-1j*angle(C_h));
    R_x = sum(C_h_E.*M_BPSK,1) + 10^(-E_n_dB(p)/20)*W_n; 
    E_x = R_x./sum(C_h_E,1); 
    D_x = real(E_x)>0;
    N_Errors_Beam(p) = size(find([r_n- D_x]),2);
end
S_Ber_T_Beam = N_Errors_Beam/N; 
semilogy(E_n_dB,S_Ber_T_Beam,'-*m','LineWidth',2);
%%%%%%%%%%%%%%%%% Alamouti Code for two by One System  %%%%%%%%%%%%%%%%%%%%

for p = 1:length(E_n_dB)
    Z_c = zeros(2,N);
    Z_c(:,1:2:end) = (1/sqrt(2))*reshape(BPSK,2,N/2);
    P_c=flipud(reshape(conj(BPSK),2,N/2));
    Z_c(:,2:2:end) = (1/sqrt(2))*(kron(ones(1,N/2),[-1;1]).*P_c); 
    C_h = 1/sqrt(2)*[randn(1,N) + 1j*randn(1,N)];
    M_BPSK = kron(reshape(C_h,2,N/2),ones(1,2));     
    W_n = 1/sqrt(2)*[randn(1,N) + 1j*randn(1,N)];
    R_x = sum(M_BPSK.*Z_c,1) + 10^(-E_n_dB(p)/20)*W_n;
    M_Rx = kron(reshape(R_x,2,N/2),ones(1,2)); 
    M_Rx(2,:) = conj(M_Rx(2,:)); 
    Z_E = zeros(2,N);
    Z_E(:,[1:2:end]) = reshape(C_h,2,N/2); 
    Z_c=flipud(reshape(C_h,2,N/2));
    Z_E(:,[2:2:end]) = kron(ones(1,N/2),[1;-1]).*Z_c; 
    Z_E(1,:) = conj(Z_E(1,:));
    Z_E_P = sum(Z_E.*conj(Z_E),1);
    E_x = sum(Z_E.*M_Rx,1)./Z_E_P; 
    E_x(2:2:end) = conj(E_x(2:2:end));
    D_x = real(E_x)>0;
    N_Errors_Alamouti(p) = size(find([r_n- D_x]),2);
end
S_Ber_Alamouti = N_Errors_Alamouti/N; 
semilogy(E_n_dB,th_Ber_Alamouti,'-+c','LineWidth',2);hold on;
semilogy(E_n_dB,S_Ber_Alamouti,'-dk','LineWidth',2);
grid on
legend('Theory-(1-by-1) System', 'Simulation-(1-by-1) System','Theory-Rx-MRC (1-by-2) System', 'Simulation-Rx-MRC (1-by-2) System','Simulation-Tx-Beam (2-by-1) System','Theory-Alamouti (2-by-1) System', 'Simulation-Alamouti (2-by-1) System','');
xlabel('SNR (dB)','fontsize',12);
ylabel('Symbol Error Rate (SER)','fontsize',12);
 
axis([-2 max(E_n_dB) min(S_Ber_R_MRC) max(S_Ber_ray)])

挨个将代码复制到一个m文件里即可!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值