📄 llrnlayer.m
字号:
function [SoftInf,DetSig,IX] =LLRnLayer(InputMessage,ChM,M,Sigma,DetFlag,CompFlag,Ind)
% [BLR,DeSymb,IX]= LLRnLayer(RxSig_MF,Ch_Total,M,sigma_n2,1, 2, 1);
% compute the log-likelihood ratio using ZF or MMSE Algorithms for MQAM
% CopyRight(C) Jim, NCL, UESTC
% Date: 2006-05-15
% =========================================================================
% ChM: channel matrix
% Sigma: the variance of noise
% M: the modulation size
% DetFlag: the flag of detector; 0: ZF, 1: MMSE or approximate MMSE
% ComFlag: the flag of complexity; 0: minimum MMSE of each layer, 1:
% log-sum MMSE of each layer, 2: minimum approximate MMSE of each layer,
% 3: log-sum approximate MMSE of each layer
%
% =========================================================================
%星座
S=[-3-3j,-3-j,-3+j,-3+3j,...
-1-3j,-1-j,-1+j,-1+3j,...
1-3j, 1-j, 1+j, 1+3j,...
3-3j, 3-j, 3+j, 3+3j]/sqrt(10);
Symb2Bits=[1 1 1 1; 1 1 1 0; 1 0 1 0; 1 0 1 1;...
1 1 0 1; 1 1 0 0; 1 0 0 0; 1 0 0 1;...
0 1 0 1; 0 1 0 0; 0 0 0 0; 0 0 0 1;...
0 1 1 1; 0 1 1 0; 0 0 1 0; 0 0 1 1];
[Mrx,Mtx]=size(ChM); %8*8
RxSig=InputMessage;%接受信号
Chan=ChM;% 信道H
% zero forcing or MMSE detector 选择最先检查的行向量
VarInterf=zeros(1,Mtx); %1X8
PartMean=zeros(1,Mtx);
if DetFlag==0 %迫零
InvCh=inv(Chan'*Chan)*Chan'; %MxN
DetSig=InvCh*RxSig; %【0.7668 + 0.2111i 0.9922 + 0.0010i -0.1266 - 0.4491i -0.8079 + 1.1217i -0.6364 + 0.9147i 0.5342 - 0.4386i 0.5497 + 0.3293i】
for m=1:Mtx
ChanNorm(m)=norm(InvCh(m,:),'fro')^2; %w11^2+...+w1N^2; .....; wM1^20+...+wMN^2
VarInterf(m)=Sigma*Sigma*ChanNorm(m);
PartMean(m)=1;
end
[B,IX]=sort(ChanNorm,'descend'); %对wi模平方,倒序排列
else
InvCh=inv(Chan'*Chan+Sigma*Sigma*eye(Mtx)/Mtx)*Chan'; %alfa=Sigma*Sigma*eye(Mtx)/Mtx=1/SNR=N0/Es
DetSig=InvCh*RxSig ; %MMSE
W=inv(eye(Mtx)+inv(Chan'*Chan)*Sigma*Sigma/Mtx);
for m=1:Mtx
VarInterf(m)=Mtx*(norm(InvCh(m,:)*Chan,'fro')^2-abs(InvCh(m,:)*Chan(:,m))^2)+Sigma*Sigma*norm(InvCh(m,:),'fro')^2;
ChanNorm(m)=Mtx*abs(InvCh(m,:)*Chan(:,m))^2/VarInterf(m);
%ChanNorm(m)=norm(InvCh(m,:),'fro')^2;
PartMean(m)=InvCh(m,:)*Chan(:,m);
end
[B,IX]=sort(ChanNorm,'ascend');
end
% two methods of calculating the bit likelihood information
if CompFlag==0
Blr=zeros(1,Ind*log2(M));%0 0 0 0
for k=1:Ind
for i=1:log2(M)
MinZeroPrb=1e6;
MinOnePrb=1e6;
for n=1:M
if Symb2Bits(n,i)==0 %
ZeroPrb=abs(DetSig(IX(k))-PartMean(IX(k))*S(n))^2;
if ZeroPrb<MinZeroPrb
MinZeroPrb=ZeroPrb;
end
else
OnePrb=abs(DetSig(IX(k))-PartMean(IX(k))*S(n))^2;
if OnePrb<MinOnePrb
MinOnePrb=OnePrb;
end
end
end
Blr((i-1)*Ind+k)=(MinZeroPrb-MinOnePrb)/VarInterf(IX(k));
end
end
elseif CompFlag==1
Blr=zeros(1,Ind*log2(M));
for k=1:Ind
for i=1:log2(M)
OnePrb=0;
ZeroPrb=0;
for n=1:M
if Symb2Bits(n,i)==0
NumeratorValue=abs(DetSig(IX(k))-PartMean(IX(k))*S(n))^2;
if NumeratorValue<-700
NumeratorValue=-700;
end
Yita=exp(-NumeratorValue/VarInterf(IX(k)));
ZeroPrb=ZeroPrb+Yita;
else
NumeratorValue=abs(DetSig(IX(k))-PartMean(IX(k))*S(n))^2;
if NumeratorValue<-700
NumeratorValue=-700;
end
Yita=exp(-NumeratorValue/VarInterf(IX(k)));
OnePrb=OnePrb+Yita;
end
end
if OnePrb<1e-10
OnePrb=1e-10;
elseif ZeroPrb<1e-10
ZeroPrb=1e-10;
end
Blr((i-1)*Ind+k)=log(OnePrb/ZeroPrb);
end
end
elseif CompFlag==2
Blr=zeros(1,Ind*log2(M));
for k=1:Ind
for i=1:log2(M)
MinZeroPrb=1e6;
MinOnePrb=1e6;
for n=1:M
if Symb2Bits(n,i)==0
ZeroPrb=abs(DetSig(IX(k))-W(IX(k),IX(k))*S(n))^2;
if ZeroPrb<MinZeroPrb
MinZeroPrb=ZeroPrb;
end
else
OnePrb=abs(DetSig(IX(k))-W(IX(k),IX(k))*S(n))^2;
if OnePrb<MinOnePrb
MinOnePrb=OnePrb;
end
end
end
Blr((i-1)*Ind+k)=(MinZeroPrb-MinOnePrb)/(1-W(IX(k),IX(k)));
end
end
else
Blr=zeros(1,Ind*log2(M));
for k=1:Ind
for i=1:log2(M)
OnePrb=0;
ZeroPrb=0;
for n=1:M
if Symb2Bits(n,i)==0
NumeratorValue=abs(DetSig(IX(k))-W(IX(k),IX(k))*S(n))^2;
if NumeratorValue<-700
NumeratorValue=-700;
end
VarInterf(k)=1/(1-W(IX(k),IX(k)));
Yita=exp(-NumeratorValue*VarInterf(IX(k)));
ZeroPrb=ZeroPrb+Yita;
else
NumeratorValue=abs(DetSig(IX(k))-W(IX(k),IX(k))*S(n))^2;
if NumeratorValue<-700
NumeratorValue=-700;
end
VarInterf(k)=1/(1-W(IX(k),IX(k)));
Yita=exp(-NumeratorValue*VarInterf(IX(k)));
OnePrb=OnePrb+Yita;
end
end
if OnePrb<1e-10
OnePrb=1e-10;
elseif ZeroPrb<1e-10
ZeroPrb=1e-10;
end
Blr((i-1)*Ind+k)=log(OnePrb/ZeroPrb);
end
end
end
% output the bit likelihood information
SoftInf=Blr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -