exponenta event banner

802 .11ac Мультипользовательское предварительное кодирование MIMO с использованием модели канала WINNER II

Этот пример показывает обработку передачи и приема для 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)

Для предварительного кодирования сначала используется канальное зондирование для определения канала, с которым сталкиваются пользователи (приемники). Эта информация о состоянии канала посылается обратно в передатчик для ее использования для последующей передачи данных. Предполагается, что канал медленно изменяется в течение двух передач. Для многопользовательских передач один и тот же 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);

Канал WINNER II для внутреннего офиса (A1)

В этом примере один 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:

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

  1. Стандарт IEEE ® Std 802.11ac™-2013 IEEE для информационных технологий - Телекоммуникации и обмен информацией между системами - Локальные и городские сети - Особые требования - Часть 11: Спецификации управления доступом к среде беспроводной локальной сети (MAC) и физического уровня (PHY) - Поправка 4: Усовершенствования для очень высокой пропускной способности для работы в диапазонах ниже 6 Гр

  2. Perahia, E., R. Stacey, «Следующее поколение беспроводных LANS: 802.11n и 802.11ac», Cambridge University Press, 2013.

  3. Стандарт IEEE Std 802.11™-2012 IEEE для информационных технологий - Телекоммуникации и обмен информацией между системами - Локальные и городские сети - Особые требования - Часть 11: Спецификации управления доступом к среде беспроводной локальной сети (MAC) и физического уровня (PHY).

  4. IST WINNER II, «WINNER II Channel Models», D1.1.2, сентябрь 2007 года.

  5. Breit, G., H. Sampath, S. Vermani и др., «Добавление к модели канала TGac», версия 12. IEEE 802.11-09/0308r12, март 2010 г.