www.gusucode.com > MIMO预编码技术源码程序 > MIMO预编码技术源码程序/code/MIMO_Linear_Precoding.m

    %ZF和MMSE准则线性预编码的比较

function MIMO_Linear_Precoding(T,R,STEP,SNAR);

%初始参数设置
Nt = T;    % 发送天线数目    %这个参数我们做修改做不同的仿真
Nr = R;    % 接收天线数目    %这个参数我们做修改做不同的仿真
num = 100; % 仿真符号数目
M = 4;     % 调制方式
Iter_num = 10; % iteration in some snr
SNR = [0:STEP:SNAR];%信噪比      %这个参数我们做修改做不同的仿真


%初始化
Len = length(SNR);
ber_mmse = zeros(1,Len);
ber_zf = zeros(1,Len);


%线性编码仿真过程
for index = 1:Len;
    snr = 10.^(SNR(index)/10);
    ea = 1;           % 每个天线发射的功率,也即信号向量中每个元素的功率
    es = ea*Nt;       % 总共的发射功率
    sigma_n2 = es/snr;% 噪声功率
    
    for cnt = 1:Iter_num;% 信道的实现次数的循环
        
        H = sqrt(1/2)*(randn(Nr,Nt)+j*randn(Nr,Nt));% H
        MMSE_F = H'*inv(H*H'+sigma_n2/ea*eye(Nt));  % H的MMSE估计
        ZF_F = H'*inv(H*H');                        % H的ZF估计
        beta_mmse = sqrt(es/norm(MMSE_F,'fro').^2);
        beta_zf = sqrt(es/norm(ZF_F,'fro').^2);
        F_MMSE = beta_mmse*MMSE_F;                  % MMSE的预编码矩阵
        F_ZF = beta_zf*ZF_F;                        % ZF的预编码矩阵
        
        for sym_index = 1:num;                      %在一帧数据符号中,信道保持不变
            
            Source = randint(Nt,1,M); 
            Sym = pskmod(Source,M,pi/4,'gray');     %qpsk modulator
            Sym_mmse = F_MMSE*Sym;                  %对符号进行MMSE预编码
            Sym_zf = F_ZF*Sym;                      %对符号进行ZF预编码
            noise = sqrt(sigma_n2/2)*(randn(Nr,2)+j*randn(Nr,2));%生成噪声功率为sigma_n2
            y_mmse = H*Sym_mmse + noise(:,1);% 通过信道并加噪声
            y_zf = H*Sym_zf + noise(:,2);% 通过信道并加噪声
            r_mmse = 1/beta_mmse*y_mmse;% 进行接收端的缩放
            r_zf = 1/beta_zf*y_zf;% 进行接收端的缩放
            Rec_Data_mmse = pskdemod(r_mmse,M,pi/4,'gray');% 对接收信号进行判决
            Rec_Data_zf = pskdemod(r_zf,M,pi/4,'gray');% 对接收信号进行判决
            
            [err ratio] = biterr(Rec_Data_mmse,Source,log2(M));% ber
            ber_mmse(1,index) = ber_mmse(1,index) + ratio;
            [err ratio] = biterr(Rec_Data_zf,Source,log2(M));%ber
            ber_zf(1,index) = ber_zf(1,index) + ratio;
        end; % loop for num
        
    end; % loop for iteration
    
end % loop for snr



ber_mmse = ber_mmse/Iter_num/num;
ber_zf = ber_zf/Iter_num/num;
figure(1);
semilogy(SNR,ber_mmse,'LineWidth',2,'Color',[0 0 0],'Marker','s');
hold on;
semilogy(SNR,ber_zf,'LineWidth',2,'Color',[0 0 0],'Marker','*');
grid on
xlabel('SNR(dB)');ylabel('BER');
legend('MMSE pre-coding','ZF pre-coding');


% ber_mmse = ber_mmse/Iter_num/num;
% ber_zf = ber_zf/Iter_num/num;
% figure(1);
% semilogy(SNR,ber_mmse,'LineWidth',2,'Color',[0.6 0.2 0.4],'Marker','s');
% hold on;
% semilogy(SNR,ber_zf,'LineWidth',2,'Color',[0.6 0.2 0.4],'Marker','*');
% grid on
% xlabel('SNR(dB)');ylabel('BER');
% legend('MMSE pre-coding','ZF pre-coding');