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

1.问题描述:

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

2.部分程序:

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                   ZF和MMSE准则线性预编码的比较
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
clear all;
close all;
warning off;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                   system parameter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Nt = 4; % the Tx antenna number
Nr = 4; % the Rx antenna number
num = 100; % 帧内信道保持不变,帧的符号数
M = 4;% QPSK modulation
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                   simulation parameter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Iter_num = 10; % iteration in some snr
SNR = [0:2:10];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                         init
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Len = length(SNR);
ber_mmse = zeros(1,Len);
ber_zf = zeros(1,Len);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                         main process
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for index = 1:Len;%不同信噪比的循环
    
    snr = 10.^(SNR(index)/10);
    ea = 1;% 每个天线发射的功率,也即信号向量中每个元素的功率
    es = ea*Nt; % 总共的发射功率
    sigma_n2 = es/snr;% noise power
    
    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);% random data generator
            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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                          plot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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');

3.仿真结论:

D00002

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/114645169
ZF