В этом примере показано, как реализовать пакетированный модем с слоем передачи данных [1] с помощью MATLAB ® и Communications Toolbox™. Модем имеет физический слой на основе пакетов и слой ссылки передачи данных на основе ALOHA. Можно симулировать систему или запустить с радиоприемниками с помощью пакета поддержки Communications Toolbox для USRP ® Radio.
Чтобы симулировать производительность системы, вам нужно следующее программное обеспечение:
Чтобы измерить производительность системы с помощью радио, вам также нужно следующее оборудование:
Радиоприемники USRP ® (B2xx, N2xx или X3xx)
и следующее программное обеспечение
Полный список платформ SDR, поддерживаемых Communications Toolbox, см. в разделе «Поддерживаемые аппаратные средства» страницы Программно определяемого радио (SDR).
Пакетированные беспроводные модемы являются коммуникационными системами, которые передают информацию пакетами, называемыми пакетами, через беспроводной канал. Каждый модем, также называемый узлом, имеет физический слой, где пакеты модулируются, передаются и принимаются в общей полосе частот и демодулируются. Поскольку та же полоса частот используется всеми узлами, для уменьшения потерь пакета из-за столкновений (т.е. одновременных передач) требуется алгоритм управления доступом к среде (MAC). Слой ссылки данных включает подслой MAC и подслой управления логической ссылкой для совместного использования одного и того же канала и обеспечивает ссылку без ошибок между двумя узлами. Слой ссылки данных также называется слоем 2 и находится между слоем сети (слой 3) и физическим слоем (слой 1).
Пример кода создает три пакетированных объекта узла модема и соединяет их через объект канала. Каждый узел может отправлять пакеты на два других узла. ACKTimeout
определяет длительность тайм-аута, прежде чем узел решит, что передача пакета ДАННЫЕ не была успешной. 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;
Исправьте seed генерации случайных чисел для повторяемых симуляций.
rng(12345)
Создайте пакетированные узлы модема с помощью объекта helperPacketizedModemNode.
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
метод объекта узел для доступа к этой статистике. Выборки для 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
В этом примере реализуется слой ссылки данных, основанный на протоколе случайного доступа ALOHA [2]. Следующая блок-схема показывает, как протокол ALOHA передает и принимает пакеты данных.
Когда Data Link Layer имеет пакет слоя 3 для передачи, он начинает новый сеанс и немедленно отправляет пакет с помощью пакета ДАННЫЕ. Алгоритм ожидает пакета подтверждения (ACK). Если ACK не получен перед периодом тайм-аута, он отменяет случайное количество времени и снова отправляет пакет ДАННЫЕ. Если он не получает ACK после нескольких повторных попыток, он отбрасывает пакет. Если во время этого сеанса принимается новый пакет слоя 3, то пакет слоя 3 помещается в очередь «первый в первом» (FIFO). Если очередь FIFO заполнена, пакет отбрасывается.
Алгоритм реализован в object™ helperPacketizedModemDataLinkLayer helper System. The helperPacketizedModemDataLinkLayer
Системный объект задает конечный автомат с тремя состояниями: IDLE, ACK_WAIT и BACKOFF. Следующий конечный автомат описывает, как алгоритм слоя ссылки данных реализован в этом объекте. Операторы в скобках [...] и фигурные скобки {...} являются условиями и действиями, соответственно. Маленькие круги являются проходными состояниями, используемыми для представления нескольких условий.
В исходном протоколе ALOHA используется топология концентратор/звезда. Восходящая и нисходящая линии связи используют две отдельные полосы частот. В следующем примере используется топология ячеистой сети, где узлы передают и принимают, используя одну и ту же полосу частот.
Структура кода модема выполняет эти шесть основных компонентов обработки:
Исходный контроллер
Генератор сообщений
PHY-декодер
Слой ссылки передачи данных
Анализатор сообщений
PHY- Энкодера
Data Ссылки Слоя обрабатывает выходы Message Generator и PHY Decoder, поэтому он должен выполняться после этих двух операций. Анализатор сообщений и энкодер обрабатывают выходы слоя ссылки передачи данных. Эта последовательность гарантирует, что модем может принимать пакеты и отвечать на них в один и тот же временной интервал. Объект helperPacketizedModemNode реализует модем.
Исходный контроллер
Контроллер источника генерирует разрешающий сигнал и адрес случайного адресата на основе выбранного пользователем распределения прибытия пакета.
Генератор сообщений
Генератор сообщений начинает создавать пакеты данных слоя 3, когда это включено исходным контроллером. Пакеты содержат оцифрованное текстовое сообщение. Если сообщение не помещается в один пакет, генератор создает несколько пакетов. Структура пакета следующая:
В адрес: 8 бит
От адреса: 8 бит
Номер пакета: 16 бит
Полезная нагрузка: M бит
PHY-декодер
PHY-декодер получает выборки основной полосы частот и создает пакеты слоя 2. Декодер PHY может корректировать изменения амплитуды с помощью AGC, смещений частоты с оценкой смещения частоты и компенсатора, и наклонов синхронизации и многолучевого распространения с помощью фракционно разнесенного корректора обратной связи (DFE). Схема блока получателя физического слоя (Слой 1) следующая:
Когда размер полезной нагрузки данных установлен в 19530 бита, общая длина пакета модема составляет 39956 выборок. Модем обрабатывает SamplesPerFrame
выборки, которые представляют собой 2000 образцов для этого примера, при каждой итерации. Меньшее SamplesPerFrame
приводит к меньшей задержке, но увеличивает накладные расходы алгоритма модема. Увеличенные накладные расходы могут увеличить время вычислений, так что модем больше не запускается в реальном времени.
Слой ссылки передачи данных
Data Link Layer обеспечивает ссылку между двумя соседними узлами. Он использует протокол на основе ALOHA, описанный в разделе «Слой ссылки данных» (Слой 2). Структура пакета содержит следующие поля:
Тип: 4 бита
Версия: 2 бита
Зарезервировано: 2 бита
В адрес: 8 бит
От адреса: 8 бит
Порядковый номер: 8 бит
Отметка времени: 32 бита
Полезная нагрузка: N (= M + 32) бит
Ссылка слоя данных также собирает следующую статистику:
Количество успешных передач пакетов, которое определяется как количество успешно полученных пакетов ACK
Среднее значение повторных попыток
Среднее время поездки туда и обратно в секундах
Количество отброшенных пакетов из-за заполнения очереди пакетов уровня 3
Количество отброшенных пакетов из-за повторных попыток
Пропускная способность, заданная как успешная скорость доставки данных в битах в секунду
Средняя задержка в секундах определяется как время между генерацией пакета данных слоя 3 и приемом его в узле назначения
Анализатор сообщений
Анализатор сообщений анализирует принятую полезную нагрузку слоя 2 и создает пакет слоя 3. Анализатор сообщений собирает следующую статистику:
Количество полученных пакетов
Количество полученных повторяющихся пакетов
PHY- Энкодера
Энкодер PHY создает пакеты физического слоя путем модуляции пакетов слоя 2 в I/Q выборки основной полосы. Структура пакета показана здесь.
Фиктивные символы используются для обучения AGC и для обнаружения несущей. Символы синхронизации являются модулированной псевдошумовой последовательностью. Заголовок имеет следующие поля:
Длина полезной нагрузки: 16 бит
CRC: 16 бит
Это изображение показывает блок передатчика физического слоя (слоя 1).
В этом примере моделируется трехузловая сеть, но можно моделировать любые числа узлов. Выход каждого узла передается в симулятор канала. Канал добавляет сгенерированные модулированные сигналы от всех трех узлов после наложения этих нарушений канала:
Перекос времени
Смещение частоты
Райсский многолучевой канал
AWGN
В дополнение к этим нарушениям, сигналы от соседних узлов применяются с потерей пути 20 дБ, в то время как самоинтерференция добавляется непосредственно.
Можно также запустить этот пример, используя радиостанции вместо моделируемого канала. Комбинация оборудования SDR и хоста-компьютера, который запускает Сеанс работы с MATLAB, содержит узел. Следующие шаги показывают, как настроить сеть с тремя узлами. Этот пример использует радиоприемники USRP ® B200 и B210.
1) Подключите радио USRP ® к хосту-компьютеру A, который будет вызываться Узлом 1. Следуйте инструкциям установки и Setup (Communications Toolbox Support Package for USRP Radio), чтобы установить и настроить хост-компьютер для использования с радиоприемниками USRP ®. Запуск сеанса работы с MATLAB.
2) Настройте Узел 1 как передатчик для инициализации. helperPacketizedModemInitializeRadio инициализирует подключенное радио 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 для второго радио и хоста-компьютера и вызовите этот узел Узел 2.
4) Настройте узел 2 как приемник для инициализации. Выполняйте [CDT, MAXGAIN, RXGAIN] = helperPacketizedModemInitializeRadio('rx', PLATFORM, ADDRESS, FC, RT)
. Принимая, что ваш радио является B210 с серийным номером '12345', вызов функции будет [CDT1, MAXGAIN1, RXGAIN1] = helperPacketizedModemInitializeRadio('rx', 'B210', '12345', 915e6, 120)
. Функция будет запускаться до тех пор, пока она не определит лучшие значения для порога детектора несущей (CDT), максимального усиления AGC (MAXGAIN) и коэффициента усиления приема радиосвязи (RXGAIN) или до тех пор, пока не истечут секунды RT. Если алгоритм инициализации не может определить подходящие параметры, это может предложить увеличение или уменьшение степени передатчика и повторную инициализацию.
5) Запустите тот же эксперимент с Узлом 1, что и с приемником, и с Узлом 2, как с передатчиком, чтобы определить лучшие параметры приемника для Узла 1. В большинстве случаев канал должен быть двойным, и параметры будут очень близки.
6) Повторите шаги 1-5 для всех других пар радиостанций, то есть для узла 1 и узла 3, узла 3 и узла 2. Получите значения CDT, MAXGAIN и RXGAIN для каждого узла. При получении различных значений для одного и того же узла при инициализации для различных ссылок выберите максимальные значения для MAXGAIN и RXGAIN и минимум CDT.
7) Запустите узел 1, запустив функцию helperPacketizedModemRadio 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
Оба кода симуляции из предыдущих разделов и вспомогательная функция helperPacketizedModemRadio используют Системный объект helperPacketizedModemNode для реализации узла модема. В этом примере тот же код используется для оценки системы, сначала используя моделируемый канал, затем используя оборудование SDR и беспроводные каналы.
Даже при том, что код, использующий моделируемые каналы, основан на времени, объект узла модема может использоваться, чтобы запустить симуляцию на основе событий. Этот пример не предоставляет основанное на событиях ядро симуляции.
Можно варьировать эти параметры, чтобы исследовать их эффект на эффективность слоя ссылки передачи данных:
PacketArrivalRate
ACKTimeOut
MaxBackoffTime
MaxDataRetries
QueueSize
Можно также исследовать вспомогательные функции для деталей реализации алгоритмов:
Проверить эффективность физического слоя можно только с помощью скрипта PacketizedModemPhysicalLayerTxRxExample.
Universal Software Radio Peripheral ® и USRP ® являются товарными знаками National Instruments ™ ® Corp.