📄 mmse_dfe.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 + -