OFDM с заданными пользователями экспериментальными индексами

В этом примере показано, как создать пару модулятора/демодулятора ортогональной модуляции деления частоты (OFDM) и задавать их экспериментальные индексы. Системный объект модулятора OFDM позволяет вам задать индексы пилотной поднесущей, сопоставимые с ограничениями, описанными в comm.OFDMModulator.info. В этом примере, для передачи OFDM по 3x2 канал, экспериментальные индексы создаются для каждой из этих трех передающих антенн. Кроме того, экспериментальные индексы отличаются между четными и нечетными символами.

Создайте объект модулятора OFDM, имеющий пять символов, три передающих антенны и длину шесть работ с окнами.

ofdmMod = comm.OFDMModulator('FFTLength',256, ...
    'NumGuardBandCarriers',[12; 11], ...
    'NumSymbols',5, ...
    'NumTransmitAntennas',3, ...
    'PilotInputPort',true, ...
    'Windowing',true, ...
    'WindowLength',6);

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

pilotIndOdd = [20; 58; 96; 145; 182; 210];
pilotIndEven = [35; 73; 111; 159; 197; 225];

pilotIndicesAnt1 = cat(2,pilotIndOdd,pilotIndEven,pilotIndOdd, ...
    pilotIndEven,pilotIndOdd);

Сгенерируйте экспериментальные индексы для вторых и третьих антенн на основе индексов, заданных для первой антенны. Конкатенация индексов для этих трех антенн и присваивает их PilotCarrierIndices свойство.

pilotIndicesAnt2 = pilotIndicesAnt1 + 5;
pilotIndicesAnt3 = pilotIndicesAnt1 - 5;

ofdmMod.PilotCarrierIndices = ...
    cat(3,pilotIndicesAnt1,pilotIndicesAnt2,pilotIndicesAnt3);

Создайте на демодуляторе OFDM с два, получают антенны на основе существующего Системного объекта модулятора OFDM. Определите данные и экспериментальные размерности с помощью info функция.

ofdmDemod = comm.OFDMDemodulator(ofdmMod);
ofdmDemod.NumReceiveAntennas = 2;

dims = info(ofdmMod)
dims = struct with fields:
     DataInputSize: [215 5 3]
    PilotInputSize: [6 5 3]
        OutputSize: [1360 3]

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

dataIn = ...
    complex(randn(dims.DataInputSize), ...
    randn(dims.DataInputSize));
pilotIn = ...
    complex(randn(dims.PilotInputSize), ...
    randn(dims.PilotInputSize));

Примените модуляцию OFDM к данным и пилотам.

modOut = ofdmMod(dataIn,pilotIn);

Передайте модулируемые данные через 3x2 случайный канал.

chanGain = complex(randn(3,2),randn(3,2));
chanOut = modOut * chanGain;

Демодулируйте принятые данные с помощью объекта демодулятора OFDM.

[dataOut,pilotOut] = ofdmDemod(chanOut);

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

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 5 objects of type image, line.

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 5 objects of type image, line.

Figure OFDM Subcarrier Mapping for Tx Antenna 3 contains an axes object. The axes object with title OFDM Subcarrier Mapping for Tx Antenna 3 contains 5 objects of type image, line.

Для первой передачи и сначала получают пару антенны, демонстрируют, что входной пилот сигнал совпадает с входным пилотом сигнал.

pilotCompare = ...
    abs(pilotIn(:,:,1)*chanGain(1,1)) - abs(pilotOut(:,:,1,1));
max(pilotCompare(:) < 1e-10)
ans = logical
   1