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

📄 mmse_dfe.m

📁 基于Matlab
💻 M
字号:
% mmse_dfe    Designs Un/biased MMSE T or T/2-spaced feedforward equalizer 
%             and T-spaced decision feedback equalizer  (DFE) 
%             for a T or T/2-spaced complex FIR channel at a certain 
%             SNR (dB) of AWGN and a unit power iid source given 
%             a cursor delay or range of delays. 
% 
% [h,f,d,delta,mmse] = mmse_dfe(c,snrdb,Nf,Nd,delay,pdelay,bias,spacing)
%   
%                 returns:
%                            h      :   T-spaced channel-FSE response
%                            f      :   FSE          
%                            d      :   DFE          
%                            delta  :   best delay
%                            mmse   :   Un/biased Minimum Mean Square Error
%                                       (i.e. design is scaled so that
%                                        cursor is set to unity)
%                 given:    
%                            c      :   channel
%                            snrdb  :   SNR in dB
%                            Nf     :   FSE length
%                            Nd     :   DFE length
%                            delay  :   range of delays or
%                                       -1 for match with channel cursor
%                                       to find best design 
%                            pdelay :   processing delay
%                            bias   :   0 for unbiased design
%                                       1 for biased design
%                            spacing:   1 for BSE
%                                       1/2 for FSE

function [h,f,d,delta,mmse] = mmse_dfe(c,snrdb,Nf,Nd,delay,pdelay,bias,spacing)


% Get SNR from SNR in dB
% and NSR=lambda
if (snrdb=='Inf')
   snr=Inf;
   lambda=0;
else
   snr=10^(snrdb/10);
   lambda=1/snr;
end;

% Set up convolution matrix
if (size(c,1)<size(c,2))
   c=c';
end;
CC=convmtx(c,Nf);

% Baud-spaced
if (spacing==1)
   C=CC;
% Fractionally-spaced
elseif (spacing==1/2)
   C=CC(2:2:size(CC,1),:);
end;

Nh=size(C,1);
I=eye(size(C,2));
[cmax,cursor]=max(c);

if (delay==-1);
   DELAY=cursor;
else
   DELAY=delay;
end;

% Check if first delay is too large
mmse=inf;
if (DELAY(1)>Nh)
   %warning('Delay not achievable!'); 
   h_mmse=[];
   f_mmse=[];
   d_mmse=[];
   delta_mmse=[];
else
   for delta=DELAY(1):min(Nh,DELAY(length(DELAY))),

      % Channel-FSE combination h=Cf and
      % single spike response td
      hd=zeros(Nh,1);
      hd(delta)=1;

      % Find MMSE-FSE+DFE
      DELTA=min(delta+pdelay-1,Nh);
      Ndmax=min(Nh-DELTA,Nd);
      W=diag([ones(DELTA,1); 
              zeros(Ndmax,1); 
              ones(Nh-DELTA-Ndmax,1)]);
      if (snrdb==Inf)
         f=pinv(W*C)*hd;
      else
         f=(C'*W*C+lambda*I)\(C'*hd);
      end;

      % If needed unbias MMSE-FSE+DFE to get UMMSE-FSE+DFE
      if (bias==0)
         h=C*f;
         f=f/(h(delta)+eps);
      end;

      h=C*f;
      d=[zeros(DELTA,1); h(DELTA+(1:Ndmax)); zeros(Nh-DELTA-Ndmax,1)];
      mse=norm(h-d-hd)^2+lambda*norm(f)^2;

      if (mse<mmse)
        h_mmse=h;
        f_mmse=f; 
        d_mmse=d;
        delta_mmse=delta;
        mmse=mse;
      end;
   end;
end;

h=h_mmse;
f=f_mmse;
d=d_mmse;
delta=delta_mmse;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -