exponenta event banner

Пакетированный модем с уровнем канала передачи данных

В этом примере показано, как реализовать пакетированный модем с уровнем канала передачи данных [1] с использованием MATLAB ® и Communications Toolbox™. Модем имеет физический уровень на основе пакетов и уровень канала передачи данных на основе ALOHA. Можно смоделировать систему или запустить с радиоприемниками с помощью пакета поддержки Communications Toolbox для радио USRP ®.

Необходимое оборудование и программное обеспечение

Для моделирования производительности системы необходимо следующее программное обеспечение:

Для измерения производительности системы с помощью радиоблоков также необходимо следующее оборудование:

  • Радиоприемники USRP ® (B2xx, N2xx или X3xx)

и следующее программное обеспечение

Полный список платформ SDR, поддерживаемых Communications Toolbox, см. в разделе Поддерживаемые аппаратные средства на странице обнаружения Software Defined Radio (SDR).

Введение

Пакетированные беспроводные модемы - это системы связи, которые передают информацию пакетами, называемыми пакетами, через беспроводной канал. Каждый модем, также называемый узлом, имеет физический уровень, на котором пакеты модулируются, передаются и принимаются в совместно используемой полосе частот и демодулируются. Поскольку одна и та же полоса частот используется всеми узлами, требуется алгоритм управления доступом к среде (MAC) для уменьшения потерь пакетов из-за конфликтов (т.е. одновременных передач). Канальный уровень данных включает в себя подуровень MAC и подуровень управления логическим каналом для совместного использования одного и того же канала и обеспечивает безошибочный канал связи между двумя узлами. Канальный уровень также называется уровнем 2 и находится между сетевым уровнем (уровень 3) и физическим уровнем (уровень 1).

Выполнить пример

Пример кода создает три пакетированных объекта модемного узла и соединяет их через объект канала. Каждый узел может посылать пакеты на два других узла. ACKTimeout определяет длительность тайм-аута до того, как узел решит, что передача пакета DATA не была успешной. ACKTimeout должна быть больше, чем продолжительность передачи в оба конца для обмена DATA-ACK, которая для этого примера составляет 0,21 секунды. Моделирование основано на времени и моделирует обработку полного физического уровня вместе с канальным уровнем данных.

Установка параметров моделирования

runDuration = 10;         % Seconds
numPayloadBits = 19530;   % Bits
packetArrivalRate = 0.2;  % Packets per second
ackTimeOut = 0.25;        % ACK time out in seconds
maxBackoffTime = 10;      % Maximum backoff time in ackTimeOut durations
mMaxDataRetries = 5;      % Maximum DATA retries
queueSize = 10;           % Data Link Layer queue size in packets
samplesPerFrame = 2000;   % Number of samples processed every iteration
verbose = true;           % Print packet activity to command line
sampleRate = 200e3;

Исправьте начальное число генерации случайных чисел для повторяемого моделирования.

rng(12345)

Создайте пакетированные модемные узлы с помощью объекта helperPacketingModemNode.

node1 = helperPacketizedModemNode('Address',1, ...
    'DestinationList',[2, 3],'NumPayloadBits',numPayloadBits, ...
    'PacketArrivalRate',packetArrivalRate,'ACKTimeOut',ackTimeOut, ...
    'MaxBackoffTime',maxBackoffTime,'MaxDataRetries',mMaxDataRetries, ...
    'QueueSize',queueSize,'CarrierDetectorThreshold',1e-5, ...
    'AGCMaxPowerGain',65,'SamplesPerFrame',samplesPerFrame, ...
    'Verbose',verbose,'SampleRate',sampleRate);
node2 = helperPacketizedModemNode('Address',2, ...
    'DestinationList',[1 3],'NumPayloadBits',numPayloadBits, ...
    'PacketArrivalRate',packetArrivalRate,'ACKTimeOut',ackTimeOut, ...
    'MaxBackoffTime',maxBackoffTime,'MaxDataRetries',mMaxDataRetries, ...
    'QueueSize',queueSize,'CarrierDetectorThreshold',1e-5, ...
    'AGCMaxPowerGain',65,'SamplesPerFrame',samplesPerFrame, ...
    'Verbose',verbose,'SampleRate',sampleRate);
node3 = helperPacketizedModemNode('Address',3, ...
    'DestinationList',[1 2],'NumPayloadBits',numPayloadBits, ...
    'PacketArrivalRate',packetArrivalRate,'ACKTimeOut',ackTimeOut, ...
    'MaxBackoffTime',maxBackoffTime,'MaxDataRetries',mMaxDataRetries, ...
    'QueueSize',queueSize,'CarrierDetectorThreshold',1e-5, ...
    'AGCMaxPowerGain',65,'SamplesPerFrame',samplesPerFrame, ...
    'Verbose',verbose,'SampleRate',sampleRate);

Настройте канал распространения с помощью объекта helperMultiUserChannel.

channel = helperMultiUserChannel( ...
    'NumNodes',3,'EnableTimingSkew',true,'DelayType','Triangle', ...
    'TimingError',20,'EnableFrequencyOffset',true, ...
    'PhaseOffset',47,'FrequencyOffset',2000,'EnableAWGN',true, ...
    'EbNo',25,'BitsPerSymbol',2,'SamplesPerSymbol',4, ...
    'EnableRicianMultipath', true, ...
    'PathDelays',[0 node1.SamplesPerSymbol/node1.SampleRate], ...
    'AveragePathGains',[15 0],'KFactor',15,'MaximumDopplerShift',10, ...
    'SampleRate',node1.SampleRate);

Основной цикл моделирования

radioTime = 0;
nodeInfo = info(node1);
frameDuration = node1.SamplesPerFrame/node1.SampleRate;
[rcvd1,rcvd2,rcvd3] = deal(complex(zeros(node1.SamplesPerFrame,1)));
while radioTime < runDuration
    trans1 = node1(rcvd1, radioTime);
    trans2 = node2(rcvd2, radioTime);
    trans3 = node3(rcvd3, radioTime);

    % Multi-user channel
    [rcvd1,rcvd2,rcvd3] = channel(trans1,trans2,trans3);

    % Update radio time.
    radioTime = radioTime + frameDuration;
end
|   Time    |     Link    |   Action   |  Seq #  | Backoff (Node 1)
-----------------------------------------------------------
|   Time    |     Link    |   Action   |  Seq #  | Backoff (Node 2)
-----------------------------------------------------------
|   Time    |     Link    |   Action   |  Seq #  | Backoff (Node 3)
-----------------------------------------------------------
| 4.46000 s |   3 ->>   1 |       DATA | #     0 |
| 4.67000 s |   1 <<-   3 |       DATA | #     0 |
| 4.67000 s |   1 ->>   3 |        ACK | #     0 |
| 4.68000 s |   3 <<-   1 |        ACK | #     0 |
| 5.04000 s |   1 ->>   3 |       DATA | #     0 |
| 5.16000 s |   2 ->>   3 |       DATA | #     0 |
| 5.30000 s |   1 ->>   3 |   Back Off | #     0 | 1.00000 s |
| 5.42000 s |   2 ->>   3 |   Back Off | #     0 | 1.00000 s |
| 6.31000 s |   1 ->>   3 |       DATA | #     0 |
| 6.43000 s |   2 ->>   3 |       DATA | #     0 |
| 6.57000 s |   1 ->>   3 |   Back Off | #     0 | 2.25000 s |
| 6.69000 s |   2 ->>   3 |   Back Off | #     0 | 1.75000 s |
| 8.45000 s |   2 ->>   3 |       DATA | #     0 |
| 8.66000 s |   3 <<-   2 |       DATA | #     0 |
| 8.66000 s |   3 ->>   2 |        ACK | #     0 |
| 8.67000 s |   2 <<-   3 |        ACK | #     0 |
| 8.83000 s |   1 ->>   3 |       DATA | #     0 |
| 9.09000 s |   1 ->>   3 |   Back Off | #     0 | 2.25000 s |
| 9.52000 s |   3 ->>   2 |       DATA | #     1 |
| 9.73000 s |   2 <<-   3 |       DATA | #     1 |
| 9.73000 s |   2 ->>   3 |        ACK | #     1 |
| 9.74000 s |   3 <<-   2 |        ACK | #     1 |

Результаты

Объекты пакетированного модемного узла собирают статистику о производительности алгоритма канального уровня. Позвоните в info метод объекта Node для доступа к этой статистике. Здесь показаны результаты выборки для 10-секундного моделируемого времени со скоростью поступления пакета 0,2 пакета в секунду. Длина каждого пакета данных составляет 200 мс.

Отображение статистики

nodeInfo(1) = info(node1);
nodeInfo(2) = info(node2);
nodeInfo(3) = info(node3);

for p=1:length(nodeInfo)
    fprintf('\nNode %d:\n', p);
    fprintf('\tNumGeneratedPackets: %d\n', nodeInfo(p).NumGeneratedPackets)
    fprintf('\tNumReceivedPackets: %d\n', nodeInfo(p).NumReceivedPackets)
    fprintf('\tAverageRetries: %f\n', nodeInfo(p).Layer2.AverageRetries)
    fprintf('\tAverageRoundTripTime: %f\n', ...
        nodeInfo(p).Layer2.AverageRoundTripTime)
    fprintf('\tNumDroppedPackets: %d\n', ...
        nodeInfo(p).Layer2.NumDroppedPackets)
    fprintf('\tNumDroppedPackets (Max retries): %d\n', ...
        nodeInfo(p).Layer2.NumDroppedPacketsDueToRetries)
    fprintf('\tThroughput: %d\n', ...
        numPayloadBits / nodeInfo(p).Layer2.AverageRoundTripTime)
    fprintf('\tLatency: %d\n', nodeInfo(p).Layer2.AverageLatency)
end
Node 1:
	NumGeneratedPackets: 2
	NumReceivedPackets: 1
	AverageRetries: NaN
	AverageRoundTripTime: NaN
	NumDroppedPackets: 0
	NumDroppedPackets (Max retries): 0
	Throughput: NaN
	Latency: Inf

Node 2:
	NumGeneratedPackets: 1
	NumReceivedPackets: 1
	AverageRetries: 2.000000
	AverageRoundTripTime: 3.509844
	NumDroppedPackets: 0
	NumDroppedPackets (Max retries): 0
	Throughput: 5.564350e+03
	Latency: 2.104687e-01

Node 3:
	NumGeneratedPackets: 2
	NumReceivedPackets: 1
	AverageRetries: 0.000000
	AverageRoundTripTime: 0.220254
	NumDroppedPackets: 0
	NumDroppedPackets (Max retries): 0
	Throughput: 8.867039e+04
	Latency: 1.749922e+00

Уровень канала передачи данных (уровень 2)

В этом примере реализуется канальный уровень данных на основе протокола произвольного доступа ALOHA [2]. На следующей блок-схеме показано, как протокол ALOHA передает и принимает пакеты данных.

Когда уровень канала передачи данных имеет пакет уровня 3 для передачи, он начинает новый сеанс и отправляет пакет сразу с помощью пакета DATA. Алгоритм ожидает пакет подтверждения (ACK). Если ACK не был принят до периода тайм-аута, он резервирует случайное количество времени и снова посылает пакет DATA. Если он не получает ACK после нескольких попыток, он сбрасывает пакет. Если во время этого сеанса принимается новый пакет уровня 3, пакет уровня 3 помещается в очередь FIFO. Если очередь FIFO заполнена, пакет отбрасывается.

Алгоритм реализован в helperPacketingModemDataLinkLayer helper System object™. helperPacketizedModemDataLinkLayer Системный объект определяет конечный автомат с тремя состояниями: IDLE, ACK_WAIT и BACKOFF. Следующий конечный автомат описывает, как алгоритм канального уровня реализуется в этом объекте. Выражения в скобках, [...] и фигурные скобки, {...}, являются соответственно условиями и действиями. Малые круги - это сквозные состояния, используемые для представления нескольких условий.

Исходный протокол ALOHA использует топологию концентратора/звезды. Восходящая и нисходящая линии связи используют два отдельных диапазона частот. В следующем примере используется топология ячеистой сети, в которой узлы передают и принимают с использованием одной и той же полосы частот.

Структура модема

Структура кода модема выполняет следующие шесть основных компонентов обработки:

  1. Исходный контроллер

  2. Генератор сообщений

  3. PHY-декодер

  4. Уровень канала передачи данных

  5. Анализатор сообщений

  6. Кодер PHY

Канальный уровень обрабатывает выходные данные генератора сообщений и декодера PHY, поэтому он должен выполняться после этих двух операций. Модуль синтаксического анализа сообщений и PHY-кодер обеспечивают выходные данные уровня канала передачи данных. Эта последовательность гарантирует, что модем может принимать пакеты и отвечать на них в один и тот же интервал времени. Объект helperPacketionModemNode реализует модем.

Исходный контроллер

Контроллер источника генерирует разрешающий сигнал и случайный адрес назначения на основе выбранного пользователем распределения поступления пакета.

Генератор сообщений

Генератор сообщений начинает создавать пакеты данных уровня 3, когда это разрешено контроллером-источником. Пакеты содержат оцифрованное текстовое сообщение. Если сообщение не помещается в один пакет, генератор создает несколько пакетов. Структура пакета следующая:

  • Адрес: 8 бит

  • От адреса: 8 бит

  • Номер пакета: 16 бит

  • Полезная нагрузка: М битов

PHY-декодер

Декодер PHY принимает выборки I/Q основной полосы частот и создает пакеты уровня 2. PHY декодер может корректировать изменения амплитуды с использованием AGC, сдвигов частоты с помощью оценщика и компенсатора смещения частоты, а также перекосов синхронизации и многолучевого распространения с использованием дробно разнесенного эквалайзера обратной связи принятия решения (DFE). Блок-схема приемника физического уровня (уровня 1) выглядит следующим образом:

Когда размер полезной нагрузки данных установлен равным 19530 битам, общая длина пакета модема составляет 39956 выборок. Модемные процессы SamplesPerFrame выборок, что составляет 2000 выборок для этого примера, на каждой итерации. Меньшее SamplesPerFrame приводит к меньшим задержкам, но увеличивает накладные расходы модемного алгоритма. Увеличение служебных данных может увеличить время обработки, так что модем больше не будет работать в реальном времени.

Уровень канала передачи данных

Уровень канала передачи данных обеспечивает связь между двумя соседними узлами. Он использует протокол на основе ALOHA, описанный в разделе Уровень канала передачи данных (уровень 2). Структура пакета содержит следующие поля:

  • Тип: 4 бита

  • Версия: 2 бита

  • Зарезервировано: 2 бита

  • Адрес: 8 бит

  • От адреса: 8 бит

  • Порядковый номер: 8 бит

  • Метка времени: 32 бита

  • Полезная нагрузка: N (= M + 32) бит

Канальный уровень также собирает следующие статистические данные:

  • Число успешных передач пакетов, определяемое как количество успешно принятых пакетов ACK

  • Среднее число повторных попыток

  • Среднее время прохождения в оба конца в секундах

  • Количество отброшенных пакетов из-за переполнения очереди пакетов уровня 3

  • Количество отброшенных пакетов из-за повторных попыток

  • Пропускная способность определяется как скорость успешной доставки данных в битах в секунду

  • Средняя задержка в секундах, определяемая как время между генерацией пакета данных уровня 3 и его приемом в узле назначения

Анализатор сообщений

Анализатор сообщений анализирует полученную полезную нагрузку уровня 2 и создает пакет уровня 3. Анализатор сообщений собирает следующую статистику:

  • Количество принятых пакетов

  • Количество полученных дублированных пакетов

Кодер PHY

Кодер PHY создает пакеты физического уровня путем модуляции пакетов уровня 2 в выборки I/Q основной полосы частот. Структура пакета показана здесь.

Фиктивные символы используются для обучения АРУ и обнаружения несущих. Символы синхронизации представляют собой модулированную ПШ-последовательность. Заголовок имеет следующие поля:

  • Длина полезной нагрузки: 16 бит

  • CRC: 16 бит

На этом рисунке показана блок-схема передатчика физического уровня (уровня 1).

Модель канала

В этом примере моделируется сеть с тремя узлами, но может быть смоделировано любое количество узлов. Выходной сигнал каждого узла передается в симулятор канала. Канал добавляет сигналы основной полосы частот от всех трех узлов после наложения этих нарушений канала:

  • Временной перекос

  • Сдвиг частоты

  • Многолучевое сообщение Rician

  • AWGN

В дополнение к этим нарушениям сигналы от соседних узлов подаются с потерей тракта 20 дБ, в то время как самопомехи добавляются непосредственно.

Работа с радиоприемниками

Этот пример можно также выполнить с использованием радиоприемников вместо моделируемого канала. Комбинация аппаратных средств SDR и хост-компьютера, который выполняет сеанс MATLAB, содержит узел. Следующие шаги показывают, как настроить сеть с тремя узлами. В этом примере используются радиоприемники USRP ® B200 и B210.

1) Подключите радиоприемник USRP ® к хост-компьютеру A, который мы будем называть узлом 1. Следуйте инструкциям в разделе Установка и настройка (Communications Toolbox Support Package for USRP Radio), чтобы установить и настроить хост-компьютер для использования с радиоприемниками USRP ®. Запустите сеанс MATLAB.

2) Установите узел 1 в качестве передатчика для инициализации. Модуль helperPacketingModemInitialityRadio инициализирует подключенное радио USRP ®. Управляемый helperPacketizedModemInitializeRadio('tx', PLATFORM, ADDRESS, FC, RT), где PLATFORM - тип радиоблока USRP ®, ADDRESS - серийный номер или IP-адрес, FC - центральная частота, а RT - время работы в секундах. В этом примере для центральной частоты используется частота 915 МГц. При условии, что радиоблок является B200 с серийным номером «ABCDE», вызов функции будет helperPacketizedModemInitializeRadio('tx', 'B200', 'ABCDE', 915e6, 120). Эта функция будет работать с передатчиком в течение 120 секунд. Если для завершения инициализации требуется больше времени, повторите команду с более длительным временем выполнения.

3) Повторите шаг 1 для второго радиомодуля и хост-компьютера и вызовите этот узел Node 2.

4) Установите узел 2 в качестве получателя для инициализации. Управляемый [CDT, MAXGAIN, RXGAIN] = helperPacketizedModemInitializeRadio('rx', PLATFORM, ADDRESS, FC, RT). Если радиоблок является B210 с серийным номером '12345', вызов функции будет [CDT1, MAXGAIN1, RXGAIN1] = helperPacketizedModemInitializeRadio('rx', 'B210', '12345', 915e6, 120). Функция будет работать до тех пор, пока не будут определены наилучшие значения для порога детектора несущей (CDT), максимального усиления АРУ (MAXGAIN) и усиления радиоприема (RXGAIN), или до тех пор, пока не истекут RT секунды. Если алгоритм инициализации не может определить подходящие параметры, он может предложить увеличить или уменьшить мощность передатчика и повторить инициализацию.

5) Выполните тот же эксперимент с узлом 1 в качестве приемника и узлом 2 в качестве передатчика для определения наилучших параметров приемника для узла 1. В большинстве случаев канал должен быть двойным, и параметры будут очень близки.

6) Повторите шаги 1-5 для всех других пар радиостанций, т.е. узла 1 и узла 3, узла 3 и узла 2. Получение значений CDT, MAXGAIN и RXGAIN для каждого узла. При получении различных значений для одного и того же узла при инициализации для различных каналов выберите максимальные значения для MAXGAIN и RXGAIN и минимальное значение для CDT.

7) Запустите узел 1, запустив функцию helperPacketingModemRadio helper. Используйте команду helperPacketizedModemRadio(P,RA,NA,DA,FC,CDT,MAXG,RGAIN,D)где P - платформа, RA - адрес радиосвязи, NA - адрес узла, DA - список адресов назначения, FC - центральная частота, CDT - порог обнаружения несущей, MAXG - максимальный коэффициент усиления AGC, RGAIN - коэффициент усиления радиоприемника, D - длительность. Например, выполнить как helperPacketizedModemRadio('B200','ABCDE',1,[2 3],915e6,CDT1,MAXGAIN1,RXGAIN1,120).

8) Запустите узел 2, запустив helperPacketizedModemRadio('B210','12345',2,[1 3],915e6,CDT2,MAXGAIN2,RXGAIN2,120).

9) Запустите узел 3, запустив helperPacketizedModemRadio('B200','A1B2C',3,[1 2],915e6,CDT3,MAXGAIN3,RXGAIN3,120).

10) После завершения сеанса каждый узел распечатывает свою статистику.

Три сетевые установки работали в течение двух часов. Каждый узел генерировал пакеты со скоростью 0,2 пакета в секунду в соответствии с распределением Пуассона. Узлы размещали приблизительно на равном расстоянии. Одно из звеньев имело линию визирования, в то время как два других - нет. Ниже приведены результаты, собранные на всех трех узлах. Поскольку время передачи в оба конца для обмена DATA-ACK с использованием B2xx радиоблоков, подключенных по USB, может достигать 800 мс, среднее время передачи в оба конца для сети превышает 3 с. Алгоритм минимизирует потери пакетов и обеспечивает справедливый доступ к совместно используемому каналу для всех узлов.

Node 1:
 NumGeneratedPackets: 1440
 NumReceivedPackets: 1389
 AverageRetries: 0.533738
 AverageRoundTripTime: 3.725093
 NumDroppedPackets: 95
 NumDroppedPackets (Max retries): 23
 Throughput: 5.242823e+03
Node 2:
 NumGeneratedPackets: 1440
 NumReceivedPackets: 1340
 AverageRetries: 0.473157
 AverageRoundTripTime: 3.290775
 NumDroppedPackets: 31
 NumDroppedPackets (Max retries): 9
 Throughput: 5.934772e+03
Node 3:
 NumGeneratedPackets: 1440
 NumReceivedPackets: 1385
 AverageRetries: 0.516129
 AverageRoundTripTime: 3.558408
 NumDroppedPackets: 107
 NumDroppedPackets (Max retries): 29
 Throughput: 5.488410e+03

Обсуждения

Код моделирования из предыдущих разделов и функция helperPacketingModemRadio helper используют объект helperPacketingModemNode System для реализации модемного узла. В этом примере тот же код используется для оценки системы сначала с использованием моделируемого канала, затем с использованием аппаратных средств SDR и эфирных каналов.

Даже если код, использующий моделируемые каналы, основан на времени, объект модемного узла может использоваться для выполнения моделирования на основе события. В этом примере не представлено ядро моделирования на основе событий.

Дальнейшие исследования

Можно изменить эти параметры для изучения их влияния на производительность канального уровня:

  • PacketArrivalRate

  • ACKTimeOut

  • MaxBackoffTime

  • MaxDataRetries

  • QueueSize

Можно также изучить вспомогательные функции для получения подробной информации о реализации алгоритмов:

Производительность физического уровня можно проверить только с помощью сценария PacketingModemicalPhysicalLeyTxRxExample.

Избранная библиография

Уведомление об авторских правах

Universal Software Radio Peripheral ® и USRP ® являются товарными знаками компании National Instruments ® Corp.