📄 iirmmse.m
字号:
function [W,G,Wa,Wb,g] = iirmmse(c,SNR,Nw,spacing)
% Get channel & format it
c=c(:).';
c=c/norm(c);
if (rem(length(c),2)==1)
c=[c 0];
end;
if (spacing==1/2)
% Divide into even and odd subchannels
ca=c(1:2:length(c));
cb=c(2:2:length(c));
Nc=length(ca);
% Correct forward equalizer length
% if necessary
if (rem(Nw,2)==1)
Nw=Nw+1;
end;
% Compute noise variance
sigma2=10^(-SNR(length(SNR))/10);
% Compute autocorrelation function
Q=xcorr(ca)+xcorr(cb);
Q(Nc)=Q(Nc)+sigma2;
% Perform spectral factorization
% to get feedback filter (matches channel length)
z=roots(Q);
I=find(abs(z)<1);
g=poly(z(I));
G=g(2:length(g));
% Form truncated all-pass forward FIRs
if (Nw/2<Nc)
Wa=filter(1,g,ca(1:Nw/2));
Wb=filter(1,g,cb(1:Nw/2));
else
Wa=filter(1,g,[ca zeros(1,Nw/2-Nc)]);
Wb=filter(1,g,[cb zeros(1,Nw/2-Nc)]);
end;
Wa=fliplr(conj(Wa));
Wb=fliplr(conj(Wb));
GG=xcorr(g);
gamma=abs(GG(Nc));
Wa=gamma*Wa;
Wb=gamma*Wb;
% Place forward filters in T/2-spaced filter
W=zeros(1,Nw);
W(1:2:Nw)=Wb;
W(2:2:Nw)=Wa;
% Compute channel-forward filter combo
v=conv(ca,Wa)+conv(cb,Wb);
% Compute complete response
h=filter(1,g,v);
else
% Get channel length
Nc=length(c);
% Compute noise variance
sigma2=10^(-SNR(length(SNR))/10);
% Compute autocorrelation function
Q=xcorr(c);
Q(Nc)=Q(Nc)+sigma2;
% Perform spectral factorization
% to get feedback filter (matches channel length)
z=roots(Q);
I=find(abs(z)<1);
g=poly(z(I));
G=g(2:length(g));
% Form truncated all-pass forward FIR
if (Nw<Nc)
W=filter(1,g,c(1:Nw));
else
W=filter(1,g,[c zeros(1,Nw-Nc)]);
end;
W=fliplr(conj(W));
Wa=[];
Wb=[];
GG=xcorr(g);
gamma=abs(GG(Nc));
W=gamma*W;
% Compute channel-forward filter combo
v=conv(c,W);
% Compute complete response
h=filter(1,g,v);
end;
W=W(:);
Wa=Wa(:);
Wb=Wb(:);
G=G(:);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -