В этом примере показано, как Библиотекой Communications Toolbox™ для Протокола Bluetooth® можно пользоваться, чтобы измерить частоту ошибок по битам (BER) для различных режимов Bluetooth низкой энергии (BLE) [1] использование сквозной симуляции физического уровня.
В этом примере сквозная симуляция используется, чтобы определить эффективность BER BLE [1] под каналом аддитивного белого гауссова шума (AWGN) для области значений энергии, подведенной к долоту к шумовому отношению плотности (Eb/No) значения. В каждой точке Eb/No несколько пакетов BLE передаются через шумный канал без других ухудшений радио-фронтенда (RF). Принимая идеальную синхронизацию, идеальный приемник используется, чтобы восстановить биты данных. Эти восстановленные биты данных по сравнению с битами передаваемых данных, чтобы определить BER. Кривые BER сгенерированы для четырех режимов пропускной способности передачи PHY, поддержанных в спецификации [1] BLE можно следующим образом:
Незакодированный PHY со скоростью передачи данных 1 Мбит/с (LE1M)
Незакодированный PHY со скоростью передачи данных 2 Мбит/с (LE2M)
Закодированный PHY со скоростью передачи данных 500 Кбит/с (LE500K)
Закодированный PHY со скоростью передачи данных 125 Кбит/с (LE125K)
Следующая схема обобщает симуляцию для каждого пакета.
% Check if the 'Communications Toolbox Library for the Bluetooth Protocol' % support package is installed or not. commSupportPackageCheck('BLUETOOTH');
EbNo = -2:2:8; % Eb/No range in dB sps = 4; % Samples per symbol dataLen = 2080; % Data length in bits simMode = {'LE1M','LE2M','LE500K','LE125K'};
Количеством пакетов, протестированных в каждой точке Eb/No, управляют два параметра:
maxNumErrors
максимальное количество битовых ошибок, симулированных в каждой точке Eb/No. Когда количество битовых ошибок достигает этого предела, симуляция в этой точке Eb/No завершена.
maxNumPackets
максимальное количество пакетов, симулированных в каждой точке Eb/No, и ограничивает продолжительность симуляции, если предел битовой ошибки не достигнут.
Числа выбраны для maxNumErrors
и maxNumPackets
в этом примере приведет к очень короткой симуляции. Для статистически значимых результатов мы рекомендуем увеличить эти числа.
maxNumErrors = 100; % Maximum number of bit errors at an Eb/No point maxNumPackets = 10; % Maximum number of packets at an Eb/No point
Этот пример также демонстрирует как parfor
цикл может использоваться вместо for
цикл при симуляции каждого Eb/No указывает, чтобы ускорить симуляцию. parfor
, как часть Parallel Computing Toolbox, выполняет обработку для каждой точки Eb/No параллельно, чтобы уменьшать общее время симуляции. Чтобы включить использование параллельных вычислений для увеличенной скорости, закомментируйте 'для' оператора и не прокомментируйте 'parfor' оператор ниже. Если Parallel Computing Toolbox™ не будет установлен, 'то parfor' примет значение по умолчанию к нормальному 'для' оператора.
numMode = numel(simMode); % Number of modes ber = zeros(numMode,length(EbNo)); % Pre-allocate to store BER results for iMode = 1:numMode phyMode = simMode{iMode}; % Set signal to noise ratio (SNR) points based on mode % For Coded PHY's (LE500K and LE125K), the code rate factor is included % in SNR calculation as 1/2 rate FEC encoder is used. if any(strcmp(phyMode,{'LE1M','LE2M'})) snrVec = EbNo - 10*log10(sps); else codeRate = 1/2; snrVec = EbNo + 10*log10(codeRate) - 10*log10(sps); end % parfor iSnr = 1:length(snrVec) % Use 'parfor' to speed up the simulation for iSnr = 1:length(snrVec) % Use 'for' to debug the simulation % Set random substream index per iteration to ensure that each % iteration uses a repeatable set of random numbers stream = RandStream('combRecursive','Seed',0); stream.Substream = iSnr; RandStream.setGlobalStream(stream); % Create an instance of error rate errorRate = comm.ErrorRate('Samples','Custom','CustomSamples',1:(dataLen-1)); % Loop to simulate multiple packets numErrs = 0; numPkt = 1; % Index of packet transmitted while numErrs < maxNumErrors && numPkt < maxNumPackets % Generate BLE waveform txBits = randi([0 1],dataLen,1,'int8'); % Data bits generation chanIndex = randi([0 39],1,1); % Random channel index value for each packet if chanIndex <=36 % Random access address for data channels % Ideally, this access address value should meet the requirements specified in % Section 2.1.2, Part-B, Vol-6 of Bluetooth specification. accessAdd = [1 0 0 0 1 1 1 0 1 1 0 0 1 ... 0 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 0]'; else % Default access address for periodic advertising channels accessAdd = [0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 ... 1 0 0 0 1 0 1 1 1 0 0 0 1]'; end txWaveform = bleWaveformGenerator(txBits,'Mode',phyMode,... 'SamplesPerSymbol',sps,... 'ChannelIndex',chanIndex,... 'AccessAddress',accessAdd); % Pass the transmitted waveform through AWGN channel rxWaveform = awgn(txWaveform,snrVec(iSnr)); % Recover data bits using ideal receiver rxBits = bleIdealReceiver(rxWaveform,'Mode',phyMode,... 'SamplesPerSymbol',sps,... 'ChannelIndex',chanIndex); % Determine the BER errors = errorRate(txBits,rxBits); ber(iMode,iSnr) = errors(1); numErrs = errors(2); numPkt = numPkt + 1; end disp(['Mode ' phyMode ', '... 'Simulating for Eb/No = ', num2str(EbNo(iSnr)), ' dB' ', '... 'BER:',num2str(ber(iMode,iSnr))]) end end
Mode LE1M, Simulating for Eb/No = -2 dB, BER:0.22222 Mode LE1M, Simulating for Eb/No = 0 dB, BER:0.14622 Mode LE1M, Simulating for Eb/No = 2 dB, BER:0.087542 Mode LE1M, Simulating for Eb/No = 4 dB, BER:0.024531 Mode LE1M, Simulating for Eb/No = 6 dB, BER:0.0080167 Mode LE1M, Simulating for Eb/No = 8 dB, BER:0.00010689 Mode LE2M, Simulating for Eb/No = -2 dB, BER:0.23377 Mode LE2M, Simulating for Eb/No = 0 dB, BER:0.16306 Mode LE2M, Simulating for Eb/No = 2 dB, BER:0.074074 Mode LE2M, Simulating for Eb/No = 4 dB, BER:0.022126 Mode LE2M, Simulating for Eb/No = 6 dB, BER:0.0063733 Mode LE2M, Simulating for Eb/No = 8 dB, BER:0.00053444 Mode LE500K, Simulating for Eb/No = -2 dB, BER:0.37326 Mode LE500K, Simulating for Eb/No = 0 dB, BER:0.27898 Mode LE500K, Simulating for Eb/No = 2 dB, BER:0.12266 Mode LE500K, Simulating for Eb/No = 4 dB, BER:0.032708 Mode LE500K, Simulating for Eb/No = 6 dB, BER:0.0017637 Mode LE500K, Simulating for Eb/No = 8 dB, BER:0 Mode LE125K, Simulating for Eb/No = -2 dB, BER:0.30736 Mode LE125K, Simulating for Eb/No = 0 dB, BER:0.065897 Mode LE125K, Simulating for Eb/No = 2 dB, BER:0.0013361 Mode LE125K, Simulating for Eb/No = 4 dB, BER:0 Mode LE125K, Simulating for Eb/No = 6 dB, BER:0 Mode LE125K, Simulating for Eb/No = 8 dB, BER:0
markers = 'ox*s'; color = 'bmcr'; dataStr = {zeros(numMode,1)}; figure; for iMode = 1:numMode semilogy(EbNo,ber(iMode,:).',['-' markers(iMode) color(iMode)]); hold on; dataStr(iMode) = simMode(iMode); end grid on; xlabel('Eb/No (dB)'); ylabel('BER'); legend(dataStr); title('BER for BLE with AWGN channel');
Количеством пакетов, протестированных в каждой точке Eb/No, управляет maxNumErrors
и maxNumPackets
параметры. Для статистически значимых результатов эти значения должны быть больше, чем представленные в этом примере. Рисунок ниже был создан путем выполнения примера для дольше с maxNumErrors = 1e3
, maxNumPackets = 1e4
, для всех этих четырех режимов.
Этот пример симулирует ссылку физического уровня BLE по каналу AWGN. Это показывает, как сгенерировать формы волны BLE, демодулировать и декодировать биты с помощью идеального приемника и вычислить BER.
Объем 6 из спецификации ядра Bluetooth, системный пакет ядра версии 5.0 [низкий энергетический контроллер объем].