В этом примере показано, как использовать модулятор 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)
Определите размерности модулятора 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 chGain = complex(randn(2,2),randn(2,2))/sqrt(2); % Random 2x2 channel % 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