В этом примере показано, как смоделировать систему MIMO-OFDM "точка-точка" с beamforming. Комбинация методов нескольких вводят несколько выходов (MIMO) и ортогонального мультиплексирования деления частоты (OFDM) была принята в недавних беспроводных стандартах, такой как 802.11x семейства, чтобы обеспечить более высокую скорость передачи данных. Поскольку MIMO использует антенные решетки, beamforming может быть принят, чтобы улучшить полученный сигнал до шумового отношения (ОСШ), который в свою очередь уменьшает частоту ошибок по битам (BER).
Этот пример требует Communications Toolbox™.
Термин MIMO используется, чтобы описать систему, где несколько передатчиков или несколько приемников присутствуют. На практике система может принять много различных форм, таких как система нескольких вводят один выход (MISO) или один вход несколько выходов (SIMO). Этот пример иллюстрирует нисходящую систему MISO. ULA с 8 элементами развертывается в базовой станции как передатчик, в то время как мобильный модуль является приемником с одной антенной.
Остальная часть системы сконфигурирована можно следующим образом. Степень передатчика составляет 8 ватт, и усиление передачи составляет-8 дБ. Мобильный приемник является стационарным и расположен в на расстоянии в 2 750 метрах и является 3 градусами от опорного направления передатчика. interferer со степенью 1 ватта и усилением-20 дБ расположен на уровне 9 000 метров, 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, сигнал, излученный от различных элементов в массиве, может пройти различные среды распространения, сигнал, излученный от каждой антенны, должен быть распространен индивидуально. Это может быть достигнуто установкой CombineRadiatedSignals ко лжи на phased.Radiator компоненте.
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, дескремблер, эквалайзер и Декодер Витерби.
[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 "точка-точка", использующей beamforming. Имитационные модели много компонентов системы, таких как кодирование, передайте beamforming, предварительное кодирование, многопутевое исчезновение, оценку канала, эквализацию и декодирование.
[1] Хоумен Зарринкуб, изучая LTE с MATLAB, Вайли, 2014
[2] Теодор С. Рэппэпорт и др. Радиосвязи Волны Миллиметра, Prentice Hall, 2014