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)')