📄 mmse_pic.m
字号:
function LLR_value=MMSE_PIC(rec_sig,channel_matrix,noise_var,mapping,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);
Prob_0_aprior=1./(1+exp(aprior_det));
Prob_1_aprior=exp(aprior_det)./(1+exp(aprior_det));
%%%%%%%%
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_0_aprior=Prob_0_aprior(:,i1);
single_1_aprior=Prob_1_aprior(:,i1);
single_0_aprior=reshape(single_0_aprior,T_Antenna,K);
single_1_aprior=reshape(single_1_aprior,T_Antenna,K);
%%%%%%%%% 计算符号级先验信息 %%%%%%%%%%%%%
single_symbol_aprior=zeros(T_Antenna,M);
temp=[0:M-1];
bit_map=de2bi(temp,K,'left-msb');
for i2=1:M
Index_0=find(bit_map(i2,:)==0);
Index_1=find(bit_map(i2,:)==1);
single_symbol_aprior(:,i2)=prod(single_0_aprior(:,Index_0),2).*prod(single_1_aprior(:,Index_1),2);
end;
sum_single_symbol_aprior=sum(single_symbol_aprior,2); % 归一值
sum_matrix=repmat(sum_single_symbol_aprior,1,M);
single_symbol_aprior=single_symbol_aprior./sum_matrix; % 归一化
%%%%%%%%%%% 计算符号级先验信息的期望值 %%%%%%%%%%%%%%%%%
E_symbol_aprior=single_symbol_aprior*mapping.';
%%%%%%%%%%%%%%%% 逐层检测 %%%%%%%%%%%%%%%%%%%
soft_value_vector=zeros(T_Antenna,1);
noise_var_change_vector=zeros(T_Antenna,1);
for i2=1:T_Antenna
deleted_ch_m=single_ch_m;
deleted_ch_m(:,i2)=[];
deleted_E_aprior=E_symbol_aprior;
deleted_E_aprior(i2)=[];
deleted_interference=deleted_ch_m*deleted_E_aprior;
deleted_sig=single_sig-deleted_interference;
%%%%%%%% 计算权重 %%%%%%%%%%%%%%%
P_Matrix=single_ch_m(:,i2)*single_ch_m(:,i2)';
temp_Matrix=diag(diag(deleted_E_aprior*deleted_E_aprior'));
Q_Matrix=deleted_ch_m*(eye(T_Antenna-1)-temp_Matrix)*deleted_ch_m';
MMSE_weight_vector=inv(P_Matrix+Q_Matrix+noise_var*eye(R_Antenna))*single_ch_m(:,i2);
soft_value_vector(i2)=MMSE_weight_vector'*deleted_sig;
noise_var_change_vector(i2)=sum(abs(MMSE_weight_vector).^2)*noise_var;
end;
%%%%%%%%%%%%%%%%%% 计算比特级似然值 %%%%%%%%%%%%%%%%%%%%%%%%%
soft_value_Matrix=repmat(soft_value_vector,1,M/2);
mapping_Matrix=repmat(mapping,T_Antenna,1);
noise_var_change_Matrix=repmat(noise_var_change_vector,1,M/2);
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_Matrix-mapping_Matrix(:,Index_bit_1)).^2./noise_var_change_Matrix;
Prob_0=-abs(soft_value_Matrix-mapping_Matrix(:,Index_bit_0)).^2./noise_var_change_Matrix;
%判断语句是为了防止高信噪比下出现溢出的情况
Prob_1(find(Prob_1<-1e300))=-1e300;
Prob_0(find(Prob_0<-1e300))=-1e300;
single_LLR_value(:,i3)=max(Prob_1,[],2)-max(Prob_0,[],2); % 采用了log(exp(x)+exp(y))=max(x,y)的近似公式,有效的避免了计算溢出。
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 + -