Этот пример показывает вам, как реализовать packetized модем со Слоем [1] Канала передачи данных с помощью MATLAB® и Communications Toolbox™. Функции модема основанный на пакете физический уровень и основанный на ALOHA Слой Канала передачи данных. Можно или симулировать систему или запуститься с радио с помощью Пакета Поддержки Communications Toolbox в Радио USRP®.
Чтобы симулировать производительность системы, вам нужно следующее программное обеспечение:
Чтобы измерить производительность системы с радио, вам также нужно следующее оборудование:
Радио USRP® (B2xx, N2xx или X3xx)
и следующее программное обеспечение
Для полного списка Communications Toolbox поддерживаемые платформы SDR обратитесь к разделу Supported Hardware страницы открытия Программно определяемого радио (SDR).
Беспроводные модемы Packetized являются системами связи, которые передают информацию в названных пакетах пакетов через беспроводной канал. Каждый модем, также названный узлом, показывает физический уровень, где пакеты модулируются, передаются и получаются на разделяемом диапазоне частот и демодулируются. Поскольку тот же диапазон частот используется всеми узлами, алгоритм среднего управления доступом (MAC) требуется, чтобы уменьшать пакетную потерю из-за столкновений (т.е. одновременные передачи). Слой Канала передачи данных включает подуровня MAC и подуровня управления логической ссылкой, чтобы совместно использовать тот же канал и обеспечивает безошибочную ссылку между двумя узлами. Слой Канала передачи данных также называется Слоем 2 и находится между Слоем сети (Слой 3) и Физическим уровнем (Слой 1).
Чтобы запустить пример, введите PacketizedModemNetworkExample в Окне Команды MATLAB или щелкните по ссылке. Пример кода создает три packetized модемных объекта узла и соединяет их через объект канала. Каждый узел может отправить пакеты в другие два узла. ACKTimeout определяет длительность тайм-аута, прежде чем узел решит, что пакетная передача ДАННЫХ не была успешна. ACKTimeout должен быть больше длительности цикла обработки для обмена DATA-ACK, который составляет 0,21 секунды для этого примера. Симуляция основана на времени и симулирует полную обработку физического уровня вместе со слоем канала передачи данных.
% Set simulation parameters 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; % Fix random number generation seed for repeatable simulations rng(12345) % Create packetized modem nodes 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); % Setup channel 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); % Main loop 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 ----------------------------------------------------------- | 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 мс долго.
% Display statistics 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. Следующая блок-схема показывает, как протокол ALOHA передает и получает пакеты данных.
Когда Слой Канала передачи данных имеет пакет Слоя 3, чтобы передать, он запускает новый сеанс и отправляет пакет сразу же с помощью пакета ДАННЫХ. Алгоритм ожидает подтверждения (ACK) пакет. Если ACK не получен перед периодом тайм-аута он замедляет случайное количество времени и отправляет пакет ДАННЫХ снова. Если этому не удается получить ACK после многих повторений, это пропускает пакет. Если во время этого сеанса, новый пакет Слоя 3 получен, пакет Слоя 3 помещается в очередь метода "первым пришел - первым вышел" (FIFO). Если очередь FIFO полна, пакет пропущен.
Алгоритм реализован в helperPacketizedModemDataLinkLayer Системе object™. helperPacketizedModemDataLinkLayer Системный объект задает конечный автомат с тремя состояниями: НЕАКТИВНЫЙ, ACK_WAIT и BACKOFF. Следующий конечный автомат описывает, как алгоритм слоя канала передачи данных реализован в этом объекте. Операторы в скобках, [...], и фигурные скобки, {...}, условия и действия, соответственно. Маленькие круги являются состояниями передачи, используемыми, чтобы представлять несколько условий.
Исходный протокол ALOHA использует топологию концентратора/звезды. Восходящий канал и нисходящий канал используют два отдельных диапазона частот. Следующий пример использует топологию сети mesh, куда узлы передают и получают использование того же диапазона частот.
Следующие подарки модемная структура кода. Обработка имеет шесть основных частей и запуски в следующем порядке:
Исходный контроллер
Передайте генератор
Декодер PHY
Слой канала передачи данных
Передайте синтаксический анализатор
Энкодер PHY
Выходные параметры процессов Слоя Канала передачи данных Генератора сообщения и Декодера PHY, таким образом, это должно выполняться после тех двух операций. Синтаксический анализатор сообщения и процесс Энкодера PHY выходные параметры Слоя Канала передачи данных. Эта последовательность гарантирует, что модем может получить пакеты и ответить на них в том же временном интервале. Объект helperPacketizedModemNode реализует модем.
Исходный контроллер
Исходный Контроллер генерирует разрешать сигнал, и случайный адрес назначения на основе пользователя выбрал пакетное распределение прибытия.
Передайте генератор
Генератор сообщения начинает создавать пакеты данных о слое 3, когда включил исходный контроллер. Пакеты содержат оцифрованное текстовое сообщение. Если сообщение не помещается в один пакет, генератор создает несколько пакетов. Пакетная структура следующие:
Обратиться: 8 битов
От Адреса: 8 битов
Пакетный Номер: 16 битов
Полезная нагрузка: M биты
Декодер PHY
Декодер PHY получает основополосные выборки I/Q и создает пакеты слоя 2. Декодер PHY может откорректировать для амплитудных изменений с помощью AGC, смещений частоты со средством оценки смещения частоты и компенсатором, и синхронизировав скосы и многопутевое использование незначительно расположенного с интервалами эквалайзера обратной связи решения (DFE). Блок-схема физического уровня (Слой 1) получатель следующие:
Когда размер полезной нагрузки данных установлен в 19 530 битов, общая пакетная длина модема является 39 956 выборками. Модемные процессы SamplesPerFrame
выборки, который является 2 000 выборок для этого примера в каждой итерации. Меньший SamplesPerFrame
результаты в меньшей задержке, но увеличениях издержки модемного алгоритма. Увеличенные издержки могут увеличить время вычислений, таким образом, что модем не запускается в режиме реального времени больше.
Слой канала передачи данных
Слой Канала передачи данных обеспечивает ссылку между двумя соседними узлами. Это использует основанный на ALOHA протокол, описанный в Data Link Layer (Layer 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) передатчик следующие:
Этот пример симулирует три сети узла, но любое количество узлов может быть симулировано. Выходные параметры каждого узла передаются средству моделирования канала. Канал добавляет сгенерированные модулированные сигналы из всех трех узлов после наложения следующих нарушений канала:
Синхронизация скоса
Частота возмещена
Многопутевой Rician
AWGN
В дополнение к этим нарушениям сигналы от соседних узлов применяются потеря пути 20 дБ, в то время как самоинтерференция добавляется непосредственно.
Можно также запустить это использование в качестве примера радио вместо симулированного канала. Комбинация оборудования SDR и хоста - компьютера, который запускает сеанс работы с MATLAB, включает узел. Следующие шаги показывают вам, как установить сеть с тремя узлами. Этот пример использует USRP® B200 и радио B210.
1) Соедините радио USRP® с хостом - компьютером A, который мы вызовем Узел 1. Следуйте инструкциям в Установке и Setup (Пакет Поддержки Communications Toolbox для Радио USRP), чтобы установить и установить ваш хост - компьютер для использования с радио USRP®. Запустите сеанс работы с MATLAB.
2) Настройте Узел 1 как передатчик для инициализации. Запустите helperPacketizedModemInitializeRadio ('tx', PLATFORM, АДРЕС, FC, RT), где PLATFORM является типом радио USRP®, и АДРЕС является порядковым номером или IP-адресом, FC является центральной частотой, и RT является временем выполнения в секундах. Этот пример использует центральную частоту на 915 МГц. Предположение, что ваше радио является B200 с порядковым номером 'ABCDE', вызов функции будет helperPacketizedModemInitializeRadio ('tx', 'B200', 'ABCDE', 915e6, 120). Эта функция запустит передатчик в течение 120 секунд. Если вам требуется больше времени, чтобы закончить инициализацию, повторно выполнить команду со временем долгосрочной перспективы.
3) Повторите шаг 1 для второго радио и хоста - компьютера и вызовите этот Узел узла 2.
4) Настройте Узел 2 как получатель для инициализации. Запустите [CDT, MAXGAIN, RXGAIN] = helperPacketizedModemInitializeRadio ('rx', PLATFORM, АДРЕС, 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 (P, RA, НА, 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.m оба использует helperPacketizedModemNode.m Системный объект, чтобы реализовать модемный узел. В текущем примере тот же код используется, чтобы оценить систему, сначала с помощью симулированного канала, затем с помощью оборудования SDR и беспроводных каналов.
Даже при том, что код с помощью симулированных каналов основан на времени, модемный объект узла мог использоваться, чтобы запустить основанную на событии симуляцию. Этот пример не обеспечивает основанное на событии ядро симуляции.
Можно варьироваться следующие параметры, чтобы исследовать их эффект на производительности слоя канала передачи данных:
PacketArrivalRate
ACKTimeOut
MaxBackoffTime
MaxDataRetries
QueueSize
Можно также исследовать следующие функции для деталей реализации алгоритмов:
Можно исследовать физический уровень только производительность с помощью скрипта PacketizedModemPhysicalLayerTxRxExample.
Universal Software Radio Peripheral® и USRP® являются товарными знаками Корпорации National Instruments®.