Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

WINNER II チャネル モデルを使用した 802.11ac マルチユーザー MIMO のプリコーディング

この例では、WINNER II フェージング チャネルを介した 802.11ac™ マルチユーザーのダウンリンク伝送の送信処理と受信処理を示します。この例を実行するには、WINNER II Channel Model for Communications Toolbox™ のアドオンをダウンロードしてインストールしなければなりません。1 つのアクセス ポイントからすべてのユーザーへのチャネルを設定するには、1 つの WINNER II チャネル System object™ のみが必要です。

はじめに

802.11ac では、リンクの総スループットを向上するため、最大 4 人のユーザーと最大 8 つの送信アンテナの (アクセス ポイントから局への) ダウンリンクのマルチユーザー送信をサポートしています [1]。ユーザーに対してスケジューリングされた送信時間に基づき、スケジューラは他のユーザーに送信するために用意されたより小さい別のパケットを検索します。可能な場合は、これらのユーザーを同じ間隔でスケジュールして、複数の送信にかかる全体の時間を短縮します。

個々のユーザーのペイロードを正常に受信するにはプリコーディング (送信から終了までのビームフォーミングとも呼ばれます) が必要なため、この同時送信はより複雑になります。プリコーディングでは、チャネル状態情報 (CSI) が送信側において既知であることを前提としています。サウンディング パケットは、802.11ac Transmit Beamforming (WLAN Toolbox)の例で説明されているように、マルチユーザー送信で各ユーザーの CSI を決定するために使用されます。各ユーザーは自身の CSI をビームフォーマーにフィードバックします。ビームフォーマーはすべてのユーザーからの CSI を使用して、以後のデータ送信用にプリコーディング (空間マッピング) の行列を設定します。

この例では、ユーザーごとに割り当てられた空間ストリームの数とユーザーごとのレート パラメーターが異なる 3 ユーザーの送信に対し、チャネル反転手法を使用します。このシステムの特徴を次の図に示します。

この例は、マルチユーザーの送信波形を生成し、それをマルチユーザーの WINNER II チャネルを介して渡し、各ユーザーの受信した信号を復号化してエラーのビット数を計算します。例では、データを送信する前に、null データ パケット (NDP) 送信を使用してユーザーごとに各種チャネルを調査し、完全なフィードバックの前提でプリコーディング行列を決定します。

サポート パッケージのインストールの確認

'WINNER II Channel Model for Communications Toolbox' サポート パッケージがインストールされているかどうか確認します。

commSupportPackageCheck('CST_WINNER2');

シミュレーションのパラメーターと構成

802.11ac では、最大 8 つの空間ストリームが許可されています。この例では、3 ユーザー向けの 8x8 MIMO 構成が使用されています。また、最初のユーザーが 3 つのストリームをもち、2 番目のユーザーが 1 つのストリーム、3 番目のユーザーが割り当てられた 4 つのストリームをもちます。ユーザーごとに異なるレート パラメーターとペイロード サイズが、送信構成のベクトル パラメーターとして指定されています。

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 つの送信機でチャネルが少しずつ変動することを想定しています。マルチユーザー送信では、同じ NDP (null データ パケット) がスケジュールされた各ユーザーに送信されます [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);

屋内オフィス (A1) シナリオの WINNER II チャネル

この例では、WINNER II Channel Model for Communications Toolbox™ の 1 つの comm.WINNER2Channel System object™ が異なるユーザーに対して 3 つのチャネルをシミュレートするように設定されています。屋内オフィス (A1) の見通し外 (NLOS) シナリオが、各ユーザーに構成されています。固定された電力遅延プロファイルを使用すると、各ユーザーは最大遅延 175 us の 16 パスのフェージング チャネルを使用します。各ユーザーには 802.11ac に適した低可動性も割り当てられます。

アクセス ポイントでは半径 20 cm の等間隔円形アレイ (UCA) を使用します。各ユーザーは、素子間に 5 cm の間隔がある等間隔直線アレイ (ULA) を使用します。また、各ユーザーの受信アンテナの数が、ユーザーに割り当てられる空間時間ストリームの合計と等しいことを前提としています。

% 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

各ユーザーのチャネル フィルター遅延は、受信機での補正のために格納されます。実際には、シンボル タイミングの推定が使用されます。送信機では、チャネル フィルターの遅延を調整するためにさらに 10 点のすべてゼロのサンプルが付加されます。

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 ベースの手法は、ゼロフォーシング手法につきもののノイズの増大を回避します。結果として、低 SNR でのパフォーマンスが向上します。

% 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]);

データ送信

ランダムなビットは、個別ユーザーのペイロードとして使用されます。各ユーザーのデータ ビットを保持するために cell 配列 txDataBits が使用されます。マルチユーザー送信では、送信時間がすべてのユーザーで同じになるように、個々のユーザー ペイロードがパディングされます。このパディング処理は [ 1 ] の第 9.12.6 節で説明しています。この例では簡略化のため、各ユーザーの 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.023803

ノイズ分散内のビット誤り数の少なさは、個別のストリームで見られる EVM での変動にもかかわらず、各ユーザーのすべてのストリームのデータの復号化が成功したことを示します。

まとめとその他の調査

この例は、WINNER II フェージング チャネル System object を使用して、802.11ac でマルチユーザー VHT 送信をモデル化する方法を示します。さらに詳しく調査する場合は、送信パラメーター、アンテナ アレイ、チャネル シナリオ、LOS と NLOS の伝播、パス損失のモデル化、およびシャドウイングのモデル化への変更を行ってください。

WLAN Toolbox™ には、3 ユーザーに 3 つの個別の TGac フェージング チャネルを使用するこの例の別バージョンがあります (802.11ac Multi-User MIMO Precoding (WLAN Toolbox))。

付録

この例では、WLAN Toolbox の次の補助関数が使用されています。

参考文献

  1. IEEE® Std 802.11ac-2013 IEEE Standard for Information technology - Telecommunications and information exchange between systems - Local and metropolitan area networks - Specific requirements - Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications - Amendment 4: Enhancements for Very High Throughput for Operation in Bands below 6 GHz.

  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 Standard for Information technology - Telecommunications and information exchange between systems - Local and metropolitan area networks - Specific requirements - Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications.

  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 Addendum", Version 12. IEEE 802.11-09/0308r12, March 2010.