📄 mmse_sic.m
字号:
function LLR_value=MMSE_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);
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
[a,b]=size(single_ch_m);
MMSE_Matrix=inv(single_ch_m'*single_ch_m+noise_var*eye(b))*single_ch_m';
%确定用MMSE_Matrix中的哪一行来检测哪个发送天线的数据(注意要确定两个量,一个是哪一行,一个是哪一个天线,注意与ZF的区别)
temp_Matrix=MMSE_Matrix*single_ch_m;
temp_min_value=zeros(b,1);
temp_min_index=zeros(b,1);
for i3=1:b
temp_vector=temp_Matrix(i3,:);
temp_norm=abs(temp_vector).^2;
temp_sum=sum(temp_norm)*(1+noise_var);
[temp_value,temp_index]=max(temp_norm./(temp_sum-temp_norm)); %在相同 MMSE_vector 的条件下找检测发送天线信噪比最大的
temp_min_value(i3,1)=temp_value;
temp_min_index(i3,1)=temp_index;
end;
[value11,vector_index]=max(temp_min_value); %再在不同 MMSE_vector 中挑信噪比最大的
MMSE_vector=MMSE_Matrix(vector_index,:);
index=temp_min_index(vector_index,1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I=find(detected_T_Antenna==0);
T_Antenna_number=I(index);
detected_T_Antenna(T_Antenna_number,1)=1;
soft_value=MMSE_vector*single_sig/temp_Matrix(vector_index,index);
%%%%%% 根据检测器输出信息进行判决 %%%%%%%%%%
%% 计算比特级似然值
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(MMSE_vector).^2));
Prob_0=-abs(soft_value-mapping(Index_bit_0)).^2/(noise_var*sum(abs(MMSE_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 + -