Этот пример показывает обработку передачи и приема для 802.11ac™ многопользовательской передачи по нисходящей линии связи по каналу замирания WINNER II. Для запуска этого примера необходимо загрузить и установить модуль WINNER II Channel Model for Communications Toolbox™ Add-On. Для настройки каналов от одной точки доступа ко всем пользователям необходим только один системный object™ канала WINNER II.
802.11ac поддерживает нисходящие (точка доступа к станции) многопользовательские передачи для четырех пользователей и до восьми передающих антенн для увеличения совокупной пропускной способности линии [1]. На основании запланированного времени передачи для пользователя планировщик ищет другие пакеты меньшего размера, готовые для передачи другим пользователям. Если доступно, он планирует этих пользователей в течение одного и того же интервала, что уменьшает общее время, затрачиваемое на несколько передач.
Эта одновременная передача имеет более высокую сложность, поскольку успешный прием полезной нагрузки отдельного пользователя требует предварительного кодирования, также известного как формирование луча на передающей стороне. Предварительное кодирование предполагает, что информация о состоянии канала (CSI) известна в передатчике. Зондирующий пакет, как описано в примере 802.11ac Transmit Beamforming (WLAN Toolbox), используется для определения CSI для каждого пользователя в многопользовательской передаче. Каждый из пользователей передает свой индивидуальный CSI в формирователь луча. Формирователь луча использует CSI от всех пользователей для установки матрицы предварительного кодирования (пространственного отображения) для последующей передачи данных.
В этом примере используется метод инверсии канала для трехпользовательской передачи с различным количеством пространственных потоков, выделенных на пользователя, и различными параметрами скорости на пользователя. Система может быть охарактеризована на рисунке ниже.

Пример генерирует многопользовательский сигнал передачи, пропускает его через многопользовательский канал WINNER II и декодирует принятый сигнал для каждого пользователя, чтобы вычислить ошибочные биты. Перед передачей данных пример использует передачу нулевого пакета данных (NDP) для звучания различных каналов для каждого пользователя и определяет матрицу предварительного кодирования в предположении совершенной обратной связи.
Проверьте, установлен ли пакет поддержки 'WINNER II Channel Model for Communications Toolbox'.
commSupportPackageCheck('CST_WINNER2');
Для 802.11ac допускается максимум восемь пространственных потоков. В этом примере используется конфигурация MIMO 8x8 для трех пользователей, где первый пользователь имеет три потока, второй - один, а третий - четыре потока. Различные параметры скорости и размеры полезной нагрузки для каждого пользователя определяются как векторные параметры для конфигурации передачи.
s = rng(10); % Set RNG seed for repeatability % Transmission parameters chanBW = 'CBW80'; % Channel bandwidth numUsers = 3; % Number of users numSTSVec = [3 1 4]; % Number of streams per user userPos = [0 1 2]; % User positions mcsVec = [4 6 8]; % MCS per user: 16QAM, 64QAM, 256QAM apepVec = [520 192 856]; % Payload per user, in bytes chCodingVec = {'BCC','LDPC','LDPC'}; % Channel coding per user % Precoding and equalization parameters precodingType = 'ZF'; % Precoding type; ZF or MMSE snr = 47; % SNR in dB eqMethod = 'ZF'; % Equalization method % Create the multiuser VHT format configuration object numTx = sum(numSTSVec); cfgVHTMU = wlanVHTConfig('ChannelBandwidth',chanBW, ... 'NumUsers',numUsers, ... 'NumTransmitAntennas',numTx, ... 'GroupID',2, ... 'NumSpaceTimeStreams',numSTSVec,... 'UserPositions',userPos, ... 'MCS',mcsVec, ... 'APEPLength',apepVec, ... 'ChannelCoding',chCodingVec);
Количество передающих антенн устанавливается равным сумме всех используемых пространственно-временных потоков. Это подразумевает, что для передачи не используется пространственно-временное блочное кодирование (STBC) или пространственное расширение.
Для предварительного кодирования сначала используется канальное зондирование для определения канала, с которым сталкиваются пользователи (приемники). Эта информация о состоянии канала посылается обратно в передатчик для ее использования для последующей передачи данных. Предполагается, что канал медленно изменяется в течение двух передач. Для многопользовательских передач один и тот же NDP (нулевой пакет данных) передается каждому из запланированных пользователей [2].
% VHT sounding (NDP) configuration, for same number of streams cfgVHTNDP = wlanVHTConfig('ChannelBandwidth',chanBW, ... 'NumUsers',1, ... 'NumTransmitAntennas',numTx, ... 'GroupID',0, ... 'NumSpaceTimeStreams',sum(numSTSVec),... 'MCS',0, ... 'APEPLength',0);
Указанное количество потоков является суммой всех используемых пространственно-временных потоков. Это позволяет звучать всему каналу.
% Generate the null data packet, with no data
txNDPSig = wlanWaveformGenerator([],cfgVHTNDP);
NPDSigLen = size(txNDPSig, 1);
В этом примере один comm.WINNER2Channel Системный объект в модели канала WINNER II для Toolbox™ связи настроен для моделирования трех каналов различным пользователям. Сценарий non-line-of-sight (NLOS) для внутреннего офиса (A1) конфигурируется для каждого пользователя. При фиксированном профиле задержки мощности каждый пользователь испытывает 16-тракт замирания канала с наибольшей задержкой 175 us. Каждому пользователю также назначается низкий уровень мобильности, соответствующий стандарту 802.11ac.
В точке доступа используется однородный кольцевой массив (UCA) радиусом 20 см. Каждый пользователь использует однородный линейный массив (ULA) с интервалом 5 см между элементами. Также предполагается, что количество приемных антенн каждого пользователя равно количеству выделенных им пространственно-временных потоков.
% Set up layout parameters for WINNER II channel AA = winner2.AntennaArray('UCA',numTx,0.2); for i = 1:numUsers AA(i+1) = winner2.AntennaArray('ULA',numSTSVec(i),0.05); end STAIdx = 2:(numUsers+1); APIdx = {1}; rndSeed = 12; cfgLayout = winner2.layoutparset(STAIdx,APIdx,numUsers,AA,[],rndSeed); cfgLayout.Pairing = [ones(1,numUsers);2:(numUsers+1)]; % One access point to all users cfgLayout.ScenarioVector = ones(1,numUsers); % A1 scenario for all links cfgLayout.PropagConditionVector = zeros(1,numUsers); % NLOS for i = 1:numUsers % Randomly set velocity for each user v = rand(3,1) - 0.5; cfgLayout.Stations(i+1).Velocity = v/norm(v,'fro'); end % Set up model parameters for WINNER II channel cfgModel = winner2.wimparset; cfgModel.FixedPdpUsed = 'yes'; cfgModel.FixedAnglesUsed = 'yes'; cfgModel.IntraClusterDsUsed = 'no'; cfgModel.RandomSeed = 111; % Repeatability % The maximum velocity for the 3 users is 1m/s. Set up the SampleDensity % field to ensure that the sample rate matches the channel bandwidth. maxMSVelocity = max(cell2mat(cellfun(@(x) norm(x,'fro'), ... {cfgLayout.Stations.Velocity},'UniformOutput',false))); cfgModel.UniformTimeSampling = 'yes'; cfgModel.SampleDensity = round(physconst('LightSpeed')/ ... cfgModel.CenterFrequency/2/(maxMSVelocity/wlanSampleRate(cfgVHTMU))); % Create the WINNER II channel System object WINNERChan = comm.WINNER2Channel(cfgModel,cfgLayout); % Call the info method to check some derived channel parameters chanInfo = info(WINNERChan)
chanInfo =
struct with fields:
NumLinks: 3
NumBSElements: [8 8 8]
NumMSElements: [3 1 4]
NumPaths: [16 16 16]
SampleRate: [8.0000e+07 8.0000e+07 8.0000e+07]
ChannelFilterDelay: [7 7 7]
NumSamplesProcessed: 0
Задержка фильтрации канала для каждого пользователя сохраняется для учета его компенсации в приемнике. На практике будет использоваться оценка синхронизации символа. В передатчике дополнительные десять всех нулевых выборок добавляются для учета задержки канального фильтра.
chanDelay = chanInfo.ChannelFilterDelay; numPadZeros = 10; % Set ModelConfig.NumTimeSamples to match the length of the input signal to % avoid warning WINNERChan.ModelConfig.NumTimeSamples = NPDSigLen + numPadZeros; % Sound the WINNER II channel for all users chanOutNDP = WINNERChan([txNDPSig;zeros(numPadZeros,numTx)]); % Add AWGN rxNDPSig = cellfun(@awgn,chanOutNDP, ... num2cell(snr*ones(numUsers,1)),'UniformOutput',false);
Каждый пользователь оценивает свой собственный канал, используя принятый сигнал NDP, и вычисляет информацию о состоянии канала, которую он может отправить обратно в передатчик. В этом примере используется разложение сингулярного значения канала, видимого каждому пользователю, для вычисления обратной связи CSI.
mat = cell(numUsers,1); for uIdx = 1:numUsers % Compute the feedback matrix based on received signal per user mat{uIdx} = vhtCSIFeedback(rxNDPSig{uIdx}(chanDelay(uIdx)+1:end,:), ... cfgVHTNDP,uIdx,numSTSVec); end
Предполагая совершенную обратную связь без потерь сжатия или квантования CSI, передатчик вычисляет управляющую матрицу для передачи данных с использованием методов предварительного кодирования, основанных либо на нулевом форсировании, либо на минимальном среднем квадрате (MMSE). Оба способа пытаются отменить интерференцию внутри потока для интересующего пользователя и интерференцию для других пользователей. Подход, основанный на MMSE, позволяет избежать усиления шума, присущего технике нулевого форсирования. В результате он работает лучше при низких ОСШ.
% Pack the per user CSI into a matrix numST = length(mat{1}); % Number of subcarriers steeringMatrix = zeros(numST,sum(numSTSVec),sum(numSTSVec)); % Nst-by-Nt-by-Nsts for uIdx = 1:numUsers stsIdx = sum(numSTSVec(1:uIdx-1))+(1:numSTSVec(uIdx)); steeringMatrix(:,:,stsIdx) = mat{uIdx}; % Nst-by-Nt-by-Nsts end % Zero-forcing or MMSE precoding solution if strcmp(precodingType, 'ZF') delta = 0; % Zero-forcing else delta = (numTx/(10^(snr/10))) * eye(numTx); % MMSE end for i = 1:numST % Channel inversion precoding h = squeeze(steeringMatrix(i,:,:)); steeringMatrix(i,:,:) = h/(h'*h + delta); end % Set the spatial mapping based on the steering matrix cfgVHTMU.SpatialMapping = 'Custom'; cfgVHTMU.SpatialMappingMatrix = permute(steeringMatrix,[1 3 2]);
Случайные биты используются в качестве полезной нагрузки для отдельных пользователей. Массив ячеек используется для хранения битов данных для каждого пользователя. txDataBits. Для многопользовательской передачи полезные нагрузки отдельных пользователей дополняются таким образом, что продолжительность передачи одинакова для всех пользователей. Этот процесс заполнения описан в разделе 9.12.6 из [1]. В этом примере для простоты полезная нагрузка дополняется нулями для создания PSDU для каждого пользователя.
% Create data sequences, one for each user txDataBits = cell(numUsers,1); psduDataBits = cell(numUsers,1); for uIdx = 1:numUsers % Generate payload for each user txDataBits{uIdx} = randi([0 1],cfgVHTMU.APEPLength(uIdx)*8,1,'int8'); % Pad payload with zeros to form a PSDU psduDataBits{uIdx} = [txDataBits{uIdx}; ... zeros((cfgVHTMU.PSDULength(uIdx)-cfgVHTMU.APEPLength(uIdx))*8,1,'int8')]; end
Используя конфигурацию формата, cfgVHTMU, с матрицей управления, для генерации многопользовательского сигнала VHT.
txSig = wlanWaveformGenerator(psduDataBits,cfgVHTMU);
Объект канала WINNER II не позволяет изменять размер входного сигнала, когда он заблокирован, поэтому мы должны вызвать метод освобождения перед прохождением через него сигнала. Кроме того, при перезапуске канала мы хотим, чтобы он повторно обрабатывал NDP перед формой сигнала, чтобы точно имитировать непрерывность канала. Только часть сигнала выходного сигнала канала извлекается для последующей обработки каждого пользователя.
release(WINNERChan); % Set ModelConfig.NumTimeSamples to match the total length of NDP plus % waveform and padded zeros WINNERChan.ModelConfig.NumTimeSamples = ... WINNERChan.ModelConfig.NumTimeSamples + length(txSig) + numPadZeros; % Transmit through the WINNER II channel for all users, with 10 all-zero % samples appended to account for channel filter delay chanOut = WINNERChan([txNDPSig; zeros(numPadZeros,numTx); ... txSig; zeros(numPadZeros,numTx)]); % Extract the waveform output for each user chanOut = cellfun(@(x) x(NPDSigLen+numPadZeros+1:end,:),chanOut,'UniformOutput',false); % Add AWGN rxSig = cellfun(@awgn,chanOut, ... num2cell(snr*ones(numUsers,1)),'UniformOutput',false);
Сигналы приема для каждого пользователя обрабатываются индивидуально. В примере предполагается, что отсутствуют внешние нарушения и что конфигурация передачи известна приемнику для простоты.
Номер пользователя определяет пользователя, представляющего интерес, который декодируется для передачи. Это также используется для индексирования в векторные свойства объекта конфигурации, специфичные для пользователя.
% Get field indices from configuration, assumed known at receiver ind = wlanFieldIndices(cfgVHTMU); % Single-user receivers recover payload bits rxDataBits = cell(numUsers,1); scaler = zeros(numUsers,1); spAxes = gobjects(sum(numSTSVec),1); hfig = figure('Name','Per-stream equalized symbol constellation'); for uIdx = 1:numUsers rxNSig = rxSig{uIdx}(chanDelay(uIdx)+1:end, :); % User space-time streams stsU = numSTSVec(uIdx); % Estimate noise power in VHT fields lltf = rxNSig(ind.LLTF(1):ind.LLTF(2),:); demodLLTF = wlanLLTFDemodulate(lltf,chanBW); nVar = helperNoiseEstimate(demodLLTF,chanBW,sum(numSTSVec)); % Perform channel estimation based on VHT-LTF rxVHTLTF = rxNSig(ind.VHTLTF(1):ind.VHTLTF(2),:); demodVHTLTF = wlanVHTLTFDemodulate(rxVHTLTF,chanBW,numSTSVec); chanEst = wlanVHTLTFChannelEstimate(demodVHTLTF,chanBW,numSTSVec); % Recover information bits in VHT Data field rxVHTData = rxNSig(ind.VHTData(1):ind.VHTData(2),:); [rxDataBits{uIdx},~,eqsym] = wlanVHTDataRecover(rxVHTData, ... chanEst,nVar,cfgVHTMU,uIdx, ... 'EqualizationMethod',eqMethod,'PilotPhaseTracking','None', ... 'LDPCDecodingMethod','layered-bp','MaximumLDPCIterationCount',6); % Plot equalized symbols for all streams per user scaler(uIdx) = ceil(max(abs([real(eqsym(:)); imag(eqsym(:))]))); for i = 1:stsU subplot(numUsers,max(numSTSVec),(uIdx-1)*max(numSTSVec)+i); plot(reshape(eqsym(:,:,i),[],1),'.'); axis square spAxes(sum([0 numSTSVec(1:(uIdx-1))])+i) = gca; % Store axes handle title(['User ' num2str(uIdx) ', Stream ' num2str(i)]); grid on; end end % Scale axes for all subplots and scale figure for i = 1:numel(spAxes) xlim(spAxes(i),[-max(scaler) max(scaler)]); ylim(spAxes(i),[-max(scaler) max(scaler)]); end pos = get(hfig,'Position'); set(hfig,'Position',[pos(1)*0.7 pos(2)*0.7 1.3*pos(3) 1.3*pos(4)]);

Графики выровненной комбинации символов для каждого потока проверяют параметры моделирования и передают эффективность метода. Обратите внимание на различимые совокупности 16QAM, 64QAM и QPSK для каждого пользователя, как указано на передающем конце. Также наблюдайте ухудшение EVM над различными потоками для отдельного пользователя. Это характерная характеристика метода инверсии каналов.
Восстановленные биты данных сравниваются с переданными битами полезной нагрузки для определения частоты битовых ошибок.
% Compare recovered bits against per-user APEPLength information bits ber = inf(1, numUsers); for uIdx = 1:numUsers idx = (1:cfgVHTMU.APEPLength(uIdx)*8).'; [~,ber(uIdx)] = biterr(txDataBits{uIdx}(idx),rxDataBits{uIdx}(idx)); disp(['Bit Error Rate for User ' num2str(uIdx) ': ' num2str(ber(uIdx))]); end rng(s); % Restore RNG state
Bit Error Rate for User 1: 0 Bit Error Rate for User 2: 0 Bit Error Rate for User 3: 0.00014603
Небольшое количество битовых ошибок в пределах дисперсии шума указывает на успешное декодирование данных для всех потоков для каждого пользователя, несмотря на изменение EVM, наблюдаемое в отдельных потоках.
В примере показано, как использовать объект WINNER II fading channel System для моделирования многопользовательской передачи VHT в 802.11ac. Дальнейшее изучение включает в себя модификации параметров передачи, антенных решеток, сценариев канала, распространения LOS и NLOS, моделирование потерь в тракте и моделирование затенения.
Существует другая версия этого примера в WLAN Toolbox, которая использует три независимых канала замирания TGac для трёх пользователей: 802.11ac Multi-User MIMO Precoding (WLAN Toolbox).
В этом примере используются следующие вспомогательные функции из Toolbox™ WLAN:
Стандарт IEEE ® Std 802.11ac™-2013 IEEE для информационных технологий - Телекоммуникации и обмен информацией между системами - Локальные и городские сети - Особые требования - Часть 11: Спецификации управления доступом к среде беспроводной локальной сети (MAC) и физического уровня (PHY) - Поправка 4: Усовершенствования для очень высокой пропускной способности для работы в диапазонах ниже 6 Гр
Perahia, E., R. Stacey, «Следующее поколение беспроводных LANS: 802.11n и 802.11ac», Cambridge University Press, 2013.
Стандарт IEEE Std 802.11™-2012 IEEE для информационных технологий - Телекоммуникации и обмен информацией между системами - Локальные и городские сети - Особые требования - Часть 11: Спецификации управления доступом к среде беспроводной локальной сети (MAC) и физического уровня (PHY).
IST WINNER II, «WINNER II Channel Models», D1.1.2, сентябрь 2007 года.
Breit, G., H. Sampath, S. Vermani и др., «Добавление к модели канала TGac», версия 12. IEEE 802.11-09/0308r12, март 2010 г.