Этот пример показывает передачу, и получите обработку для 802.11ac™ многопользовательская нисходящая передача по исчезающему каналу. Пример использует линейные методы перед кодированием на основе сингулярного разложения (SVD) канала.
802.11ac поддерживает нисходящий канал (точка доступа к станции) многопользовательские передачи максимум для четырех пользователей и до восьми антенн передачи, чтобы увеличить совокупную пропускную способность ссылки [1]. На основе запланированного времени передачи для пользователя планировщик ищет другие меньшие пакеты, готовые к передаче другим пользователям. При наличии это планирует этих пользователей на том же интервале, который уменьшает полное время, потраченное для нескольких передач.
Эта одновременная передача прибывает в более высокую сложность, потому что успешный прием полезных нагрузок отдельного пользователя требует предварительного кодирования, также известного как конец передачи beamforming. Предварительное кодирование принимает, что информация о состоянии канала (CSI) известна в передатчике. Звучащий пакет, как описано в Передаче 802.11ac пример Beamforming, используется, чтобы определить CSI для каждого пользователя в многопользовательской передаче. Каждый из пользователей возвращает их отдельный CSI к формирователю луча. Формирователь луча использует CSI от всех пользователей, чтобы установить предварительное кодирование (пространственное отображение) матрица для последующей передачи данных.
Этот пример использует метод инверсии канала для передачи с тремя пользователями с различным количеством пространственных потоков, выделенных на пользователя и различные параметры уровня на пользователя. Система может быть охарактеризована фигурой ниже.
Пример генерирует многопользовательскую форму волны передачи, передает ее через канал на пользователя и декодирует полученный сигнал для каждого пользователя вычислить биты по ошибке. До передачи данных пример использует передачу пакета пустых данных (NDP), чтобы звучать как различные каналы и определяет матрицу перед кодированием под предположением о совершенной обратной связи.
Для 802.11ac позволен максимум восьми пространственных потоков. 6x6 настройка MIMO для трех пользователей используется в этом примере, где у первого пользователя есть три потока, второй имеет один, и третье имеет два потока, выделенные ему. Различные параметры уровня и размеры полезной нагрузки максимум для четырех пользователей заданы как векторные параметры. Они индексируются соответственно в настройке передачи на основе количества активных пользователей.
s = rng(21); % Set RNG seed for repeatability % Transmission parameters chanBW = 'CBW80'; % Channel bandwidth numUsers = 3; % Number of active users numSTSAll = [3 1 2 2]; % Number of streams for 4 users userPos = [0 1 2 3]; % User positions for maximum 4 users mcsVec = [4 6 2 2]; % MCS for maximum 4 users apepVec = [15120 8192 5400 6000]; % Payload, in bytes, for 4 users chCodingVec = {'BCC', 'LDPC', 'LDPC', 'BCC'}; % Channel coding for 4 users % Channel and receiver parameters chanMdl = 'Model-A'; % TGac fading channel model precodingType = 'ZF'; % Precoding type; ZF or MMSE snr = 38; % SNR in dB eqMethod = 'ZF'; % Equalization method % Create the multi-user VHT format configuration object, appropriately % indexing into the vector values for the active users if (numUsers==1) groupID = 0; else groupID = 2; end numSTSVec = numSTSAll(1:numUsers); numTx = sum(numSTSVec); cfgVHTMU = wlanVHTConfig('ChannelBandwidth', chanBW,... 'NumUsers', numUsers, ... 'NumTransmitAntennas', numTx, ... 'GroupID', groupID, ... 'NumSpaceTimeStreams', numSTSVec,... 'UserPositions', userPos(1:numUsers), ... 'MCS', mcsVec(1:numUsers), ... 'APEPLength', apepVec(1:numUsers), ... 'ChannelCoding', chCodingVec(1:numUsers));
Номер антенн передачи определяется, чтобы быть суммарным итогом всех используемых пространственно-временных потоков. Это не подразумевает пространственно-временного блочного кодирования (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);
Многопользовательский канал TGac состоит из независимых однопользовательских каналов MIMO между точкой доступа и пространственно разделенными станциями [4]. В этом примере тот же канал Модели-A профиля задержки применяется для каждого из пользователей, даже при том, что отдельные пользователи могут испытать различные условия. Плоско исчезающий канал позволяет более простой получатель без синхронизации фронтенда. Это также принято, что количество каждого пользователя получает антенны, равны количеству пространственно-временных потоков, выделенных им.
Массивы ячеек используются в примере, чтобы сохранить элементы в расчете на пользователя, которые допускают гибкое количество пользователей. Здесь, как пример, каждый экземпляр канала TGac на пользователя хранится как элемент массива ячеек.
% Create three independent channels TGAC = cell(numUsers, 1); chanSeeds = [1111 2222 3333 4444]; % chosen for a maximum of 4 users uIndex = [10 5 2 1]; % chosen for a maximum of 4 users chanDelay = zeros(numUsers, 1); for uIdx = 1:numUsers TGAC{uIdx} = wlanTGacChannel(... 'ChannelBandwidth', cfgVHTMU.ChannelBandwidth,... 'DelayProfile', chanMdl, ... 'UserIndex', uIndex(uIdx), ... 'NumTransmitAntennas', numTx, ... 'NumReceiveAntennas', numSTSVec(uIdx), ... 'RandomStream', 'mt19937ar with seed', ... 'Seed', chanSeeds(uIdx),... 'SampleRate', wlanSampleRate(cfgVHTMU), ... 'TransmitReceiveDistance',5); chanInfo = info(TGAC{uIdx}); chanDelay(uIdx) = chanInfo.ChannelFilterDelay; end
Каналы для каждого отдельного пользователя используют различные seed для генерации случайных чисел. Различный пользовательский индекс задан, чтобы позволить, чтобы случайные угловые смещения были применены к прибытию (AoA) и отъезду (AoD) углы для кластеров. Задержка фильтрации канала хранится, чтобы допускать ее компенсацию в получателе. На практике оценка синхронизации символа использовалась бы.
% Append zeroes to allow for channel filter delay txNDPSig = [txNDPSig; zeros(10, numTx)]; % Sound the independent channels per user for all transmit streams rxNDPSig = cell(numUsers, 1); for uIdx = 1:numUsers rxNDPChan = TGAC{uIdx}(txNDPSig); % Add WGN per receiver rxNDPSig{uIdx} = awgn(rxNDPChan, snr); end
Каждый пользователь оценивает, что его собственный канал с помощью полученного 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 подход избегает шумового улучшения, свойственного от обеспечивающего нуль метода. В результате это выполняет лучше в низком SNRs.
% 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
, с держащейся матрицей, данные передаются по исчезающему каналу.
% Generate the multi-user VHT waveform txSig = wlanWaveformGenerator(psduDataBits, cfgVHTMU); % Transmit through per-user fading channel rxSig = cell(numUsers, 1); for uIdx = 1:numUsers % Append zeroes to allow for channel filter delay rxSig{uIdx} = TGAC{uIdx}([txSig; zeros(10, numTx)]); end
Получить сигналы для каждого пользователя обрабатываются индивидуально. Пример принимает, что нет никаких нарушений фронтенда и что настройка передачи известна получателем для простоты.
Код пользователя задает пользователя интереса, декодируемого для передачи. Это также используется, чтобы индексировать в векторные свойства объекта настройки, которые специфичны для пользователя.
% Configure recovery object cfgRec = wlanRecoveryConfig( ... 'EqualizationMethod', eqMethod, 'PilotPhaseTracking', 'None'); % 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 % Add WGN per receiver rxNSig = awgn(rxSig{uIdx}, snr); rxNSig = rxNSig(chanDelay(uIdx)+1:end, :); % User space-time streams stsU = numSTSVec(uIdx); % 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); % Get single stream channel estimate chanEstSSPilots = vhtSingleStreamChannelEstimate(demodVHTLTF,cfgVHTMU); % Extract VHT Data samples from the waveform rxVHTData = rxNSig(ind.VHTData(1):ind.VHTData(2),:); % Estimate the noise power in VHT data field nVar = vhtNoiseEstimate(rxVHTData,chanEstSSPilots,cfgVHTMU); % Recover information bits in VHT Data field [rxDataBits{uIdx}, ~, eqsym] = wlanVHTDataRecover(rxVHTData, ... chanEst, nVar, cfgVHTMU, uIdx, cfgRec); % 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.00013228 Bit Error Rate for User 2: 0 Bit Error Rate for User 3: 0
Небольшое количество битовых ошибок, в шумовом отклонении, указывает на успешное декодирование данных для всех потоков для каждого пользователя, несмотря на изменение в EVMs, замеченном в отдельных потоках.
Пример показывает многопользовательскую настройку передачи, независимое моделирование канала в расчете на пользователя, и человек получает обработку с помощью методов инверсии канала перед кодированием.
Дальнейшее исследование включает модификации в передачу и параметры канала, альтернативные методы перед кодированием, более реалистические получатели и задержки слияния механизма обратной связи и квантование.
Функция получателя vhtSingleUserRxSigRec.m, который использует полевое восстановление преамбулы, чтобы определить переданную настройку, обеспечивается. Эта функция принимает знание только пропускной способности канала и формата передачи и восстанавливает другие параметры передачи с сигнальных полей пакета VHT.
Этот пример использует следующие функции помощника:
Станд. IEEE 802.11ac™-2013 Стандарт IEEE для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Спецификации - Поправка 4: Улучшения для Очень Высокой Пропускной способности для Операции в Полосах ниже 6 ГГц.
Perahia, E., Р. Стейси, "беспроводная связь следующего поколения LANS: 802.11n и 802.11ac", издательство Кембриджского университета, 2013.
Станд. IEEE 802.11™-2012 Стандарт IEEE для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Спецификации.
Breit, G., Х. Сэмпэт, С. Вермани, и др., "Приложение Модели Канала TGac", Версия 12. IEEE 802.11-09/0308r12, март 2010.