В этом примере показано, как реализовать Bluetooth® Low Energy (BLE) получатель, пользующийся Библиотекой Communications Toolbox™ для Протокола Bluetooth. Можно или использовать записанные сигналы или получить сигналы в режиме реального времени с помощью Радио ADALM-PLUTO. Подходящий сигнал для приема может быть сгенерирован путем симуляции сопутствующего примера, Bluetooth передатчика с низким энергопотреблением, с любой из следующей настройки: (i) Две платформы SDR, соединенные с тем же хостом - компьютером, который запускает два сеанса работы с MATLAB (ii) Две платформы SDR, соединенные с двумя компьютерами, которые запускают отдельные сеансы работы с MATLAB.
Отошлите к Ведомой Радио-Хостом Настройке оборудования (Пакет Поддержки Communications Toolbox для Аналоговых устройств Радио ADALM-Pluto) документацию для получения дополнительной информации о том, как сконфигурировать ваш хост - компьютер, чтобы работать с Пакетом Поддержки для Радио ADALM-PLUTO.
Чтобы запустить этот пример с помощью записанных сигналов, вам нужно следующее программное обеспечение:
Библиотека Communications Toolbox для протокола Bluetooth
Чтобы получить сигналы в режиме реального времени, вам также нужны радио ADALM-PLUTO и соответствующее Дополнение пакета поддержки:
Для полного списка Communications Toolbox поддерживаемые платформы SDR обратитесь к разделу Supported Hardware страницы открытия Программно определяемого радио (SDR).
Специальная группа (SIG) Bluetooth ввела BLE для коммуникаций малой дальности малой мощности. Стандарт Bluetooth [1] задает слой Link, который включает оба слоя PHY и MAC. Приложения BLE включают файл изображения и передачи видеофайла между мобильными телефонами, размещают автоматизацию и Интернет вещей (IoT).
Технические требования BLE:
Частотный диапазон передачи: 2.4-2.4835 ГГц
Каналы РФ: 40
Уровень символа: 1 Msym/s, 2 Msym/s
Модуляция: Гауссово минимальное манипулирование сдвига (GMSK)
Режимы передачи PHY: (i) LE1M - Незакодированный PHY со скоростью передачи данных 1 Мбит/с (ii) LE2M - Незакодированный PHY со скоростью передачи данных 2 Мбит/с (iii) LE500K - Закодированный PHY со скоростью передачи данных 500 Кбит/с (iv) LE125K - Закодированный PHY со скоростью передачи данных 125 Кбит/с
Стандарт Bluetooth [1] задает воздушные форматы пакета интерфейса для всех четырех режимов передачи PHY BLE использование следующих полей:
Преамбула: преамбула зависит от режима передачи PHY. Режим LE1M использует 8-битную последовательность альтернативных нулей и единиц, '01010101'. LE2M использует 16-битную последовательность альтернативных нулей и единиц, '0101...'. Режимы LE500K и LE125K используют 80-битную последовательность нулей и единиц, полученных путем повторения '00111100' десять раз.
Указатель: Задает адрес связи, совместно использованный двумя устройствами BLE с помощью 32-битной последовательности.
Кодирование Индикатора: 2-битная последовательность, используемая в дифференциации закодированных режимов (LE125K и LE500K).
Полезная нагрузка: биты Входного сигнала и включая модуль данных о протоколе (PDU) и включая контроль циклическим избыточным кодом (CRC). Максимальный размер сообщения составляет 2 080 битов.
Поля завершения: Два 3-битных нулевых вектора, используемые в прямом кодировании исправления ошибок. Поля завершения присутствуют для закодированных режимов (LE500K и LE125K) только.
Формат пакета для незакодированного PHY (LE1M и LE2M) режимы показан на рисунке ниже:
Формат пакета для закодированного PHY (LE500K и LE125K) режимы показан на рисунке ниже:
% Check if the 'Communications Toolbox Library for the Bluetooth Protocol' % support package is installed or not. commSupportPackageCheck('BLUETOOTH');
Общая структура примера получателя BLE описана можно следующим образом:
Инициализируйте параметры получателя
Источник сигнала
Получите пакеты BLE
Обработка получателя
Инициализируйте параметры получателя
helperBLEReceiverConfig.m скрипт инициализирует параметры получателя. Можно изменить phyMode
параметр, чтобы декодировать полученную форму волны BLE на основе режима передачи PHY. phyMode
может быть один от набора: {'LE1M', 'LE2M', 'LE500K', 'LE125K'}.
phyMode = 'LE1M';
bleParam = helperBLEReceiverConfig(phyMode);
Источник сигнала
Задайте источник сигнала как 'Файл' или 'ADALM-PLUTO'.
File:Uses comm.BasebandFileReader
считать файл, который содержит ранее полученный беспроводной сигнал.
ADALM-PLUTO: использует sdrrx
Системный объект, чтобы получить живой сигнал от оборудования SDR.
Если вы присваиваете ADALM-PLUTO как источник сигнала, пример ищет ваш компьютер радио ADALM-PLUTO в радиообращении 'usb:0' и использует его в качестве источника сигнала.
signalSource = 'File'; % The default signal source is 'File'
if strcmp(signalSource,'File') switch bleParam.Mode case 'LE1M' bbFileName = 'bleCapturesLE1M.bb'; case 'LE2M' bbFileName = 'bleCapturesLE2M.bb'; case 'LE500K' bbFileName = 'bleCapturesLE500K.bb'; case 'LE125K' bbFileName = 'bleCapturesLE125K.bb'; otherwise error('Invalid PHY transmission mode. Valid entries are LE1M, LE2M, LE500K and LE125K.'); end sigSrc = comm.BasebandFileReader(bbFileName); bbSampleRate = sigSrc.SampleRate; sigSrc.SamplesPerFrame = 1e7; bleParam.SamplesPerSymbol = bbSampleRate/bleParam.SymbolRate; elseif strcmp(signalSource,'ADALM-PLUTO') % First check if the HSP exists if isempty(which('plutoradio.internal.getRootDir')) error(message('comm_demos:common:NoSupportPackage', ... 'Communications Toolbox Support Package for ADALM-PLUTO Radio',... ['<a href="https://www.mathworks.com/hardware-support/' ... 'adalm-pluto-radio.html">ADALM-PLUTO Radio Support From Communications Toolbox</a>'])); end bbSampleRate = bleParam.SymbolRate * bleParam.SamplesPerSymbol; sigSrc = sdrrx('Pluto',... 'RadioID', 'usb:0',... 'CenterFrequency', 2.402e9,... 'BasebandSampleRate', bbSampleRate,... 'SamplesPerFrame', 1e7,... 'GainSource', 'Manual',... 'Gain', 25,... 'OutputDataType', 'double'); else error('Invalid signal source. Valid entries are File and ADALM-PLUTO.'); end % Setup spectrum viewer spectrumScope = dsp.SpectrumAnalyzer( ... 'SampleRate', bbSampleRate,... 'SpectrumType', 'Power density', ... 'SpectralAverages', 10, ... 'YLimits', [-130 -30], ... 'Title', 'Received Baseband BLE Signal Spectrum', ... 'YLabel', 'Power spectral density');
Получите пакеты BLE
% The transmitted waveform is captured as a burst dataCaptures = sigSrc(); % Show power spectral density of the received waveform spectrumScope(dataCaptures);
Обработка получателя
Основополосные выборки, полученные от источника сигнала, обрабатываются, чтобы декодировать информацию о заголовке PDU и необработанные биты сообщения. Следующая схема показывает обработку получателя.
Выполните автоматическое управление усилением (AGC)
Удалите смещение DC
Оцените и откорректируйте для смещения несущей частоты
Выполните согласованную фильтрацию с гауссовым импульсом
Синхронизация синхронизации
Демодуляция GMSK
Декодирование FEC и шаблон demapping для ФИЗИКИ LECoded (LE500K и LE125K)
Данные dewhitening
Выполните проверку CRC на декодируемом PDU
Вычислите пакетный коэффициент ошибок (PER)
% Initialize System objects for receiver processing agc = comm.AGC('MaxPowerGain',20,'DesiredOutputPower',2); freqCompensator = comm.CoarseFrequencyCompensator('Modulation', 'OQPSK',... 'SampleRate',bbSampleRate,... 'SamplesPerSymbol',2*bleParam.SamplesPerSymbol,... 'FrequencyResolution',100); prbDet = comm.PreambleDetector(bleParam.RefSeq,'Detections','First'); % Initialize counter variables pktCnt = 0; crcCnt = 0; displayFlag = false; % true if the received data is to be printed % Loop to decode the captured BLE samples while length(dataCaptures) > bleParam.MinimumPacketLen % Consider two frames from the captured signal for each iteration startIndex = 1; endIndex = min(length(dataCaptures),2*bleParam.FrameLength); rcvSig = dataCaptures(startIndex:endIndex); rcvAGC = agc(rcvSig); % Perform AGC rcvDCFree = rcvAGC - mean(rcvAGC); % Remove the DC offset rcvFreqComp = freqCompensator(rcvDCFree); % Estimate and compensate for the carrier frequency offset rcvFilt = conv(rcvFreqComp,bleParam.h,'same'); % Perform gaussian matched filtering % Perform frame timing synchronization [~, dtMt] = prbDet(rcvFilt); release(prbDet) prbDet.Threshold = max(dtMt); prbIdx = prbDet(rcvFilt); % Extract message information [cfgLLAdv,pktCnt,crcCnt,remStartIdx] = helperBLEPhyBitRecover(rcvFilt,... prbIdx,pktCnt,crcCnt,bleParam); % Remaining signal in the burst captures dataCaptures = dataCaptures(1+remStartIdx:end); % Display the decoded information if displayFlag && ~isempty(cfgLLAdv) fprintf('Advertising PDU Type: %s\n', cfgLLAdv.PDUType); fprintf('Advertising Address: %s\n', cfgLLAdv.AdvertiserAddress); end % Release System objects release(freqCompensator) release(prbDet) end % Release the signal source release(sigSrc) % Determine the PER if pktCnt per = 1-(crcCnt/pktCnt); fprintf('Packet error rate for %s mode is %f.\n',bleParam.Mode,per); else fprintf('\n No BLE packets were detected.\n') end
Packet error rate for LE1M mode is 0.000000.
Сопутствующий Bluetooth передатчик с низким энергопотреблением в качестве примера может использоваться, чтобы передать стандартно-совместимую форму волны BLE, которая может декодироваться этим примером. Можно также использовать этот пример, чтобы передать канал данных PDUs путем изменения индекса канала, указателя и центральных значений частоты в обоих примеры.
Общие советы для поиска и устранения неисправностей оборудования SDR и Пакета Поддержки Communications Toolbox для Радио ADALM-PLUTO могут быть найдены в Типичных проблемах и Фиксируют (Пакет Поддержки Communications Toolbox для Аналоговых устройств Радио ADALM-Pluto).
Этот пример использует следующие функции помощника:
Объем 6 из спецификации ядра Bluetooth, системный пакет ядра версии 5.0 [низкий энергетический контроллер объем].