Linear FIR equalizer

design of TSE optimum non-recursive linear equalizer (FIR) for second order IIR system using white noise ** lab12_2.m * mw * 04/27/2007

Contents

Input dialog

prompt = {'Order of equalizer p','Delay m','Block size K > p'};
dlg_title = 'lab12_2'; num_lines = 1; def = {'20','0','1024'};
answer = inputdlg(prompt,dlg_title,num_lines,def);
if isempty(answer)
    Ne = 20; M = 0; K = 1024;   % default
else
    Ne = str2num(answer{1});   % equalizer order
    M  = str2num(answer{2});   % delay
    K  = str2num(answer{3});   % simulated length of impulse response
end

Test signal and filtering

b = .5775*[1 0 .81]; a = [1 -.71 .25]; % numerator and denominator coefficients
% b = .24192*[1 2 1];     % numerator coefficients
x = randn(1,K);           % white noise
u = filter(b,a,x);        % simulated impulse response

Empirical acf and ccf

rr = zeros(Ne,Ne);        % time autocorrelation matrix
for m=0:Ne-1
    rr(1+m,1+m) = lab12_rxx(m,m,u);
    for n=m+1:Ne-1
        rr(1+m,1+n) = lab12_rxx(m,n,u);
        rr(1+n,1+m) = rr(1+m,1+n);
    end
end
d = [zeros(1,M) x(1:K-M)];   % delayed and truncated test signal
r = zeros(Ne,1);             % time crosscorrelation function
for n=0:Ne-1
    r(1+n) = lab12_rxy(n,d,u);
end
be = rr\r;                   % equalizer coefficients rr^-1 * r
TSEopt = lab12_rxx(0,0,d) - be'*r;  % mean power of prediction error
TSEopt = TSEopt / K;
fprintf('lab12_2 Equalizer coefficients for order p = %g\n',Ne)
for k=1:Ne
fprintf([' b(',num2str(k-1),') = %g \n'],be(k))
end
fprintf('Minimum TSE for K = %g and m = %g\n',K,M)
fprintf(' TSEopt = %g \n',TSEopt)
lab12_2 Equalizer coefficients for order p = 30
 b(0) = 1.72814 
 b(1) = -1.22624 
 b(2) = -0.96451 
 b(3) = 0.989656 
 b(4) = 0.779568 
 b(5) = -0.798088 
 b(6) = -0.630619 
 b(7) = 0.643754 
 b(8) = 0.509253 
 b(9) = -0.51879 
 b(10) = -0.409291 
 b(11) = 0.416923 
 b(12) = 0.327805 
 b(13) = -0.333938 
 b(14) = -0.261951 
 b(15) = 0.266027 
 b(16) = 0.209148 
 b(17) = -0.212909 
 b(18) = -0.163319 
 b(19) = 0.167847 
 b(20) = 0.125547 
 b(21) = -0.129418 
 b(22) = -0.0956044 
 b(23) = 0.0978872 
 b(24) = 0.0694869 
 b(25) = -0.0719495 
 b(26) = -0.0458299 
 b(27) = 0.0498634 
 b(28) = 0.0224975 
 b(29) = -0.0287289 
Minimum TSE for K = 1024 and m = 0
 TSEopt = 0.000482979 

Equalizer and simulated TSE

v = conv(be,u); v = v(1:K);
TSE = sum((d-v(1:length(d))).^2)/K; % TSE
fprintf(' TSEsim = %g\n',TSE)
 TSEsim = 0.000482979

Spectra - short-time estimates

Nfft = 1024; % DFT length
if K > Nfft
    x = x(1:Nfft); u = u(1:Nfft); v = v(1:Nfft);
else
    x = [x zeros(1,Nfft-length(x))];
    u = [u zeros(1,Nfft-length(u))];
    v = [v zeros(1,Nfft-length(v))];
end
w = hamming(Nfft)'; w = w/(sum(w.^2)/Nfft);
X = fft(x.*w); U = fft(u.*w); V = fft(v.*w);
Sxx = (1/Nfft)*abs(X(1:Nfft/2)).^2; % short-time estimate of pds
Suu = (1/Nfft)*abs(U(1:Nfft/2)).^2;
Svv = (1/Nfft)*abs(V(1:Nfft/2)).^2;
B = fft(be,Nfft); B = abs(B(1:Nfft/2));
w = 0:Nfft/2-1; w = w/(Nfft/2); % normalized radian frequency scale

Graphics

FIG = figure('Name',['lab12_2 : FIR equalizer of order p = ',num2str(Ne)],...
    'NumberTitle','off');
subplot(4,2,1), stem(0:50,x(1:51),'filled'),grid
xlabel('n \rightarrow'), ylabel('x[n] \rightarrow')
title('Channel input signal')
subplot(4,2,2), plot(w,10*log10(Sxx)),grid
xlabel('\Omega / \pi \rightarrow'), ylabel('S_{xx}(\Omega) in dB \rightarrow')
title('short-time estimate of PDS (channel input)')
subplot(4,2,3), stem(0:50,u(1:51),'filled'),grid
xlabel('n \rightarrow'), ylabel('u[n] \rightarrow')
title('Channel output signal')
subplot(4,2,4), plot(w,10*log10(Suu)),grid
xlabel('\Omega / \pi \rightarrow'), ylabel('S_{uu}(\Omega) in dB \rightarrow')
title('short-time estimate of PDS (channel output)')
L = 1 + 10*ceil(Ne/10);
subplot(4,2,5), stem(0:L-1,[be; zeros(L-Ne,1)],'filled'),grid
xlabel('n \rightarrow'), ylabel('b[n] \rightarrow')
title('Impulse response (equalizer)')
subplot(4,2,6), plot(w,20*log10(B)),grid
xlabel('\Omega / \pi \rightarrow'), ylabel('|B(e^{j\Omega})| in dB \rightarrow')
title('Frequency response (equalizer)')
subplot(4,2,7), stem(0:50,v(1:51),'filled'),grid
xlabel('n \rightarrow'), ylabel('v[n] \rightarrow')
title('Equalizer output signal')
subplot(4,2,8), plot(w,10*log10(Svv)),grid
xlabel('\Omega / \pi \rightarrow'), ylabel('S_{vv}(\Omega) in dB \rightarrow')
title('short-time estimate of PDS (equalizer output)')