Main Content

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

フェーズド アレイによる MIMO-OFDM のプリコーディング

この例では、ビームフォーミングを使用する MIMO-OFDM 通信システムでフェーズド アレイがどのように使用されているかを示します。Communications Toolbox™ および Phased Array System Toolbox™ のコンポーネントを使用して、MIMO-OFDM 通信システム用に、送信機コンポーネントとフロントエンド受信機コンポーネントを構成する放射素子をモデル化します。ユーザー指定のパラメーターを使用して、異なる空間的な位置と配列サイズのビット エラー レートとコンスタレーションの観点から、システムのパフォーマンスを検証できます。

この例では、Communications Toolbox および Phased Array System Toolbox の関数と System objects™ を使用し、以下を必要とします。

  • WINNER II Channel Model for Communications Toolbox

はじめに

MIMO-OFDM システムは、周波数選択性チャネルのロバスト性と高いデータ転送速度に対応しているため、現在の無線システム (5G NR、LTE、WLAN など) の基準となっています。サポートされるデータ転送速度への絶え間なく増大する需要により、アンテナ素子の数や割り当てられるリソース (サブキャリア) も増え、これらのシステムの構成はより複雑で大規模になっています。

アンテナ アレイと空間多重化では、送信を実現するための効率的な手法が必要です [ 6 ]。ビームフォーミングはこのような手法の 1 つで、ここではビット エラー レート (BER) の観点で測定される、システム パフォーマンスを最終的に向上する S/N 比 (SNR) を改善するために使用されます [ 1 ]。

この例では、送信側および受信側のアンテナ素子の最大数をそれぞれ 1024 と 32 にできる (最大 16 の独立データ ストリーム) 非対称 MIMO-OFDM 単一ユーザー システムを示します。これはアレイの位置とアンテナ パターンがシステム全体の設計に組み込まれた空間チャネルをモデル化します。簡略化のため、単一のポイントツーポイント リンク (1 つの基地局が 1 人のモバイル ユーザーと通信する) がモデル化されています。リンクはチャネル サウンディングを使用して、送信機にビームフォーミングに必要なチャネル情報を提供します。

この例では、空間的に定義されたいくつかのチャネル モデルの選択肢を提供しています。具体的には、WINNER II チャネル モデルと散乱ベースのモデルです。どちらも送信/受信の空間的な位置とアンテナ パターンを考慮します。

s = rng(61);        % Set RNG state for repeatability

システム パラメーター

システムのパラメーターを定義します。これらのパラメーターを変更することで、システムへの影響を調べることができます。

% Single-user system with multiple streams
prm.numUsers = 1;            % Number of users
prm.numSTS = 16;             % Number of independent data streams, 4/8/16/32/64
prm.numTx = 32;              % Number of transmit antennas
prm.numRx = 16;              % Number of receive antennas
prm.bitsPerSubCarrier = 6;   % 2: QPSK, 4: 16QAM, 6: 64QAM, 8: 256QAM
prm.numDataSymbols = 10;     % Number of OFDM data symbols

prm.fc = 4e9;                   % 4 GHz system
prm.chanSRate = 100e6;          % Channel sampling rate, 100 Msps
prm.ChanType = 'Scattering';    % Channel options: 'WINNER', 'Scattering',
                                %           'ScatteringFcn', 'StaticFlat'
prm.NFig = 5;                   % Noise figure, dB

% Array locations and angles
prm.posTx = [0;0;0];            % BS/Transmit array position, [x;y;z], meters
prm.mobileRange = 300;          % meters
% Angles specified as [azimuth;elevation], az=[-90 90], el=[-90 90]
prm.mobileAngle = [33; 0];      % degrees
prm.steeringAngle = [30; -20];  % Transmit steering angle (close to mobileAngle)
prm.enSteering = true;          % Enable/disable steering

システムに使用される OFDM 変調を定義するパラメーターは、以下で指定されます。

prm.FFTLength = 256;
prm.CyclicPrefixLength = 64;
prm.numCarriers = 234;
prm.NumGuardBandCarriers = [7 6];
prm.PilotCarrierIndices = [26 54 90 118 140 168 204 232];
nonDataIdx = [(1:prm.NumGuardBandCarriers(1))'; prm.FFTLength/2+1; ...
              (prm.FFTLength-prm.NumGuardBandCarriers(2)+1:prm.FFTLength)'; ...
              prm.PilotCarrierIndices.';];
prm.CarriersLocations = setdiff((1:prm.FFTLength)',sort(nonDataIdx));

numTx = prm.numTx;
numRx = prm.numRx;
numSTS = prm.numSTS;
prm.numFrmBits = numSTS*prm.numDataSymbols*prm.numCarriers* ...
                 prm.bitsPerSubCarrier*1/3-6; % Account for termination bits

prm.modMode = 2^prm.bitsPerSubCarrier; % Modulation order
% Account for channel filter delay
prm.numPadZeros = 3*(prm.FFTLength+prm.CyclicPrefixLength);

% Get transmit and receive array information
prm.numSTSVec = numSTS;
[isTxURA,expFactorTx,isRxURA,expFactorRx] = helperArrayInfo(prm,true);

例でモデル化されているチャネル サウンディング、およびデータの送信と受信の処理を、次のブロック線図で示します。

モデル化された空間を考慮したシステムの基地局と移動局の位置に基づいて自由空間パス損失が計算されます。

prm.cLight = physconst('LightSpeed');
prm.lambda = prm.cLight/prm.fc;
% Mobile position
[xRx,yRx,zRx] = sph2cart(deg2rad(prm.mobileAngle(1)),...
                         deg2rad(prm.mobileAngle(2)),prm.mobileRange);
prm.posRx = [xRx;yRx;zRx];
[toRxRange,toRxAng] = rangeangle(prm.posTx,prm.posRx);
spLoss = fspl(toRxRange,prm.lambda);
gainFactor = 1;

チャネル サウンディング

空間的に多重化されたシステムの場合、送信機でのチャネル情報を利用できることで、対象の方向とチャネルにおける信号エネルギーを最大化するためのプリコーディングの適用が可能になります。チャネルがゆっくりと変動するという前提では、これはチャネルを最初にサウンディングすることで円滑化されます。ここでは、基準送信のため、受信機がチャネルを推定し、この情報を送信機にフィードバックします。

選択したシステムの場合、プリアンブル信号がすべての送信アンテナ素子全体から送信され、チャネルを調整する受信機で処理されます。受信機コンポーネントは、データ サブキャリアごとの特異値分解 (SVD) を使用して、チャネル対角化に基づいて、事前増幅、OFDM 復調、周波数領域チャネル推定、およびフィードバックの重みの計算を実行します。

% Generate the preamble signal
preambleSigSTS = helperGenPreamble(prm);
%   repeat over numTx
preambleSig = zeros(size(preambleSigSTS,1),numTx);
for i = 1:numSTS
    preambleSig(:,(i-1)*expFactorTx+(1:expFactorTx)) = ...
        repmat(preambleSigSTS(:,i),1,expFactorTx);
end

% Transmit preamble over channel
[rxPreSig,chanDelay] = helperApplyChannel(preambleSig,prm,spLoss);

% Front-end amplifier gain and thermal noise
rxPreAmp = phased.ReceiverPreamp( ...
    'Gain',gainFactor*spLoss, ... % account for path loss
    'NoiseFigure',prm.NFig, ...
    'ReferenceTemperature',290, ...
    'SampleRate',prm.chanSRate);
rxPreSigAmp = rxPreAmp(rxPreSig);
rxPreSigAmp = rxPreSigAmp * ...         % scale power
    (sqrt(prm.FFTLength-sum(prm.NumGuardBandCarriers)-1)/(prm.FFTLength));

% OFDM Demodulation
demodulatorOFDM = comm.OFDMDemodulator( ...
     'FFTLength',prm.FFTLength, ...
     'NumGuardBandCarriers',prm.NumGuardBandCarriers.', ...
     'RemoveDCCarrier',true, ...
     'PilotOutputPort',true, ...
     'PilotCarrierIndices',prm.PilotCarrierIndices.', ...
     'CyclicPrefixLength',prm.CyclicPrefixLength, ...
     'NumSymbols',numSTS, ... % preamble symbols alone
     'NumReceiveAntennas',numRx);

rxOFDM = demodulatorOFDM( ...
    rxPreSigAmp(chanDelay+1:end-(prm.numPadZeros-chanDelay),:));

% Channel estimation from preamble
%       numCarr, numSTS, numRx
hD = helperMIMOChannelEstimate(rxOFDM(:,1:numSTS,:),prm);

% Calculate the feedback weights
v = diagbfweights(hD);

プレゼンテーションを簡潔にするため、搬送波再生とタイミング再生を含むフロントエンドの同期が仮定されています。そのため、diagbfweights を使用して計算された重みは、この後の実際のデータ送信に適用するため、送信機にフィードバックされます。

データ送信

次に、システムのデータの送信機を構成します。この処理には、チャネル符号化、複素シンボルへのビット マッピング、個別のデータ ストリームの複数の送信ストリームへの分割、送信ストリームのプリコーディング、パイロット マッピングによる OFDM 変調、および使用されている送信アンテナの複製が含まれます。

% Convolutional encoder
encoder = comm.ConvolutionalEncoder( ...
    'TrellisStructure',poly2trellis(7,[133 171 165]), ...
    'TerminationMethod','Terminated');

% Generate mapped symbols from bits
txBits = randi([0, 1],prm.numFrmBits,1);
encodedBits = encoder(txBits);

% Bits to QAM symbol mapping
mappedSym = qammod(encodedBits,prm.modMode,'InputType','Bit', ...
    'UnitAveragePower',true);

% Map to layers: per symbol, per data stream
gridData = reshape(mappedSym,prm.numCarriers,prm.numDataSymbols,numSTS);

% Apply precoding weights to the subcarriers, assuming perfect feedback
preData = complex(zeros(prm.numCarriers,prm.numDataSymbols,numSTS));
for symIdx = 1:prm.numDataSymbols
    for carrIdx = 1:prm.numCarriers
        Q = squeeze(v(carrIdx,:,:));
        normQ = Q * sqrt(numTx)/norm(Q,'fro');
        preData(carrIdx,symIdx,:) = ...
            squeeze(gridData(carrIdx,symIdx,:)).' * normQ;
    end
end

% OFDM modulation of the data
modulatorOFDM = comm.OFDMModulator( ...
    'FFTLength',prm.FFTLength,...
    'NumGuardBandCarriers',prm.NumGuardBandCarriers.',...
    'InsertDCNull',true, ...
    'PilotInputPort',true,...
    'PilotCarrierIndices',prm.PilotCarrierIndices.',...
    'CyclicPrefixLength',prm.CyclicPrefixLength,...
    'NumSymbols',prm.numDataSymbols,...
    'NumTransmitAntennas',numSTS);

% Multi-antenna pilots
pilots = helperGenPilots(prm.numDataSymbols,numSTS);

txOFDM = modulatorOFDM(preData,pilots);
txOFDM = txOFDM * (prm.FFTLength/ ...
    sqrt(prm.FFTLength-sum(prm.NumGuardBandCarriers)-1)); % scale power

% Generate preamble with the feedback weights and prepend to data
preambleSigD = helperGenPreamble(prm,v);
txSigSTS = [preambleSigD;txOFDM];

% Repeat over numTx
txSig = zeros(size(txSigSTS,1),numTx);
for i = 1:numSTS
    txSig(:,(i-1)*expFactorTx+(1:expFactorTx)) = ...
        repmat(txSigSTS(:,i),1,expFactorTx);
end

プリコーディングでは、プリアンブル信号が再生成され、チャネル推定を可能にします。これがデータ部分の最初に付加され、この後送信アンテナ経由で複製される送信パケットが構成されます。

ビーム ステアリングの送信

Phased Array System Toolbox は、無線通信システムで使用されるフェーズド アレイの設計とシミュレーションに適したコンポーネントを提供します。

空間を考慮したシステムでは、基地局から送信された信号は、放射されたエネルギーを希望の方向に集中させるため、移動局の方向にステアリングされます。これは位相シフトを各アンテナ素子に適用して送信をステアリングすることで実行できます。

例では、データ ストリーム数および選択した送信アンテナの数に応じて、送信側で直線アレイまたは方形アレイを使用します。

% Gain per antenna element
amplifier = phased.Transmitter('PeakPower',1/numTx,'Gain',0);

% Amplify to achieve peak transmit power for each element
for n = 1:numTx
    txSig(:,n) = amplifier(txSig(:,n));
end

% Transmit antenna array definition
if isTxURA
    % Uniform Rectangular array
    arrayTx = phased.URA([expFactorTx,numSTS],[0.5 0.5]*prm.lambda, ...
        'Element',phased.IsotropicAntennaElement('BackBaffled',true));
else
    % Uniform Linear array
    arrayTx = phased.ULA(numTx, ...
        'ElementSpacing',0.5*prm.lambda, ...
        'Element',phased.IsotropicAntennaElement('BackBaffled',true));
end

% For evaluating weights for steering
SteerVecTx = phased.SteeringVector('SensorArray',arrayTx, ...
    'PropagationSpeed',prm.cLight);

% Generate weights for steered direction
wT = SteerVecTx(prm.fc,prm.steeringAngle);

% Radiate along the steered direction, without signal combining
radiatorTx = phased.Radiator('Sensor',arrayTx, ...
    'WeightsInputPort',true, ...
    'PropagationSpeed',prm.cLight, ...
    'OperatingFrequency',prm.fc, ...
    'CombineRadiatedSignals',false);

if prm.enSteering
    txSteerSig = radiatorTx(txSig,repmat(prm.mobileAngle,1,numTx), ...
        conj(wT));
else
    txSteerSig = txSig;
end

% Visualize the array
h = figure('Position',figposition([10 55 22 35]),'MenuBar','none');
h.Name = 'Transmit Array Geometry';
viewArray(arrayTx);

% Visualize the transmit pattern and steering
h = figure('Position',figposition([32 55 22 30]),'MenuBar','none');
h.Name = 'Transmit Array Response Pattern';
pattern(arrayTx,prm.fc,'PropagationSpeed',prm.cLight,'Weights',wT);
h = figure('Position',figposition([54 55 22 35]),'MenuBar','none');
h.Name = 'Transmit Array Azimuth Pattern';
patternAzimuth(arrayTx,prm.fc,'PropagationSpeed',prm.cLight,'Weights',wT);
if isTxURA
    h = figure('Position',figposition([76 55 22 35]),'MenuBar','none');
    h.Name = 'Transmit Array Elevation Pattern';
    patternElevation(arrayTx,prm.fc,'PropagationSpeed',prm.cLight, ...
        'Weights',wT);
end

複数のビューでのアレイのジオメトリと送信アレイの応答を、プロットで示します。応答は、ステアリング角度で指定された送信方向を示します。

例では、ステアリング角度は既知でありモバイル角度に近いと仮定しています。実際のシステムでは、これは、チャネル サウンディングまたは初期のビーム追跡手順の一部である受信側の到達角度の推定により推定されます。

信号伝播

この例では、空間 MIMO チャネルの 3 つのオプションと、評価目的用のより簡潔な静的フラット MIMO チャネルを提供します。

WINNER II チャネル モデル [ 5 ] は、アレイのジオメトリと位置の情報を指定することができる空間的に定義された MIMO チャネルです。移動体速度が非常に遅い典型的な都市マクロセル屋内シナリオを使用するように構成されています。

2 つの分布ベースのチャネルでは、各分布点を通る単一バウンス パスを使用します。分布点の数はユーザーが指定します。この例では、分布点の数は 100 に設定されています。'Scattering' オプションは送信機と受信機の間の円内にランダムに配置された分布点をモデル化し、'ScatteringFcn' はその配置を完全にランダムにモデル化します。

モデルでは、パス損失のモデル化、および見通し内 (LOS) と非 LOS の両方の伝播条件が許可されます。この例では、非 LOS 伝播と線形ジオメトリを持つ等方性アンテナ素子パターンを想定しています。

% Apply a spatially defined channel to the steered signal
[rxSig,chanDelay] = helperApplyChannel(txSteerSig,prm,spLoss,preambleSig);

サウンディングとデータ送信の両方に同じチャネルが使用されています。データ送信は、データ シンボル パラメーター prm.numDataSymbols の数で制御される期間がより長くなっています。

ビーム ステアリングの受信

受信機は、送信終了時のステアリングに合わせて、受信要素ごとに入射信号をステアリングします。熱ノイズと受信機のゲインが適用されます。等方性応答をもつ等間隔直線アレイと矩形アレイが、チャネルと送信機の配列に一致するようにモデル化されます。

rxPreAmp = phased.ReceiverPreamp( ...
    'Gain',gainFactor*spLoss, ... % accounts for path loss
    'NoiseFigure',prm.NFig, ...
    'ReferenceTemperature',290, ...
    'SampleRate',prm.chanSRate);

% Front-end amplifier gain and thermal noise
rxSigAmp = rxPreAmp(rxSig);
rxSigAmp = rxSigAmp * ...           % scale power
    (sqrt(prm.FFTLength - sum(prm.NumGuardBandCarriers)-1)/(prm.FFTLength));

% Receive array
if isRxURA
    % Uniform Rectangular array
    arrayRx = phased.URA([expFactorRx,numSTS],0.5*prm.lambda, ...
        'Element',phased.IsotropicAntennaElement('BackBaffled',true));
else
    % Uniform Linear array
    arrayRx = phased.ULA(numRx, ...
        'ElementSpacing',0.5*prm.lambda, ...
        'Element',phased.IsotropicAntennaElement);
end

% For evaluating receive-side steering weights
SteerVecRx = phased.SteeringVector('SensorArray',arrayRx, ...
    'PropagationSpeed',prm.cLight);

% Generate weights for steered direction towards mobile
wR = SteerVecRx(prm.fc,toRxAng);

% Steer along the mobile receive direction
if prm.enSteering
    rxSteerSig = rxSigAmp.*(wR');
else
    rxSteerSig = rxSigAmp;
end

% Visualize the array
h = figure('Position',figposition([10 20 22 35]),'MenuBar','none');
h.Name = 'Receive Array Geometry';
viewArray(arrayRx);

% Visualize the receive pattern and steering
h = figure('Position',figposition([32 20 22 30]));
h.Name = 'Receive Array Response Pattern';
pattern(arrayRx,prm.fc,'PropagationSpeed',prm.cLight,'Weights',wR);
h = figure('Position',figposition([54 20 22 35]),'MenuBar','none');
h.Name = 'Receive Array Azimuth Pattern';
patternAzimuth(arrayRx,prm.fc,'PropagationSpeed',prm.cLight,'Weights',wR);
if isRxURA
    figure('Position',figposition([76 20 22 35]),'MenuBar','none');
    h.Name = 'Receive Array Elevation Pattern';
    patternElevation(arrayRx,prm.fc,'PropagationSpeed',prm.cLight, ...
        'Weights',wR);
end

受信アンテナ パターンは送信ステアリングをミラーリングします。

信号再生

受信アンテナ アレイは、伝播された信号を受信機に渡し、信号に組み込まれた元の情報を復元します。送信機と同様に、MIMO-OFDM システムで使用される受信機には、OFDM 復調器、MIMO イコライザー、QAM 復調器、チャネル復号化器など、多くのコンポーネントが含まれます。

demodulatorOFDM = comm.OFDMDemodulator( ...
     'FFTLength',prm.FFTLength, ...
     'NumGuardBandCarriers',prm.NumGuardBandCarriers.', ...
     'RemoveDCCarrier',true, ...
     'PilotOutputPort',true, ...
     'PilotCarrierIndices',prm.PilotCarrierIndices.', ...
     'CyclicPrefixLength',prm.CyclicPrefixLength, ...
     'NumSymbols',numSTS+prm.numDataSymbols, ... % preamble & data
     'NumReceiveAntennas',numRx);

% OFDM Demodulation
rxOFDM = demodulatorOFDM( ...
    rxSteerSig(chanDelay+1:end-(prm.numPadZeros-chanDelay),:));

% Channel estimation from the mapped preamble
hD = helperMIMOChannelEstimate(rxOFDM(:,1:numSTS,:),prm);

% MIMO Equalization
[rxEq,CSI] = ofdmEqualize(rxOFDM(:,numSTS+1:end,:),hD);

% Soft demodulation
scFact = ((prm.FFTLength-sum(prm.NumGuardBandCarriers)-1) ...
         /prm.FFTLength^2)/numTx;
nVar = noisepow(prm.chanSRate,prm.NFig,290)/scFact;
rxSymbs = rxEq(:)/sqrt(numTx);
rxLLRBits = qamdemod(rxSymbs,prm.modMode,'UnitAveragePower',true, ...
    'OutputType','approxllr','NoiseVariance',nVar);

% Apply CSI prior to decoding
rxLLRtmp = reshape(rxLLRBits,prm.bitsPerSubCarrier,[], ...
                   prm.numDataSymbols,numSTS);
csitmp = reshape(CSI,1,[],1,numSTS);
rxScaledLLR = rxLLRtmp.*csitmp;

% Soft-input channel decoding
decoder = comm.ViterbiDecoder(...
     'InputFormat','Unquantized', ...
     'TrellisStructure',poly2trellis(7, [133 171 165]), ...
     'TerminationMethod','Terminated', ...
     'OutputDataType','double');
rxDecoded = decoder(rxScaledLLR(:));

% Decoded received bits
rxBits = rxDecoded(1:prm.numFrmBits);

モデル化された MIMO システムでは、イコライズされたシンボルの受信コンスタレーションを表示することで、受信の定性評価を提供します。実際のビット エラー レートは、実際の送信されたビットと受信および復号化されたビットを比較することで、定量的数値を提供します。

% Display received constellation
constDiag = comm.ConstellationDiagram( ...
    'SamplesPerSymbol',1, ...
    'ShowReferenceConstellation',true, ...
    'ReferenceConstellation', ...
    qammod((0:prm.modMode-1)',prm.modMode,'UnitAveragePower',true), ...
    'ColorFading',false, ...
    'Position',figposition([20 20 35 40]), ...
    'Title','Equalized Symbols', ...
    'EnableMeasurements',true, ...
    'MeasurementInterval',length(rxSymbs));
constDiag(rxSymbs);

% Compute and display bit error rate
ber = comm.ErrorRate;
measures = ber(txBits,rxBits);
fprintf('BER = %.5f; No. of Bits = %d; No. of errors = %d\n', ...
    measures(1),measures(3),measures(2));

rng(s); % Restore RNG state
BER = 0.00000; No. of Bits = 74874; No. of errors = 0

まとめとその他の調査

この例では、ビームフォーミングされた MIMO-OFDM システムのフェーズド アンテナ アレイの使用について示しています。これは単一ユーザー システムの基地局と移動局でのアレイの空間ジオメトリと位置を考慮しています。チャネル サウンディングを使用して、現在の無線システムでプリコーディングがどのように適用されるか、およびアンテナ アレイのステアリングがどのようにモデル化されるかを示しています。

構成可能なパラメーター セットの中で、データ ストリームの数、送信側/受信側のアンテナ素子、局やアレイの位置とジオメトリ、チャネル モデルとその構成を変えて、パラメーター個々のまたはパラメーターを組み合わせた場合のシステムへの影響を確認できます。例として、送信アンテナ数だけを変えて、ステアリングされたビームのメイン ローブと最終的なシステム パフォーマンスを確認します。

例では、実際のシステムではさらに考慮する必要がある、フロントエンドの同期、チャネル フィードバック、ユーザー速度、およびパス損失モデルの仮定も簡略化しています。個別のシステムにもモデリングに組み入れなければならない独自の手順があります [ 234 ]。

使用されている次の補助関数について調査します。

参考文献

  1. Perahia, Eldad, and Robert Stacey.Next Generation Wireless LANS: 802.11n and 802.11ac. Cambridge University Press, 2013.

  2. 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.

  3. 3GPP TS 36.213."Physical layer procedures."3rd Generation Partnership Project; Technical Specification Group Radio Access Network; Evolved Universal Terrestrial Radio Access (E-UTRA).URL: https://www.3gpp.org.

  4. 3GPP TS 36.101."User Equipment (UE) Radio Transmission and Reception."3rd Generation Partnership Project; Technical Specification Group Radio Access Network; Evolved Universal Terrestrial Radio Access (E-UTRA).URL: https://www.3gpp.org.

  5. Kyosti, Pekka, Juha Meinila, et al. WINNER II Channel Models.D1.1.2, V1.2.IST-4-027756 WINNER II, September 2007.

  6. George Tsoulos, Ed., "MIMO System Technology for Wireless Communications", CRC Press, Boca Raton, FL, 2006.