Этот пример показывает, как создать пару модулятора/демодулятора ортогональной модуляции деления частоты (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)
Для первой передачи и сначала получают пару антенны, демонстрируют, что входной пилот сигнал совпадает с входным пилотом сигнал.
pilotCompare = abs(pilotIn(:,:,1)*chanGain(1,1)) - abs(pilotOut(:,:,1,1)); max(pilotCompare(:) < 1e-10)
ans = logical
1