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

📄 zf_sic.m

📁 这是一个vblast程序
💻 M
字号:
function LLR_value=ZF_SIC(rec_sig,channel_matrix,mapping,noise_var,aprior_det)
[R_Antenna,T_Antenna,sig_length]=size(channel_matrix);
M=length(mapping);
K=log2(M);
%关于先验信息
aprior_det=reshape(aprior_det,K*T_Antenna,sig_length);
%%%%%%%%
dec_data1=zeros(T_Antenna,sig_length*K);
LLR_value=zeros(sig_length,T_Antenna*K);   %比特级似然值
for i1=1:sig_length
    single_ch_m=channel_matrix(:,:,i1);
    single_sig=rec_sig(:,i1);
    %%%%%%%%%%%
    single_aprior=aprior_det(:,i1);
    single_aprior=reshape(single_aprior,T_Antenna,K);
    %%%%%%%%%%
    detected_T_Antenna=zeros(T_Antenna,1);
    single_LLR_value=zeros(T_Antenna,K);
    for i2=1:T_Antenna
        ZF_Matrix=pinv(single_ch_m);
        [value,index]=min(sum(abs(ZF_Matrix).^2,2));
        I=find(detected_T_Antenna==0);
        T_Antenna_number=I(index);
        detected_T_Antenna(T_Antenna_number,1)=1;
        ZF_vector=ZF_Matrix(index,:);
        soft_value=ZF_vector*single_sig;
        %%%%%% 根据检测器输出信息进行判决 %%%%%%%%%%
        %% 计算比特级似然值
        temp=[0:M-1];
        bit_map=de2bi(temp,K,'left-msb');
        for i3=1:K
            Index_bit_1=find(bit_map(:,i3)==1);
            Index_bit_0=find(bit_map(:,i3)==0);
            Prob_1=-abs(soft_value-mapping(Index_bit_1)).^2/(noise_var*sum(abs(ZF_vector).^2));
            Prob_0=-abs(soft_value-mapping(Index_bit_0)).^2/(noise_var*sum(abs(ZF_vector).^2));   
            %判断语句是为了防止高信噪比下出现溢出的情况
            Prob_1(find(Prob_1<-1e300))=-1e300;
            Prob_0(find(Prob_0<-1e300))=-1e300;
            single_LLR_value(T_Antenna_number,i3)=max(Prob_1)-max(Prob_0);    % 采用了log(exp(x)+exp(y))=max(x,y)的近似公式,有效的避免了计算溢出。
            single_LLR_value(T_Antenna_number,i3)=single_LLR_value(T_Antenna_number,i3)-log(1/(1+exp(single_aprior(T_Antenna_number,i3))))...
                                      +log(exp(single_aprior(T_Antenna_number,i3))/(1+exp(single_aprior(T_Antenna_number,i3))));    %加先验信息
        end;     
        %% 根据比特级似值来判断是那个符号%%%
        hard_bit=single_LLR_value(T_Antenna_number,:);
        hard_bit(find(hard_bit>0))=1;
        hard_bit(find(hard_bit<=0))=0;
        base=2.^[K-1:-1:0];
        single_value=mapping(base*hard_bit.'+1);
        single_sig=single_sig-single_ch_m(:,index)*single_value;
        single_ch_m(:,index)=[];
    end;
    LLR_value(i1,:)=single_LLR_value(:)';
end;
LLR_value=LLR_value.';
LLR_value=LLR_value(:).';
%此步即为了控制似然值的范围
for i1=1:sig_length*T_Antenna*K 
    if LLR_value(1,i1)>10
       LLR_value(1,i1)=10;
    end;
    if LLR_value(1,i1)<-10
       LLR_value(1,i1)=-10;
    end;   
end;

⌨️ 快捷键说明

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