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

📄 llrnlayer.m

📁 是一个四发四收的球型译码程序
💻 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 + -