Skip to main content

Theoretical vs. simulated BER vs. SNR for ASK, FSK, and PSK (MATLAB Code + Simulator)



Overview

BER vs. SNR denotes how many bits in error are received for a given signal-to-noise ratio, typically measured in dB. Common noise types in wireless systems:

AWGN adds random noise; Rayleigh fading attenuates the signal variably. A good SNR helps reduce these effects.

Bit Error Rate (BER) Equations

BER formulas for ASK, FSK, and PSK modulation schemes.

ASK

BER = 0.5 × erfc(0.5 × √SNR)

FSK

BER = 0.5 × erfc(√(SNR / 2))

PSK

BER = 0.5 × erfc(√SNR)

erfc / Q-function (Click here)

Live BER Simulator (Theoretical)

Calculate Bit Error Rate for Binary ASK, FSK, and PSK Modulations instantly.

Binary ASK Modulation
BER: 7.864e-2
Binary FSK Modulation
BER: 7.864e-2
Binary PSK Modulation
BER: 7.864e-2

BER vs. SNR Performance Curves (using MATLAB)

BER vs SNR

Figure 1: Theoretical BER curves

BER vs SNR

Figure 2: Simulated BER curves

MATLAB Code: Theoretical BER

MATLAB Script
% The code is written by SalimWireless.Com clc; clear; close all; % SNR values in dB for ASK, BFSK, and BPSK SNRdB_ask = 0:1:20; SNRdB_bfsk = 0:1:20; SNRdB_bpsk = 0:1:20; % Convert SNR from dB to linear scale SNR_ask = 10.^(SNRdB_ask/10); SNR_bfsk = 10.^(SNRdB_bfsk/10); SNR_bpsk = 10.^(SNRdB_bpsk/10); % Theoretical BER for ASK BER_th_ask = (1/2) * erfc(0.5 * sqrt(SNR_ask)); % Theoretical BER for BFSK BER_th_bfsk = (1/2) * erfc(sqrt(SNR_bfsk / 2)); % Theoretical BER for BPSK BER_th_bpsk = 0.5 * erfc(sqrt(SNR_bpsk)); % Plotting figure; hold on; semilogy(SNRdB_ask, BER_th_ask, '-rh', 'LineWidth', 2.5); semilogy(SNRdB_bfsk, BER_th_bfsk, '-kh', 'LineWidth', 2.5); semilogy(SNRdB_bpsk, BER_th_bpsk, '-bh', 'LineWidth', 2.5); xlabel('SNR (dB)'); ylabel('Bit Error Rate (BER)'); title('Theoretical BER vs. SNR for Binary ASK, FSK, and PSK'); grid on; legend('BASK Theoretical', 'BFSK Theoretical', 'BPSK Theoretical'); set(gca, 'YScale', 'log'); yticks([1e-6 1e-5 1e-4 1e-3 1e-2 1e-1 1]); ylim([1e-6 1]); xlim([0 20]); hold off; web('https://www.salimwireless.com/search?q=ask%20fsk%20psk', '-browser');

MATLAB Code: Simulated BER (with AWGN)

MATLAB Simulation
% Simulation Parameters clc; clear; close all; numBits = 1e6; SNRdB = 0:1:20; SNR = 10.^(SNRdB/10); BER_sim_ask = zeros(1, length(SNRdB)); BER_sim_fsk = zeros(1, length(SNRdB)); BER_sim_psk = zeros(1, length(SNRdB)); for i = 1:length(SNRdB) % ASK bits = randi([0 1], 1, numBits); txASK = bits; noise = sqrt(1/(2*SNR(i))) * randn(1, numBits); rxASK = txASK + noise; bits_rxASK = rxASK > 0.5; BER_sim_ask(i) = sum(bits ~= bits_rxASK) / numBits; % FSK txFSK = (bits == 1) + 1j*(bits == 0); noise = sqrt(1/(2*SNR(i))) * (randn(1, numBits) + 1j*randn(1, numBits)); rxFSK = txFSK + noise; dist1 = abs(rxFSK - (1 + 1j*0)); dist0 = abs(rxFSK - (0 + 1j*1)); bits_rxFSK = dist1 < dist0; BER_sim_fsk(i) = sum(bits ~= bits_rxFSK) / numBits; % PSK txPSK = 2*bits - 1; noise = sqrt(1/(2*SNR(i))) * randn(1, numBits); rxPSK = txPSK + noise; bits_rxPSK = rxPSK > 0; BER_sim_psk(i) = sum(bits ~= bits_rxPSK) / numBits; end figure; semilogy(SNRdB, BER_sim_ask, '-r', 'LineWidth', 2); hold on; semilogy(SNRdB, BER_sim_fsk, '-g', 'LineWidth', 2); semilogy(SNRdB, BER_sim_psk, '-b', 'LineWidth', 2); grid on; xlabel('SNR (dB)'); ylabel('Bit Error Rate (BER)'); title('Simulated BER vs. SNR'); legend('BASK', 'BFSK', 'BPSK'); axis([0 20 1e-5 1]); web('https://www.salimwireless.com/search?q=ask%20fsk%20psk', '-browser');

BER vs SNR Simulation (Theoretical vs Simulated with AWGN)






Theoretical vs Simulated BER vs SNR for Binary ASK (with AWGN)

Higher bits = More accuracy but slower.

Example: -10:2:20 or 5

Observation Table

SNR (dB) Simulated BER

Contact Us

Name

Email *

Message *