Сквозная симуляция IEEE 802.15.4 PHY

В этом примере показано, как сгенерировать формы волны, декодировать формы волны и вычислить кривые BER для различных спецификаций PHY стандарта IEEE ® 802.15.4™ [1], используя библиотеку Communications Toolbox™ для протокола ZigBee ®.

Фон

Стандарт IEEE 802.15.4 задает слои PHY и MAC низкоскоростных беспроводных персональных вычислительных сетей (LR-WPAN) [1]. Слои PHY и MAC IEEE 802.15.4 обеспечивают базис других стандартов более высокого уровня, таких как ZigBee, WirelessHart ®, 6LoWPAN и MiWi. Такие стандарты находят применение в домашней автоматизации и сенсорных сетях и имеют большое значение для тренда Интернета вещей (IoT).

Реализации физического слоя IEEE 802.15.4

Исходный стандарт IEEE 802.15.4 и его поправки определяют несколько слоев PHY, которые используют различные схемы модуляции и поддерживают различные скорости передачи данных. Эти физические слои были разработаны для конкретных полос частот и, в определенной степени, для конкретных стран. Этот пример предоставляет функции, которые генерируют и декодируют формы сигналов для физических слоев, предложенных в исходной спецификации IEEE 802.15.4 (OQPSK в 2,4 ГГц, BPSK в 868/915 МГц), IEEE 802.15.4b (OQPB

Эти физические слои определяют формат для модуля данных протокола PHY (PPDU), который включает в себя преамбулу, разделитель начала кадра (SFD) и длину и содержимое модуля данных протокола MAC (MPDU). Преамбула и SFD используются для синхронизации на уровне фрейма. В следующем описании термин «символ» обозначает целочисленный индекс последовательности микросхем (согласно стандарту IEEE 802.15.4), а не символ модуляции (т.е. комплексное число).

  • OQPSK PHY: Все PHY OQPSK сопоставляют каждые 4 бита PPDU с одним символом. OQPSK PHY на 2,4 ГГц расширяет каждый символ до 32-элементной последовательности, в то время как другие OQPSK PHY распространяют его на 16-элементарную последовательность. Затем последовательности микросхем модулируются OQPSK и передаются в полусинусоиду импульсный формирующий фильтр (или нормальный фильтр приподнятого косинуса, в полосу 780 МГц). Для получения подробного описания см. Пункт 10 в [1].

  • BPSK PHY: BPSK PHY дифференцированно кодирует биты PPDU. Каждый полученный бит распределяется в 15-элементарную последовательность. Затем чиповые последовательности модулируют BPSK и передают в нормальный фильтр приподнятого косинуса. Подробное описание см. в пункте 11 в [1].

  • СПРОСИТЕ PHY: СПРОСИТЬ PHY использует модуляцию BPSK для преамбулы и SFD только. Оставшиеся биты PPDU, т.е. заголовок PHY (PHR) и MPDU, сначала преобразуются в 20-битовые символы в полосе 868 МГц и в 5-битовые символы в полосе 915 МГц. Каждый символ распространяется на 32-элементную последовательность, используя метод, известный как Parallel Sequence Spread Спектра (PSSS) или ортогональный Код Деления мультиплексирование (OCDM). Последовательность микросхем затем модулируется ASK и передается в корневой фильтр приподнятого косинуса. Подробное описание см. в пункте 12 в разделе [1].

  • GFSK PHY: GFSK PHY сначала белит биты PPDU, используя модуль 2 сложения с последовательностью PN9. Затем отбеленные биты модулируются GFSK. Подробное описание см. в пункте 15 в разделе [1].

Генерация сигналов, декодирование и вычисление кривой BER

Этот код иллюстрирует, как использовать функции генерации сигналов и декодирования для различных частотных полос, и сравнивает соответствующие кривые BER.

EcNo = -25:2.5:17.5;                % Ec/No range of BER curves
spc = 4;                            % samples per chip
msgLen = 8*120;                     % length in bits
message = randi([0 1], msgLen, 1);  % transmitted message

% Preallocate vectors to store BER results:
[berOQPSK2450, berOQPSK780, berBPSK, berASK915, ...
 berASK868, berGFSK] = deal(zeros(1, length(EcNo)));

for idx = 1:length(EcNo) % loop over the EcNo range

  % O-QPSK PHY, 2450 MHz
  waveform = lrwpan.PHYGeneratorOQPSK(message, spc, '2450 MHz');
  K = 2;      % information bits per symbol
  SNR = EcNo(idx) - 10*log10(spc) + 10*log10(K);
  received = awgn(waveform, SNR);
  bits     = lrwpan.PHYDecoderOQPSKNoSync(received,  spc, '2450 MHz');
  [~, berOQPSK2450(idx)] = biterr(message, bits);

  % O-QPSK PHY, 780MHz
  waveform = lrwpan.PHYGeneratorOQPSK(message, spc, '780 MHz'); % or '868 MHz'/'915 MHz'
  SNR = EcNo(idx) - 10*log10(spc) + 10*log10(K);
  received = awgn(waveform, SNR);
  bits     = lrwpan.PHYDecoderOQPSKNoSync(received,  spc, '780 MHz'); % or '868 MHz'/'915 MHz'
  [~, berOQPSK780(idx)] = biterr(message, bits);

  % BPSK PHY, 868/915/950 MHz
  waveform = lrwpan.PHYGeneratorBPSK(message, spc);
  K = 1;      % information bits per symbol
  SNR = EcNo(idx) - 10*log10(spc) + 10*log10(K);
  received = awgn(waveform, SNR);
  bits     = lrwpan.PHYDecoderBPSK(received, spc);
  [~, berBPSK(idx)] = biterr(message, bits);

  % ASK PHY, 915 MHz
  waveform = lrwpan.PHYGeneratorASK(message, spc, '915 MHz');
  K = 1;      % information bits per symbol
  SNR = EcNo(idx) - 10*log10(spc) + 10*log10(K);
  received = awgn(waveform, SNR);
  bits     = lrwpan.PHYDecoderASK(received,  spc, '915 MHz');
  [~, berASK915(idx)] = biterr(message, bits(1:msgLen));

  % ASK PHY, 868 MHz
  waveform = lrwpan.PHYGeneratorASK(message, spc, '868 MHz');
  K = 1;      % information bits per symbol
  SNR = EcNo(idx) - 10*log10(spc) + 10*log10(K);
  received = awgn(waveform, SNR);
  bits     = lrwpan.PHYDecoderASK(received,  spc, '868 MHz');
  [~, berASK868(idx)] = biterr(message, bits(1:msgLen));

  % GFSK PHY, 950 MHz
  waveform = lrwpan.PHYGeneratorGFSK(message, spc);
  K = 1;      % information bits per symbol
  SNR = EcNo(idx) - 10*log10(spc) + 10*log10(K);
  received = awgn(waveform, SNR);
  bits     = lrwpan.PHYDecoderGFSK(received, spc);
  [~, berGFSK(idx)] = biterr(message, bits);
end

% plot BER curve
figure
semilogy(EcNo, berOQPSK2450, '-o', EcNo, berOQPSK780, '-*', EcNo, berBPSK, '-+', ...
         EcNo, berASK915,    '-x', EcNo, berASK868,    '-s', EcNo, berGFSK, '-v')
legend('OQPSK, 2450 MHz', 'OQPSK, 780 MHz', 'BPSK, 868/915/950 MHz', 'ASK, 915 MHz', ...
       'ASK, 868 MHz', 'GFSK, 950 MHz', 'Location', 'southwest')
title('IEEE 802.15.4 PHY BER Curves')
xlabel('Chip Energy to Noise Spectral Density, Ec/No (dB)')
ylabel('BER')
axis([min(EcNo) max(EcNo) 10^-2 1])
grid on

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

Можно дополнительно исследовать следующий генератор и функции декодирования:

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

  1. IEEE 802.15.4-2011 - Стандарт IEEE для местных и столичных сетей - Часть 15.4: Низкоскоростные беспроводные персональные сети (LR-WPAN)

Для просмотра документации необходимо авторизоваться на сайте