В этом примере показано, как использовать модулятор 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 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