Анализ теоретических характеристик BER для различных методов модуляции c AWGN¶
В современных системах связи выбор метода модуляции играет ключевую роль в обеспечении надежности и эффективности передачи данных. Одним из основных показателей, характеризующих качество связи, является вероятность битовой ошибки (Bit Error Rate, BER), которая зависит от отношения сигнал/шум (Eb/No). В данной демонстрации представлен теоретический анализ BER для различных методов модуляции, включая M-PSK (BPSK, QPSK, 8-PSK), M-QAM (16-QAM, 64-QAM) и M-FSK (2-FSK, 4-FSK), в условиях канала с аддитивным белым гауссовым шумом.
Для расчета BER использованы точные и аппроксимированные формулы, учитывающие особенности каждого метода модуляции. Результаты визуализированы в виде графика, который позволяет наглядно сравнить эффективность различных методов модуляции в зависимости от изменения Eb/No. Такой анализ помогает инженерам и исследователям выбирать оптимальные методы модуляции для конкретных условий связи, учитывая компромисс между скоростью передачи данных и устойчивостью к шумам.
Функция berawgn_psk
вычисляет теоретическую вероятность битовой ошибки (BER) для модуляций M-PSK в канале AWGN, используя точную формулу для BPSK (M=2) — 0.5 * erfc(sqrt(EbNo))
, где erfc
— дополнительная функция ошибок, а для M>2 применяет аппроксимацию erfc(sqrt(k * EbNo) * sin(π/M)) / k
, учитывающую количество бит на символ (k = log2(M)
) и геометрию созвездия (через sin(π/M)
). Обе формулы зависят от линейного отношения сигнал/шум EbNo = 10^(EbNo_dB/10)
, преобразованного из децибел.
Out[0]:
berawgn_psk (generic function with 1 method)
Функция berawgn_qam
вычисляет теоретическую вероятность битовой ошибки (BER) для квадратурных амплитудных модуляций (M-QAM, таких как 16-QAM, 64-QAM) в канале с AWGN-шумом. Она использует точную формулу для квадратных созвездий, где:
EbNo = 10^(EbNo_dB/10)
— линейное отношение сигнал/шум,
k = log2(M)
— число бит на символ,
erfc
— дополнительная функция ошибок,
- множители
4/k
и (1 - 1/sqrt(M))
учитывают геометрию созвездия и вероятность ошибки для разных битовых комбинаций. Формула эффективна для квадратных QAM.
Out[0]:
berawgn_qam (generic function with 1 method)
Функция berawgn_fsk
рассчитывает теоретическую вероятность битовой ошибки (BER) для модуляций M-FSK (частотной манипуляции) в канале с AWGN-шумом, поддерживая два режима детектирования. Для когерентного приема (с точной информацией о фазе) используется формула, где:
EbNo = 10^(EbNo_dB/10)
— линейное отношение сигнал/шум,
k = log2(M)
— число бит на символ,
erfc
— дополнительная функция ошибок.
Функция учитывает увеличение ошибок с ростом M
(через множитель (M-1)/M
или (M-1)/2
) и зависимость от энергии на бит (k*EbNo
). Режим задается параметром coherent=true/false
. Подходит для анализа 2-FSK, 4-FSK и других ортогональных схем.
Out[0]:
berawgn_fsk (generic function with 1 method)
Теперь перейдём к сравнительному анализу модуляций при идентичном отношении сигнал/шум.
Проведенный анализ теоретических характеристик BER для различных методов модуляции демонстрирует их разнообразное поведение в зависимости от отношения сигнал/шум (Eb/No). Как видно из графика, методы модуляции BPSK и QPSK показывают лучшую устойчивость к шумам при низких значениях Eb/No, что делает их идеальными для условий слабого сигнала. Однако с увеличением Eb/No более высокоуровневые методы модуляции, такие как 16-QAM и 64-QAM, обеспечивают более высокую спектральную эффективность, хотя и требуют более высокого отношения сигнал-шум для достижения сопоставимых значений BER.
Методы модуляции M-FSK, особенно 2-FSK и 4-FSK, демонстрируют промежуточные характеристики, что делает их применимыми в специфических сценариях, где важна простота реализации и устойчивость к частотным отклонениям. Полученные результаты подчеркивают важность выбора метода модуляции в зависимости от конкретных требований системы связи, таких, как допустимая вероятность ошибки, доступная полоса пропускания и энергетические ограничения.
Таким образом, наш анализ предоставляет ценную информацию для проектирования и оптимизации систем связи, позволяя выбирать оптимальные методы модуляции для различных условий работы.
{"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}}