Предварительное кодирование MIMO 802.11ac с моделью WINNER II Channel

Этот пример показывает обработку передачи и приема для 802.11ac™ многопользовательской нисходящей передачи по WINNER II каналу с замираниями. Чтобы запустить этот пример, необходимо загрузить и установить модель WINNER II Channel Model for Communications Toolbox™ Add-On. Для настройки каналов от одной точки доступа всем пользователям требуется только один object™ WINNER II Channel System.

Введение

802.11ac поддерживает нисходящие (точка доступа - станция) многопользовательские передачи для до четырех пользователей и до восьми передающих антенн для увеличения совокупной пропускной способности ссылки [1]. На основе запланированного времени передачи для пользователя планировщик ищет другие меньшие пакеты, готовые к передаче другим пользователям. При наличии он планирует этих пользователей на том же интервале, что уменьшает общее время, затрачиваемое на несколько передач.

Эта одновременная передача имеет более высокую сложность, потому что успешный прием полезных нагрузок индивидуального пользователя требует предварительного кодирования, также известного как формирование луча на конце передачи. Предварительное кодирование принимает, что информация о состоянии канала (CSI) известна в передатчике. Зондирующий пакет, как описано в примере 802.11ac Transmit Beamforming (WLAN Toolbox), используется для определения CSI для каждого пользователя в многопользовательской передаче. Каждый из пользователей осуществляет обратную связь своего отдельного CSI с beamformer. Beamformer использует CSI от всех пользователей, чтобы задать матрицу предварительного кодирования (пространственное отображение) для последующей передачи данных.

Этот пример использует метод инверсии канала для передачи с тремя пользователями с другим количеством пространственных потоков, выделенных на пользователя, и различными параметрами скорости на пользователя. Система может быть охарактеризована рисунком ниже.

Пример генерирует сигнал многопользовательской передачи, пропускает его через многопользовательский канал WINNER II и декодирует принятый сигнал для каждого пользователя, чтобы вычислить биты по ошибке. Перед передачей данных пример использует передачу пакета с нулевыми данными (NDP), чтобы озвучить различные каналы для каждого пользователя, и определяет матрицу предварительного кодирования при условии идеальной обратной связи.

Проверка на установку пакета поддержки

Проверьте, установлен ли пакет поддержки 'WINNER II Channel Model for Communications Toolbox'.

commSupportPackageCheck('CST_WINNER2');

Параметры симуляции и строение

Для 802.11ac разрешено максимум восемь пространственных потоков. В этом примере используется строение 8x8 MIMO для трех пользователей, где первый пользователь имеет три потока, второй - один, а третий - четыре выделенных ему потока. Различные параметры скорости и размеры полезной нагрузки для каждого пользователя заданы как векторные параметры для строения передачи.

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 (Null Data Packet) передается каждому из запланированных пользователей [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 Channel для Communications Toolbox™ настраивается, чтобы симулировать три канала для разных пользователей. Для каждого пользователя сконфигурирован сценарий без A1 видимости (NLOS) в помещении (линии). С фиксированным профилем задержки степени каждый пользователь испытывает 16-трактный канал с самой большой задержкой 175 нас. Каждому пользователю также назначается низкая мобильность для 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 не позволяет изменять размер входного сигнала после блокировки, поэтому мы должны вызвать метод release перед передачей формы волны через него. В сложение, когда мы перезапускаем канал, мы хотим, чтобы он повторно обработал 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 замирающий канал Системного объекта для моделирования многопользовательской передачи VHT в 802.11ac. Дальнейшее исследование включает модификации параметров передачи, антенных решеток, сценариев канала, распространения LOS против NLOS, моделирование потерь пути и затенение моделирования.

Есть еще одна версия этого примера в WLAN Toolbox, который использует три независимых канала TGac с замираниями для трех пользователей: 802.11ac Multi-User MIMO Precoding (WLAN Toolbox).

Приложение

В этом примере используются следующие вспомогательные функции из WLAN Toolbox™:

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

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

  2. Perahia, E., R. Stacey, «Next Generation Wireless LANS: 802.11n and 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, Sep. 2007.

  5. Breit, G., H. Sampath, S. Vermani, et al., «TGac Channel Model Addendment», Version 12. IEEE 802.11-09/0308r12, март 2010.