OFDM с симуляцией MIMO

В этом примере показано, как использовать модулятор OFDM и демодулятор в простом, 2x2 симуляция коэффициента ошибок MIMO. Параметры OFDM на основе 802.11n стандарт.

Создайте модулятор QPSK и пару демодулятора.

qpskMod = comm.QPSKModulator;
qpskDemod = comm.QPSKDemodulator;

Создайте модулятор OFDM и пару демодулятора с заданными пользователями экспериментальными индексами, вставленным пустым указателем DC, две передающих антенны, и два получают антенны. Задайте экспериментальные индексы, которые варьируются через антенны.

ofdmMod = comm.OFDMModulator('FFTLength',128, ...
    'PilotInputPort',true, ...
    'PilotCarrierIndices', ...
    cat(3,[12; 40; 54; 76; 90; 118],[13; 39; 55; 75; 91; 117]), ...
    'InsertDCNull',true, ...
    'NumTransmitAntennas',2);
ofdmDemod = comm.OFDMDemodulator(ofdmMod);
ofdmDemod.NumReceiveAntennas = 2;

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

showResourceMapping(ofdmMod)

Figure OFDM Subcarrier Mapping for Tx Antenna 1 contains an axes object. The axes object with title OFDM Subcarrier Mapping for Tx Antenna 1 contains an object of type image.

Figure OFDM Subcarrier Mapping for Tx Antenna 2 contains an axes object. The axes object with title OFDM Subcarrier Mapping for Tx Antenna 2 contains an object of type image.

Определите размерности модулятора OFDM при помощи info метод.

ofdmModDim = info(ofdmMod);

numData = ofdmModDim.DataInputSize(1);   % Number of data subcarriers
numSym = ofdmModDim.DataInputSize(2);    % Number of OFDM symbols
numTxAnt = ofdmModDim.DataInputSize(3);  % Number of transmit antennas

Сгенерируйте символы данных, чтобы заполнить 100 систем координат OFDM.

nframes = 100;
data = randi([0 3],nframes*numData,numSym,numTxAnt);

Примените модуляцию QPSK к случайным символам и измените получившийся вектор-столбец, чтобы совпадать с требованиями модулятора OFDM.

modData = qpskMod(data(:));
modData = reshape(modData,nframes*numData,numSym,numTxAnt);

Создайте счетчик коэффициента ошибок.

errorRate = comm.ErrorRate;

Симулируйте систему OFDM более чем 100 систем координат, принимающих плоское, 2x2, Канал с релеевским замиранием. Удалите эффекты многопутевого исчезновения с помощью простого, решения методом наименьших квадратов, и демодулируйте форму волны OFDM и данные о QPSK. Сгенерируйте статистику ошибок путем сравнения исходных данных с демодулируемыми данными.

for k = 1:nframes

    % Find row indices for kth OFDM frame
    indData = (k-1)*ofdmModDim.DataInputSize(1)+1:k*numData;

    % Generate random OFDM pilot symbols
    pilotData = complex(rand(ofdmModDim.PilotInputSize), ...
        rand(ofdmModDim.PilotInputSize));

    % Modulate QPSK symbols using OFDM
    dataOFDM = ofdmMod(modData(indData,:,:),pilotData);

    % Create flat, i.i.d., Rayleigh fading channel 2-by-2 channel
    chGain = complex(randn(2,2),randn(2,2))/sqrt(2); 

    % Pass OFDM signal through Rayleigh and AWGN channels
    receivedSignal = awgn(dataOFDM*chGain,30);

    % Apply least squares solution to remove effects of fading channel
    rxSigMF = chGain.' \ receivedSignal.';

    % Demodulate OFDM data
    receivedOFDMData = ofdmDemod(rxSigMF.');

    % Demodulate QPSK data
    receivedData = qpskDemod(receivedOFDMData(:));

    % Compute error statistics
    dataTmp = data(indData,:,:);
    errors = errorRate(dataTmp(:),receivedData);
end

Отобразите статистику ошибок.

fprintf('\nSymbol error rate = %d from %d errors in %d symbols\n',errors)
Symbol error rate = 9.471154e-02 from 1970 errors in 20800 symbols