📄 zf_sic.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 + -