Analysis of theoretical BER characteristics for different c AWGN modulation methods¶
In modern communication systems, the choice of modulation method plays a key role in ensuring the reliability and efficiency of data transmission. One of the main metrics that characterise the quality of communication is the Bit Error Rate (BER), which depends on the signal-to-noise ratio (Eb/No). This demonstration presents a theoretical analysis of BER for various modulation techniques including M-PSK (BPSK, QPSK, 8-PSK), M-QAM (16-QAM, 64-QAM) and M-FSK (2-FSK, 4-FSK) under channel conditions with additive white Gaussian noise.
Exact and approximated formulas that take into account the peculiarities of each modulation method are used to calculate the BER. The results are visualised in the form of a graph that allows a clear comparison of the performance of different modulation methods as a function of Eb/No variation. This analysis helps engineers and researchers to select the optimal modulation methods for specific communication conditions, taking into account the trade-off between data rate and noise immunity.
The function berawgn_psk
calculates the theoretical bit error rate (BER) for M-PSK modulations in an AWGN channel using the exact formula for BPSK (M=2) - 0.5 * erfc(sqrt(EbNo))
, where erfc
is an additional error function, and for M>2 applies an approximation erfc(sqrt(k * EbNo) * sin(π/M)) / k
, which takes into account the number of bits per symbol (k = log2(M)
) and the constellation geometry (via sin(π/M)
). Both formulas depend on the linear signal-to-noise ratio EbNo = 10^(EbNo_dB/10)
, converted from decibels.
Out[0]:
berawgn_psk (generic function with 1 method)
The function berawgn_qam
calculates the theoretical bit error rate (BER) for quadrature amplitude modulations (M-QAM such as 16-QAM, 64-QAM) in an AWGN-noise channel. It uses the exact formula for quadrature constellations, where:
EbNo = 10^(EbNo_dB/10)
is the linear signal-to-noise ratio,
k = log2(M)
is the number of bits per symbol,
erfc
is the additive error function,
- the multipliers
4/k
and (1 - 1/sqrt(M))
take into account the geometry of the constellation and the error probability for different bit combinations. The formula is effective for quadratic QAM.
Out[0]:
berawgn_qam (generic function with 1 method)
The function berawgn_fsk
calculates the theoretical bit error rate (BER) for M-FSK (frequency manipulation) modulations in an AWGN-noise channel, supporting two detection modes. For coherent reception (with accurate phase information), the formula is used where:
EbNo = 10^(EbNo_dB/10)
is the linear signal-to-noise ratio,
k = log2(M)
is the number of bits per character,
erfc
- additional error function.
The function takes into account the increase of errors with increasing M
(through the multiplier (M-1)/M
or (M-1)/2
) and the dependence on energy per bit (k*EbNo
). The mode is set by the parameter coherent=true/false
. Suitable for analysing 2-FSK, 4-FSK and other orthogonal circuits.
Out[0]:
berawgn_fsk (generic function with 1 method)
Now let's move on to the comparative analysis of modulations with identical signal-to-noise ratio.
The analysis performed on the theoretical BER characteristics for different modulation methods shows their varied behaviour depending on the signal-to-noise ratio (Eb/No). As can be seen from the graph, the BPSK and QPSK modulation methods show better noise immunity at low Eb/No values, making them ideal for weak signal conditions. However, as Eb/No increases, higher-level modulation techniques such as 16-QAM and 64-QAM provide higher spectral efficiency, although they require a higher signal-to-noise ratio to achieve comparable BER values.
M-FSK modulation methods, especially 2-FSK and 4-FSK, show intermediate performance, making them applicable in specific scenarios where ease of implementation and robustness to frequency variations are important. The results highlight the importance of selecting a modulation method depending on the specific requirements of the communication system, such as acceptable error probability, available bandwidth and energy constraints.
Thus, our analysis provides valuable information for the design and optimisation of communication systems, allowing the selection of optimal modulation methods for different operating conditions.
{"id": "8cf7ca5e-f33d-4aa4-a471-5f4fd786846d", "data": [{"showlegend": true, "mode": "lines+markers", "xaxis": "x", "colorbar": {"y": 0.5086805555555556, "title": {"text": ""}, "len": 0.8657316272965879, "x": 0.9934383202099737}, "name": "BPSK", "yaxis": "y", "legendgroup": "BPSK", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "line": {"color": "rgba(0, 154, 250, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.4007189272925956, 0.3889055441688301, 0.37577243728786613, 0.36120700311607173, 0.3451015211341458, 0.3273604230092885, 0.30791047071507943, 0.2867145275814431, 0.26378950525626593, 0.23922871076767188, 0.21322801835762034, 0.186113817483389, 0.1583683188095979, 0.13064448852282923, 0.1037590959534063, 0.07864960352514257, 0.056281951976541456, 0.03750612835892598, 0.022878407561085324, 0.012500818040737556, 0.00595386714777866, 0.0023882907809328075, 0.0007726748153784444, 0.00019090777407599314, 3.362722841961749e-05, 3.872108215522037e-06, 2.6130679535751977e-07, 9.00601035062875e-09, 1.33293101753005e-10, 6.810189128780764e-13, 9.123957362628091e-16], "type": "scatter", "x": [-15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}, {"showlegend": true, "mode": "lines+markers", "xaxis": "x", "colorbar": {"y": 0.5086805555555556, "title": {"text": ""}, "len": 0.8657316272965879, "x": 0.9934383202099737}, "name": "QPSK", "yaxis": "y", "legendgroup": "QPSK", "marker": {"symbol": "square", "color": "rgba(227, 111, 71, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "line": {"color": "rgba(227, 111, 71, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.4007189272925956, 0.3889055441688301, 0.37577243728786613, 0.36120700311607173, 0.3451015211341459, 0.3273604230092885, 0.30791047071507943, 0.28671452758144317, 0.26378950525626593, 0.23922871076767188, 0.2132280183576204, 0.186113817483389, 0.15836831880959795, 0.13064448852282923, 0.10375909595340632, 0.07864960352514257, 0.0562819519765415, 0.03750612835892601, 0.02287840756108534, 0.012500818040737566, 0.00595386714777866, 0.0023882907809328075, 0.0007726748153784444, 0.00019090777407599314, 3.362722841961758e-05, 3.872108215522048e-06, 2.6130679535752067e-07, 9.006010350628784e-09, 1.33293101753005e-10, 6.810189128780764e-13, 9.123957362628184e-16], "type": "scatter", "x": [-15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}, {"showlegend": true, "mode": "lines+markers", "xaxis": "x", "colorbar": {"y": 0.5086805555555556, "title": {"text": ""}, "len": 0.8657316272965879, "x": 0.9934383202099737}, "name": "8-PSK", "yaxis": "y", "legendgroup": "8-PSK", "marker": {"symbol": "diamond", "color": "rgba(62, 164, 78, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "line": {"color": "rgba(62, 164, 78, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.28920408031643524, 0.2838785855707817, 0.27792745561134136, 0.2712841671897466, 0.26387800891387786, 0.2556350990735843, 0.24648008896600734, 0.2363388155381412, 0.2251422368375632, 0.21283205242425526, 0.1993684593014792, 0.1847404854243907, 0.16897921427553894, 0.1521738663029757, 0.1344899978700235, 0.11618785533262038, 0.09763706378539527, 0.07932141777736897, 0.06182513458966774, 0.045790942734672414, 0.03184330336407075, 0.020479923891202897, 0.011952769488034582, 0.006181051750685378, 0.002748133529652667, 0.0010113953207128907, 0.0002937292522288448, 6.337878823300314e-05, 9.417264530264064e-06, 8.756326958310433e-07, 4.516092535387282e-08], "type": "scatter", "x": [-15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}, {"showlegend": true, "mode": "lines+markers", "xaxis": "x", "colorbar": {"y": 0.5086805555555556, "title": {"text": ""}, "len": 0.8657316272965879, "x": 0.9934383202099737}, "name": "16-QAM", "yaxis": "y", "legendgroup": "16-QAM", "marker": {"symbol": "triangle-up", "color": "rgba(195, 113, 210, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "line": {"color": "rgba(195, 113, 210, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.3276098304798456, 0.32188515288218034, 0.3154856220072827, 0.3083385155476397, 0.3003660997695802, 0.2914865290460706, 0.28161541628341835, 0.270668341314537, 0.2585646398830702, 0.24523289535146084, 0.2306186226662118, 0.21469465726886178, 0.19747468298888676, 0.17903005859143523, 0.15950949445603402, 0.1391600135710116, 0.11834583884997399, 0.09755935237670887, 0.07741543426555975, 0.05861845741925089, 0.04189230318126344, 0.027871306319660706, 0.016966733896638594, 0.009247213737517426, 0.004390336087342222, 0.0017541506178927247, 0.0005647061064817435, 0.000138658688812619, 2.4233785466315867e-05, 2.763208001687778e-06, 1.8418555110944843e-07], "type": "scatter", "x": [-15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}, {"showlegend": true, "mode": "lines+markers", "xaxis": "x", "colorbar": {"y": 0.5086805555555556, "title": {"text": ""}, "len": 0.8657316272965879, "x": 0.9934383202099737}, "name": "64-QAM", "yaxis": "y", "legendgroup": "64-QAM", "marker": {"symbol": "triangle-down", "color": "rgba(172, 142, 24, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "line": {"color": "rgba(172, 142, 24, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.2695795385359728, 0.2668941488962412, 0.26388506136773954, 0.26051440790248265, 0.2567403654086945, 0.2525169427061812, 0.2477938488121117, 0.2425164937915452, 0.23662619445091193, 0.2300606851864444, 0.22275507077837273, 0.21464340387767528, 0.20566112513434232, 0.19574866531839366, 0.18485656785230106, 0.1729525285884161, 0.1600307330072046, 0.1461237406152098, 0.13131683131204988, 0.11576406413570582, 0.09970416506415956, 0.08347266672985076, 0.06750457506851805, 0.05231979827721594, 0.03848298922558383, 0.026532609826146015, 0.016883529039968943, 0.009723985039970597, 0.004945987194977894, 0.0021540037571798924, 0.000772472180420455], "type": "scatter", "x": [-15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}, {"showlegend": true, "mode": "lines+markers", "xaxis": "x", "colorbar": {"y": 0.5086805555555556, "title": {"text": ""}, "len": 0.8657316272965879, "x": 0.9934383202099737}, "name": "2-FSK", "yaxis": "y", "legendgroup": "2-FSK", "marker": {"symbol": "pentagon", "color": "rgba(0, 170, 174, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "line": {"color": "rgba(0, 170, 174, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.42942905166046325, 0.42092556304323187, 0.41142840747215204, 0.4008341322988809, 0.38903375348602526, 0.3759148170229246, 0.36136469851162906, 0.3452755944935355, 0.3275517651733183, 0.30811967906576465, 0.2869417437260485, 0.26403420763801794, 0.23948946302589857, 0.2135021855040061, 0.1863972813913738, 0.15865525393145702, 0.13092729675552447, 0.10402863708538863, 0.07889587198172442, 0.05649530174936167, 0.037678988147463385, 0.023007138877866016, 0.01258703312214462, 0.006004386400163562, 0.0024133104196338642, 0.0007827011290012744, 0.0001939854720578607, 3.430262386641538e-05, 3.9692483963428305e-06, 2.6951481173667167e-07, 9.361039990685104e-09], "type": "scatter", "x": [-15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}, {"showlegend": true, "mode": "lines+markers", "xaxis": "x", "colorbar": {"y": 0.5086805555555556, "title": {"text": ""}, "len": 0.8657316272965879, "x": 0.9934383202099737}, "name": "4-FSK", "yaxis": "y", "legendgroup": "4-FSK", "marker": {"symbol": "hexagon", "color": "rgba(237, 94, 147, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "line": {"color": "rgba(237, 94, 147, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.6010783909388935, 0.5833583162532452, 0.5636586559317992, 0.5418105046741076, 0.5176522817012188, 0.49104063451393276, 0.4618657060726191, 0.43007179137216467, 0.39568425788439887, 0.35884306615150785, 0.31984202753643054, 0.27917072622508354, 0.23755247821439684, 0.19596673278424384, 0.15563864393010945, 0.11797440528771386, 0.08442292796481218, 0.05625919253838897, 0.03431761134162799, 0.018751227061106334, 0.00893080072166799, 0.0035824361713992113, 0.0011590122230676666, 0.00028636166111398973, 5.0440842629426234e-05, 5.808162323283056e-06, 3.919601930362796e-07, 1.3509015525943126e-08, 1.9993965262950752e-10, 1.0215283693171146e-12, 1.3685936043942138e-15], "type": "scatter", "x": [-15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}], "config": {"showlegend": true, "xaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [-15, -10, -5, 0, 5, 10, 15], "range": [-15.9, 15.9], "domain": [0.07646908719743364, 0.9934383202099737], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["-15", "-10", "-5", "0", "5", "10", "15"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "Eb/No (dB)", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "paper_bgcolor": "rgba(255, 255, 255, 1.000)", "annotations": [{"yanchor": "top", "xanchor": "center", "rotation": 0, "y": 1, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 20}, "yref": "paper", "showarrow": false, "text": "Теоретические BER для различных модуляций", "xref": "paper", "x": 0.5349537037037038}], "height": 400, "margin": {"l": 0, "b": 20, "r": 0, "t": 20}, "plot_bgcolor": "rgba(255, 255, 255, 1.000)", "yaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001], "range": [-0.01803235172816592, 0.6191107426670603], "domain": [0.07581474190726165, 0.9415463692038496], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["0.0", "0.1", "0.2", "0.3", "0.4", "0.5", "0.6"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "Bit Error Rate (BER)", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "legend": {"yanchor": "auto", "xanchor": "auto", "bordercolor": "rgba(0, 0, 0, 1)", "bgcolor": "rgba(255, 255, 255, 1.000)", "borderwidth": 1, "tracegroupgap": 0, "y": 1, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "title": {"font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}, "text": ""}, "traceorder": "normal", "x": 1}, "width": 1998.234375}}