Этот пример показывает, как использовать модулятор OFDM и демодулятор в простой симуляции частоты ошибок MIMO 2x2. Параметры OFDM основаны на стандарте 802.11n.
Создайте пару QPSK модулятора и демодулятора.
qpskMod = comm.QPSKModulator; qpskDemod = comm.QPSKDemodulator;
Создайте пару модулятора и демодулятора OFDM с пользовательскими индексами пилот-сигнала, вставленным DC null, двумя передающими антеннами и двумя приемными антеннами. Задайте индексы управления, которые варьируются между антеннами.
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