Этот пример показывает, как смоделировать систему «точка-точка» MIMO-OFDM с формированием луча. Комбинация нескольких-входов-нескольких-выходов (MIMO) и ортогонального частотного деления мультиплексирования (OFDM) методов была принята в недавних беспроводных стандартах, таких как семейства 802.11x, для обеспечения более высокой скорости передачи данных. Поскольку MIMO использует антенные решетки, формирование луча может быть принято, чтобы улучшить отношение принимаемого сигнала к шуму (ОСШ), которое, в свою очередь, уменьшает вероятность битовой ошибки (BER).
Этот пример требует Communications Toolbox™.
Термин MIMO используется для описания системы, в которой присутствуют несколько передатчиков или несколько приемников. На практике система может принимать много различных форм, таких как один вход -multiple-output (SIMO) или несколько вход-single выход (MISO) система. Этот пример иллюстрирует нисходящую систему MISO. ULA с 8 элементами развертывается в базовой станции в качестве передатчика, в то время как мобильный модуль является приемником с одной антенной.
Остальная часть системы сконфигурирована следующим образом. Степень передатчика составляет 8 Вт, и коэффициент усиления передачи составляет -8 дБ. Мобильный приемник является стационарным и расположен в 2750 метрах, и находится на 3 степенях от boresight передатчика. Интерферентор с степенью 1 ватт и усилением -20 дБ расположен на 9000 метрах, в 20 степени от границы передатчика.
% Initialize system constants rng(2014); gc = helperGetDesignSpecsParameters(); % Tunable parameters tp.txPower = 9; % watt tp.txGain = -8; % dB tp.mobileRange = 2750; % m tp.mobileAngle = 3; % degrees tp.interfPower = 1; % watt tp.interfGain = -20; % dB tp.interfRange = 9000; % m tp.interfAngle = 20; % degrees tp.numTXElements = 8; tp.steeringAngle = 0; % degrees tp.rxGain = 108.8320 - tp.txGain; % dB numTx= tp.numTXElements;
Вся сцена может быть изображена на рисунке ниже.
helperPlotMIMOEnvironment(gc, tp);
Сначала сконфигурируйте системный передатчик.
[encoder,scrambler,modulatorOFDM,steeringvec,transmitter,...
radiator,pilots,numDataSymbols,frmSz] = helperMIMOTxSetup(gc,tp);
В подсистеме передатчика есть много компонентов, таких как сверточный энкодер, скремблер, модулятор QAM, модулятор OFDM и так далее. Сообщение сначала преобразуется в информационный битовый поток, а затем проходит через кодирование источника и этапы модуляции, чтобы подготовиться к излучению.
txBits = randi([0, 1], frmSz,1); coded = encoder(txBits); bitsS = scrambler(coded); tx = qammod(bitsS,gc.modMode,'InputType','bit','UnitAveragePower',true);
В системе OFDM данные передаются несколькими поднесущими, которые ортогональны друг другу.
ofdm1 = reshape(tx, gc.numCarriers,numDataSymbols);
Затем поток данных дублируется во все излучающие элементы передающего массива
ofdmData = repmat(ofdm1,[1, 1, numTx]); txOFDM = modulatorOFDM(ofdmData, pilots); %scale txOFDM = txOFDM * ... (gc.FFTLength/sqrt(gc.FFTLength-sum(gc.NumGuardBandCarriers)-1)); % Amplify to achieve peak TX power for each channel for n = 1:numTx txOFDM(:,n) = transmitter(txOFDM(:,n)); end
В системе MIMO также возможно разделение многого пользователя пространственного мультиплексирования с делением каналов (SDMA). В этих ситуациях поток данных часто модулируется весом, соответствующим желаемому направлению, так что после излучения сигнал максимизируется в этом направлении. Поскольку в канале MIMO сигнал, излучаемый от различных элементов в массиве, может проходить через различные окружения распространения, сигнал, излучаемый от каждой антенны, должен распространяться индивидуально. Это может быть достигнуто путем установки значения false в CombineRadiedSignals на фазе. Компонент излучателя.
radiator.CombineRadiatedSignals = false;
Для достижения предварительного кодирования поток данных, излучаемый от каждой антенны в массиве, модулируется сдвигом фазы, соответствующим ее направлению излучения. Цель этого предварительного кодирования состоит в том, чтобы убедиться, что эти потоки данных складываются по фазе, если массив направлен в это направление. Предварительное кодирование может быть задано как веса, используемые в излучателе.
wR = steeringvec(gc.fc,[-tp.mobileAngle;0]);
Между тем массив также направляется к заданному углу поворота, поэтому суммарные веса являются комбинацией как предварительного кодирования, так и весов поворота.
wT = steeringvec(gc.fc,[tp.steeringAngle;0]); weight = wT.* wR;
Таким образом, переданный сигнал задается как
txOFDM = radiator(txOFDM,repmat([tp.mobileAngle;0],1,numTx),conj(weight));
Обратите внимание, что переданный сигнал txOFDM является матрицей, столбцы которой представляют потоки данных, излучаемые соответствующими элементами в передающем массиве.
Затем сигнал распространяется через канал MIMO. В целом, существуют два эффекта распространения на интенсивность принимаемого сигнала, которые представляют интерес: один из них - потери расширения из-за расстояния распространения, часто называемые потерями при распространении в свободном пространстве; а другой - затухание из-за многолучевого распространения. Этот пример моделирует оба эффекта.
[channel,interferenceTransmitter,toRxAng,spLoss] = ...
helperMIMOEnvSetup(gc,tp);
[sigFade, chPathG] = channel(txOFDM);
sigLoss = sigFade/sqrt(db2pow(spLoss(1)));
Чтобы симулировать более реалистичное окружение, в следующий раздел также вставляется источник помех. Обратите внимание, что в системе радиосвязи помехи часто являются другими мобильными пользователями.
% Generate interference and apply gain and propagation loss numBits = size(sigFade,1); interfSymbols = wgn(numBits,1,1,'linear','complex'); interfSymbols = interferenceTransmitter(interfSymbols); interfLoss = interfSymbols/sqrt(db2pow(spLoss(2)));
Приемная антенна собирает как распространенный сигнал, так и помехи и передает их в приемник, чтобы восстановить исходную информацию, встроенную в сигнал. Так же, как передающий конец системы, приемник, используемый в системе MIMO-OFDM, также содержит много этапов, включая демодулятор OFDM, демодулятор QAM, дескремблер, эквалайзер и декодер Viterbi.
[collector,receiver,demodulatorOFDM,descrambler,decoder] = ... helperMIMORxSetup(gc,tp,numDataSymbols); rxSig = collector([sigLoss interfLoss],toRxAng); % Front-end amplifier gain and thermal noise rxSig = receiver(rxSig); rxOFDM = rxSig * ... (sqrt(gc.FFTLength-sum(gc.NumGuardBandCarriers)-1)) / (gc.FFTLength); % OFDM Demodulation rxOFDM = demodulatorOFDM(rxOFDM); % Channel estimation hD = helperIdealChannelEstimation(gc, numDataSymbols, chPathG); % Equalization rxEq = helperEqualizer(rxOFDM, hD, numTx); % Collapse OFDM matrix rxSymbs = rxEq(:); rxBitsS = qamdemod(rxSymbs,gc.modMode,'UnitAveragePower',true,... 'OutputType','bit'); rxCoded = descrambler(rxBitsS); rxDeCoded = decoder(rxCoded); rxBits = rxDeCoded(1:frmSz);
Сравнение декодированного выхода с исходным потоком сообщений предполагает, что полученный BER является слишком высоким для системы связи. Схема созвездия также показана ниже
ber = comm.ErrorRate; measures = ber(txBits, rxBits); fprintf('BER = %.2f%%; No. of Bits = %d; No. of errors = %d\n', ... measures(1)*100,measures(3), measures(2));
BER = 32.07%; No. of Bits = 30714; No. of errors = 9850
constdiag = comm.ConstellationDiagram('SamplesPerSymbol', 1,... 'ReferenceConstellation', [], 'ColorFading',true,... 'Position', gc.constPlotPosition); % Display received constellation constdiag(rxSymbs);
Высокий BER в основном обусловлен тем, что мобильный телефон находится вне направления управления массива базовых станций. Если мобильный телефон выровнен по направлению рулевого управления, BER значительно улучшается.
tp.steeringAngle = tp.mobileAngle; % Steer the transmitter main lobe wT = steeringvec(gc.fc,[tp.steeringAngle;0]); [txBits, rxBits,rxSymbs] = helperRerunMIMOBeamformingExample(gc,tp,wT); reset(ber); measures = ber(txBits, rxBits); fprintf('BER = %.2f%%; No. of Bits = %d; No. of errors = %d\n', ... measures(1)*100,measures(3), measures(2));
BER = 0.02%; No. of Bits = 30714; No. of errors = 5
constdiag(rxSymbs);
Поэтому система очень чувствительна к ошибке управления. С другой стороны, именно этот вид пространственной чувствительности делает SDMA возможным различать многих пользователей в пространстве.
Обсуждение пока предполагает, что пучок может быть направлен в точном желаемом направлении. Однако в действительности это часто не соответствует действительности, особенно когда используются аналоговые фазы. Аналоговые фазы имеют только ограниченную точность и классифицируются по количеству бит, используемых в фазовых сдвигах. Для примера 3-битный переключатель фазы может представлять только 8 различных углов в пределах 360 степеней. Таким образом, если такое квантование включено в симуляцию, производительность системы ухудшается, что можно наблюдать из графика созвездия.
% analog phase shifter with quantization effect release(steeringvec); steeringvec.NumPhaseShifterBits = 4; wTq = steeringvec(gc.fc,[tp.steeringAngle;0]); [txBits, rxBits,rxSymbs] = helperRerunMIMOBeamformingExample(gc,tp,wTq); reset(ber); measures = ber(txBits, rxBits); fprintf('BER = %.2f%%; No. of Bits = %d; No. of errors = %d\n', ... measures(1)*100,measures(3), measures(2)); constdiag = comm.ConstellationDiagram('SamplesPerSymbol', 1,... 'ReferenceConstellation', [], 'ColorFading',true,... 'Position', gc.constPlotPosition); constdiag(rxSymbs);
BER = 0.02%; No. of Bits = 30714; No. of errors = 7
Этот пример показывает уровень системы симуляции двухточечной системы MIMO-OFDM, использующей формирование луча. Симуляция моделирует многие компоненты системы, такие как кодирование, формирование передающего луча, предварительное кодирование, многолучевое замирание, оценка канала, эквализация и декодирование.
[1] Хауман Зарринкуб, Понимание LTE с MATLAB, Уайли, 2014
[2] Theodore S. Rappaport et al. Millimeter Wave Wireless Communications, Prentice Hall, 2014