In this MATLAB code it is described how to calculate 'BER vs SNR' and 'SER vs SNR' from the Channel Impulse Response (CIR).
SER = Symbol error rate
For a typical communication system, if we transmit the signal x[n], then received signal will be,
y[n] = h[n]*x[n] + noise
Where, h[n] is channel impulse response and '*' indicates convolution operation
MATLAB Code
clear all;
close all;
% Channel Impulse Response (CIR)
channel_response = [0.85]; % Example channel impulse response coefficients
%channel_response = [0.8, 0.1];
% Modulation parameters
modulation_order = 4; % QPSK modulation
num_symbols = 1000; % Number of symbols to transmit
num_bits = 1000*log2(modulation_order);
% Signal generation
tx_symbols = randi([0, modulation_order-1], 1, num_symbols);
tx_signal = qammod(tx_symbols, modulation_order);
% Channel simulation
rx_signal = conv(tx_signal, channel_response);
% Add AWGN (Additive White Gaussian Noise)
snr_dB = 0:2:20;
ber = zeros(size(snr_dB));
for i = 1:length(snr_dB)
noise_power = 10^(-snr_dB(i)/10);
rx_noisy_signal = rx_signal + sqrt(noise_power) * randn(size(rx_signal));
% Receiver processing
rx_symbols = qamdemod(rx_noisy_signal, modulation_order);
% BER calculation
a = reshape(de2bi(rx_symbols(1:num_symbols)),[1,num_bits]);
b = reshape(de2bi(tx_symbols),[1,num_bits]);
ber(i) = sum(a ~= b) / num_bits;
ser(i) = sum(rx_symbols(1:1000) ~= tx_symbols) / num_symbols;
end
% Plot BER vs. SNR curve
figure(1);
semilogy(snr_dB, ber, 'o-');
xlabel('SNR (dB)');
ylabel('Bit Error Rate (BER)');
title('BER vs. SNR');
grid on;
% Plot BER vs. SNR curve
figure(2);
semilogy(snr_dB, ser, 'o-');
xlabel('SNR (dB)');
ylabel('Symbol Error Rate (BER)');
title('SER vs. SNR');
grid on;