Этот пример показывает вам, как реализовать packetized модем со Слоем [1] Канала передачи данных с помощью MATLAB® и Communications Toolbox™. Функции модема основанный на пакете физический уровень и основанный на ALOHA Слой Канала передачи данных. Можно или симулировать систему или запуститься с радио с помощью Пакета поддержки Communications Toolbox для Радио USRP®.
Чтобы симулировать производительность системы, вам нужно следующее программное обеспечение:
Чтобы измерить производительность системы с радио, вам также нужно следующее оборудование:
Радио USRP® (B2xx, N2xx или X3xx)
и следующее программное обеспечение
Для полного списка Communications Toolbox поддерживаемые платформы SDR обратитесь к разделу Supported Hardware страницы открытия Программно определяемого радио (SDR).
Беспроводные модемы Packetized являются системами связи, которые передают информацию в названных пакетах пакетов через беспроводной канал. Каждый модем, также названный узлом, показывает физический уровень, где пакеты модулируются, передаются и получаются на разделяемом диапазоне частот и демодулируются. Поскольку тот же диапазон частот используется всеми узлами, алгоритм среднего управления доступом (MAC) требуется, чтобы уменьшать пакетную потерю из-за столкновений (i.e. одновременные передачи). Слой Канала передачи данных включает подуровня MAC и подуровня управления логической ссылкой, чтобы совместно использовать тот же канал и обеспечивает безошибочную ссылку между двумя узлами. Слой Канала передачи данных также называется Слоем 2 и находится между Слоем сети (Слой 3) и Физическим уровнем (Слой 1).
Пример кода создает три packetized модемных объекта узла и соединяет их через объект канала. Каждый узел может отправить пакеты в другие два узла. 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)
Создайте packetized модемные узлы при помощи объекта 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 |
packetized модемные объекты узла собирают статистические данные по эффективности алгоритма слоя канала передачи данных. Вызовите 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
Этот пример реализует Слой Канала передачи данных на основе протокола [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 инициализирует связанный радио USRP®. Запустите helperPacketizedModemInitializeRadio('tx', PLATFORM, ADDRESS, 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, 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 для всех других пар радио, i.e. Узел 1 и Узел 3, Узел 3 и Узел 2. Получите CDT, MAXGAIN и значения RXGAIN для каждого узла. Если вы получаете различные значения для того же узла при инициализации для различных ссылок, выбираете максимальные значения для MAXGAIN и RXGAIN и минимума CDT.
7) Запустите Узел 1 путем выполнения helperPacketizedModemRadio функции помощника. Используйте команду 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®.