Zero Forcing Equalizer in ISI channel 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)&gt;0.5; % generating 0,1 with equal probability
    s = 2*ip-1; % BPSK modulation 0 -&gt; -1; 1 -&gt; 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)&gt;0;
    
    %     % counting the errors
    nErr(1,ii) = size(find([ip-ipHat]),2);
end

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.