I'm studying on designing 9-tap zero forcing equalizer to remove ISI in the channel. I assumed that the channel response is $h[n] = [0.41, 0.815, 0.41]$ and I tried to calculate bit error rate. When I choose $h[n]=[0.21, 0.815, 0.21]$ for example, I get good results. BER goes to 1e-4 for high SNR values. But the code below gives bit error rate of 0.5 when the channel response is $[0.41, 0.815, 0.41]$. Can anybody help me about this problem? I did something wrong but I couldn't find it.

N  = 10^4; % number of bits or symbols
Eb_N0_dB = [0:2:10]; % multiple Eb/N0 values

for ii = 1:length(Eb_N0_dB)
    % Transmitter
    ip = rand(1,N)>0.5; % generating 0,1 with equal probability
    s = 2*ip-1; % BPSK modulation 0 -> -1; 1 -> 1
    % Channel model, multipath channel
    ht = [0.41 0.815 0.41]
    chanOut = conv(s,ht);
    n = 1/sqrt(2)*[randn(1,N+length(ht)-1) + j*randn(1,N+length(ht)-1)]; % white gaussian noise, 0dB variance
    % Noise addition
    y = chanOut + 10^(-Eb_N0_dB(ii)/20)*n; % additive white gaussian noise
    kk=4; % 9-tap filter
    L  = length(ht);
    hM = toeplitz([ht([2:end]) zeros(1,2*kk+1-L+1)], [ ht([2:-1:1]) zeros(1,2*kk+1-L+1) ]);
    d  = zeros(1,2*kk+1);
    d(kk+1) = 1;
    c  = [inv(hM)*d.'].';
    % matched filter
    yFilt = conv(y,c);
    yFilt = yFilt(kk+2:end);
    yFilt = conv(yFilt,ones(1,1)); % convolution
    ySamp = yFilt(1:1:N);  % sampling at time T
    % receiver - hard decision decoding
    ipHat = real(ySamp)>0;
    %     % counting the errors
    nErr(1,ii) = size(find([ip-ipHat]),2);

simBer = nErr/N; % simulated ber

Your channel has 3 taps, your EQ has 9 taps which means that your cascaded response has 11 taps. You only force the middle 9 taps of the response to be a unit impulse. If you convolve the channel with your EQ, you see that the middle is indeed a unit impulse but the first and the last sample are very non-zero.

The actual inverse your channel would be an IIR filter. To approximate this with an FIR filter, you need to have a fairly well behaved channel and spent a fair amount of FIR taps. Your channel is NOT well behaved since it got zeros on the unit circle, which means it's not invertible.

  • $\begingroup$ Sir, thank you but I can't change the channel response coefficients. Can you please tell me where should I modify my code so that I get good BER results for varying SNR values. I confirmed what you said in your answer, when I convolve channel response with equalizer response, the first and the last terms are nonzero and the middle one is 1. So, how can I modify my code? Can you please explain it step by step? Many thanks. $\endgroup$
    – Jason
    Dec 6 '19 at 17:35
  • 1
    $\begingroup$ Further if you have deep frequency selective nulls in your channel, a zero-forcing equalizer is the worst choice due to the noise enhancement from the equalizer amplifying those nulls where no signal exists. $\endgroup$ Dec 6 '19 at 20:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.