Предварительное кодирование MIMO-OFDM с фазированными решетками

Этот пример показывает, как фазированные решетки используются в системе связи MIMO-OFDM, использующей формирование луча. Используя компоненты из Communications Toolbox™ и Phased Array System Toolbox™, он моделирует излучающие элементы, которые состоят из передатчика, и компоненты переднего приемника для системы связи MIMO-OFDM. С помощью пользовательских параметров можно подтвердить эффективность системы с точки зрения частоты битовой ошибки и созвездий для различных пространственных местоположений и размеров массивов.

Пример использует функции и Системные objects™ из Communications Toolbox и Phased Array System Toolbox и требует

  • WINNER II Модель канала для Communications Toolbox

Введение

Системы MIMO-OFDM являются нормой в текущих беспроводных системах (например 5G NR, LTE, WLAN) из-за их робастности к частотно-избирательным каналам и высокой скорости передачи данных. С постоянно возрастающими требованиями к поддерживаемым скоростям передачи данных эти системы становятся более комплексными и большими в строениях с увеличением количества антенных элементов и ресурсов (поднесущих).

С антенными решётками и пространственным мультиплексированием необходимы эффективные методы для реализации передач [6]. Формирование луча является одним из таких методов, который используется для улучшения отношения сигнал/шум (ОСШ), которое в конечном счете улучшает производительность системы, как измерено здесь с точки зрения частоты битовой ошибки (BER) [1].

Этот пример иллюстрирует асимметричную однопользовательскую систему MIMO-OFDM, где максимальное количество антенных элементов на передающем и приемном концах может составлять 1024 и 32 соответственно с 16 независимыми потоками данных. Он моделирует пространственный канал, где местоположения массивов и шаблонов антенны включены в общую разработку системы. Для простоты моделируется одна ссылка «точка-точка» (одна базовая станция, связанная с одним мобильным пользователем). Ссылка использует зондирование канала, чтобы предоставить передатчику информацию канала, необходимую для формирования луча.

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

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;

Зондирование канала

Для пространственно мультиплексированной системы наличие информации о канале в передатчике позволяет применять предварительное кодирование, чтобы максимизировать энергию сигнала в интересующем направлении и канале. В предположении о медленно изменяющемся канале это облегчается посредством зондирования сначала канала, при этом для ссылки передачи приемник оценивает канал и передает эту информацию назад передатчику.

Для выбранной системы сигнал преамбулы посылается по всем элементам передающей антенны и обрабатывается в приемнике с учетом канала. Компоненты приемника выполняют предварительное усиление, демодуляцию OFDM, оценку канала частотного диапазона и вычисление весов обратной связи на основе диагонализации канала, используя сингулярное разложение (SVD) на поднесущую данных.

% 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 и более простой статически-плоский канал MIMO для целей оценки.

Модель канала WINNER II [5] является пространственно заданным каналом MIMO, который позволяет вам задать геометрию массива и информацию о местоположении. Он сконфигурирован, чтобы использовать типичную городскую микрокамеру в помещении с очень низкими скоростями мобильной связи.

Два канала на основе рассеяния используют один путь отскока через каждый рассеиватель, где количество рассеивателей задано пользователем. В данном примере количество рассеивателей устанавливается равным 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] = helperMIMOEqualize(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. Он учитывал пространственную геометрию и расположение массивов в базовой станции и мобильной станции для одной пользовательской системы. Используя зондирование канала, оно проиллюстрировало, как осуществляется предварительное кодирование в текущих беспроводных системах и как моделируется управление антенными решетками.

В наборе конфигурируемых параметров можно варьировать количество потоков данных, антенные элементы передачи/приема, местоположения станции или решётки и геометрию, модели канала и их строений, чтобы изучить индивидуальные или комбинированные эффекты параметров на систему. Например, варьируйте только количество передающих антенн, чтобы увидеть эффект на основной лепесток управляемого луча и результаты производительности системы.

Пример также сделал упрощающие допущения для моделей синхронизации переднего плана, обратной связи канала, скорости пользователя и потерь пути, которые должны быть дополнительно рассмотрены для практической системы. Отдельные системы также имеют свои собственные процедуры, которые должны быть сложены в моделирование [2, 3, 4].

Исследуйте следующие используемые вспомогательные функции:

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

  1. Перахия, Элдад и Роберт Стейси. Беспроводные LANS следующей генерации: 802.11n и 802.11ac. Cambridge University Press, 2013.

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

  3. 3GPP ТС 36.213. «Процедуры физического слоя». 3-ья Генерация Партнерский проект; Группа технических спецификаций Radio Доступа Network; Evolved Universal Terrestrial Radio Access (E-UTRA). URL-адрес: https://www.3gpp.org.

  4. 3GPP TS 36.101. «Пользовательское оборудование (UE) Радиопередача и прием». 3-ья Генерация Партнерский проект; Группа технических спецификаций Radio Доступа Network; Evolved Universal Terrestrial Radio Access (E-UTRA). URL-адрес: https://www.3gpp.org.

  5. Kyosti, Pekka, Juha Meinila, et al. WINNER II Модели канала. D1.1.2, V1.2. IST-4-027756 WINNER II, сентябрь 2007 года.

  6. Джордж Цулос, Ред., «MIMO System Technology for Wireless Communications», CRC Press, Boca Raton, FL, 2006.