ofdmdemod

Демодулируйте сигнал временного интервала, использующий ортогональное мультиплексирование деления частоты (OFDM)

Синтаксис

outSym = ofdmdemod(ofdmSig,nfft,cplen)
outSym = ofdmdemod(ofdmSig,nfft,cplen,symOffset)
outSym = ofdmdemod(ofdmSig,nfft,cplen,symOffset,nullidx)
[outSym,pilots] = ofdmdemod(ofdmSig,nfft,cplen,symOffset,nullidx,pilotidx)

Описание

пример

outSym = ofdmdemod(ofdmSig,nfft,cplen) выполняет демодуляцию OFDM на входном сигнале области времени, заданном в ofdmSig, с помощью размера БПФ, заданного nfft и циклической длиной префикса, заданной cplen. Для получения информации см. Демодуляцию OFDM.

outSym = ofdmdemod(ofdmSig,nfft,cplen,symOffset) применяет смещение выборки символа, symOffset, для каждого символа OFDM перед демодуляцией входа.

пример

outSym = ofdmdemod(ofdmSig,nfft,cplen,symOffset,nullidx) удаляет пустые поднесущие из местоположений, заданных в nullidx. Для этого синтаксиса смещение выборки символа применяется к каждому символу OFDM, и количеством строк в выводе является nfftlength(nullidx), который составляет удаление пустых поднесущих. Используйте пустые поднесущие, чтобы составлять поднесущие DC и защитные полосы. Для получения информации смотрите Выделение Поднесущей и Защитные полосы.

пример

[outSym,pilots] = ofdmdemod(ofdmSig,nfft,cplen,symOffset,nullidx,pilotidx) возвращает экспериментальные поднесущие для экспериментальных индексов, заданных в pilotidx. Для этого синтаксиса смещение выборки символа применяется к каждому символу OFDM, и количеством строк в выводе является nfftlength(nullidx)length(pilotidx), который составляет удаление пустых и экспериментальных поднесущих. Функция принимает, что экспериментальные местоположения поднесущей являются тем же самым через каждый символ OFDM и передают антенну.

Примеры

свернуть все

OFDM-демодулируйте сигнал с различными длинами CP для различных символов.

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

nfft = 64;
cplen = [16 32];
nSym = 2;
dataIn = complex(randn(nfft,nSym),randn(nfft,nSym));
y1 = ofdmmod(dataIn,nfft,cplen);

Демодулируйте символы OFDM. Сравните результаты с исходными входными данными. Различие между сигналами незначительно.

x1 = ofdmdemod(y1,nfft,cplen);
max(x1-dataIn)
ans = 1×2 complex
10-15 ×

   0.2220 - 0.7772i   0.2498 - 0.8882i

Примените OFDM, мультиплексирующий к 16-QAM ссылке SISO сигнала с Релеевским замиранием.

s1 = RandStream('mt19937ar','Seed',12345);
nFFT = 64;
cpLen = 16;
nullIdx = [1:6 33 64-4:64].';
numTones = nFFT-length(nullIdx);

modOrd = 4;
qam = comm.RectangularQAMModulator('ModulationOrder',2^modOrd, ...
    'BitInput',true,'NormalizationMethod','Average power');

maxDopp = 1;
pathDelays = [0 4e-3 8e-3];
pathGains = [0 -2 -3];
sRate = 1000;
sampIdx = round(pathDelays/(1/sRate)) + 1;

chan = comm.RayleighChannel('PathGainsOutputPort',true, ...
    'MaximumDopplerShift',maxDopp,'PathDelays',pathDelays, ...
    'AveragePathGains',pathGains,'SampleRate',sRate, ...
    'RandomStream','mt19937ar with seed');

data = randi(s1,[0 1],modOrd*numTones,1);
modOut = qam(data);

Примените модуляцию OFDM и передайте сигнал через канал.

y = ofdmmod(modOut,nFFT,cpLen,nullIdx);
[fadSig, pg] = chan(y);

Определите смещение выборки символа. OFDM демодулируют полученный сигнал.

symOffset = min(max(sampIdx),cpLen)
x = ofdmdemod(fadSig,nFFT,cpLen,symOffset,nullIdx); % with a time shift
symOffset =

     9

Преобразуйте усиления пути, pg, к скалярным усилениям касаний. Используйте усиления касания для коррекции во время восстановления сигнала.

hImp = complex(zeros(1,nFFT));
hImp(:,sampIdx) = mean(pg,1);
hall = fftshift(fft(hImp.'),1);
dataIdx = double(setdiff((1:nFFT)',nullIdx));
h = hall(dataIdx);

Компенсируйте сигнал.

eqH = conj(h)./(conj(h).*h);
eqSig = eqH.*x;

cdScope = comm.ConstellationDiagram('ShowReferenceConstellation',true, ...
    'ReferenceConstellation',constellation(qam));
cdScope(eqSig);

Демодулируйте 16-QAM символы, чтобы восстановить сигнал. Вычислите частоту ошибок по битам.

qamdem = comm.RectangularQAMDemodulator('ModulationOrder',2^modOrd, ...
    'BitOutput',true,'NormalizationMethod','Average power');
rxBits = qamdem(eqSig);

numErr = biterr(data,rxBits);
disp(['Number of bit errors: ' num2str(numErr) ' out of ' num2str(length(data)) ' bits.'])
Number of bit errors: 3 out of 208 bits.

OFDM-демодулируйте ввод данных, который включает пустую и экспериментальную упаковку.

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

nfft     = 64;
cplen    = 16;
nSym     = 10;
nullIdx  = [1:6 33 64-4:64]';
pilotIdx = [12 26 40 54]';
numDataCarrs = nfft-length(nullIdx)-length(pilotIdx);
dataIn = complex(randn(numDataCarrs,nSym),randn(numDataCarrs,nSym));
pilots = repmat(pskmod((0:3).',4),1,nSym);
y2 = ofdmmod(dataIn,nfft,cplen,nullIdx,pilotIdx,pilots);

Демодулируйте символы OFDM. Сравните результаты с исходными входными данными, чтобы показать, что существует незначительное различие между демодулируемым сигналом и исходными данными и экспериментальными сигналами.

symOffset = cplen;
[x2,rxPilots] = ofdmdemod(y2,nfft,cplen,symOffset,nullIdx,pilotIdx);
max(x2-dataIn)
ans = 1×10 complex
10-15 ×

   0.5551 + 0.2220i   0.2220 + 0.4441i   0.4441 - 0.2220i   0.4718 - 0.3331i  -0.1665 - 0.4441i  -0.3331 - 0.8049i   0.6661 - 0.2220i   0.0000 + 0.5829i   0.2220 + 0.4441i   0.3331 + 0.4441i

max(rxPilots-pilots)
ans = 1×10 complex
10-15 ×

   0.0000 + 0.3331i   0.1837 - 0.2220i  -0.4441 - 0.2776i   0.2220 + 0.2220i   0.2220 - 0.1665i   0.0000 - 0.3445i   0.3331 + 0.0441i  -0.4441 - 0.1225i   0.4441 + 0.1943i   0.4441 + 0.3192i

Входные параметры

свернуть все

Модулируемые символы OFDM, заданные как 2D массив комплексных символов.

  • Если cplen является скаляром, размером массивов является ((nfft + cplen) × N Sym)-by-NR.

  • Если cplen является вектором - строкой, размером массивов является ((nfft × N Sym) + sum (cplen))-by-NR.

    N Sym является количеством символов на антенну и N R, является количеством, получают антенны.

Типы данных: double | single
Поддержка комплексного числа: Да

Длина БПФ, заданная как целое число, больше, чем или равный 8. nfft эквивалентен количеству поднесущих, используемых в процессе демодуляции.

Типы данных: double

Циклическая длина префикса, заданная как скаляр или как вектор - строка из длины N Sym.

  • Когда вы задаете cplen как скаляр, циклическая длина префикса является тем же самым для всех символов через все антенны.

  • Когда вы задаете cplen как вектор - строку из длины N Sym, циклическая длина префикса может отличаться через символы, но остается та же длина через все антенны.

Типы данных: double

Смещение выборки символа, заданное как значения от 0 до cplen.

  • Если вы не задаете symOffset, значение по умолчанию является смещением, равным cplen.

  • Если вы задаете symOffset как скаляр, то же смещение используется для всех символов.

  • Если вы задаете symOffset как вектор - строку, значение смещения может отличаться для каждого символа.

Для получения информации смотрите Смещение Работы с окнами и Символа.

Типы данных: double

Индексы пустых местоположений поднесущей, заданных как вектор-столбец со значениями элемента от 1 до nfft. Если вы задаете nullidx, количеством строк в outSym является (nfft-length(nullidx)). Для получения информации смотрите Выделение Поднесущей и Защитные полосы.

Типы данных: double

Индексы экспериментальных местоположений поднесущей, заданных как вектор-столбец со значениями элемента от 1 до nfft. Если вы задаете pilotidx, количеством строк в outSym является (nfft-length(nullidx)-length(pilotidx)).For информация, смотрите Выделение Поднесущей и Защитные полосы.

Типы данных: double

Выходные аргументы

свернуть все

Выведите демодулируемые символы, возвращенные как N D NSym NR числовым массивом символов. N D должен равняться nfftlength(nullidx)length(pilotidx). N Sym является количеством символов OFDM на антенну. N R является количеством, получают антенны. Для получения информации см. Демодуляцию OFDM.

Экспериментальные поднесущие, возвращенные как Пилот N NSym NR числовым массивом символов. Пилот N должен равняться длине pilotidx. N Sym является количеством символов OFDM на антенну. N R является количеством, получают антенны. Функция принимает, что экспериментальные местоположения поднесущей являются тем же самым через каждый символ OFDM и передают антенну. Используйте comm.OFDMDemodulator, чтобы отличаться экспериментальные местоположения поднесущей через символы OFDM или антенны.

Больше о

свернуть все

Демодуляция OFDM

Демодулятор OFDM демультиплексирует сигнал временного интервала мультиподнесущей использование ортогональной модуляции деления частоты.

Демодуляция OFDM использует операцию FFT, которая приводит к потокам данных параллели N. Демодулятор OFDM состоит из банка корреляторов N, с одним коррелятором, присвоенным каждой поднесущей OFDM, сопровождаемой преобразованием параллельного кода в последовательный.

Выделение поднесущей и защитные полосы

Отдельные поднесущие OFDM выделяются как данные, пилот или пустые поднесущие.

Как показано здесь, поднесущие определяются как данные, DC, пилот, поднесущих защитной полосы.

  • Поднесущие данных передают пользовательские данные.

  • Экспериментальные поднесущие используются для оценки канала.

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

    • Пустая поднесущая DC является центром диапазона частот с индексным значением (nfft/2 + 1), если nfft даже, или ((nfft + 1) / 2), если nfft нечетен.

    • Защитные полосы обеспечивают буферы между последовательными символами OFDM, чтобы защитить целостность переданных сигналов путем сокращения интерференции межсимвола.

Пустые поднесущие позволяют вам смоделировать защитные полосы и местоположения поднесущей DC для определенных стандартов, таких как различные 802,11 формата, LTE, WiMAX, или для пользовательских выделений. Можно выделить местоположение пустых указателей путем присвоения вектора пустых индексов поднесущей.

Работа с окнами и смещение символа

Чтобы уменьшать интерференцию межсимвола (ISI), введенный работой с окнами сигнала, примененной в передатчике, функция применяет дробное смещение символа перед демодуляцией каждого символа OFDM. К работе с окнами сигнала часто применяются переданные символы OFDM, чтобы сглаживать разрыв между последовательными символами OFDM. Работа с окнами уменьшает межсимвол внеполосный ISI эмиссии но увеличений.

Оконный символ OFDM состоит из циклического префикса (CP), данных о символе ODFM, плюс области работы с окнами вначале и конец символа. Продвижение и запаздывающие плечи работы с окнами имеют хвосты как показано в фигуре.

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

Задайте смещение выборки символа как значение с 0 на CP L.

  • Когда смещение выборки символа является скаляром с 0 на CP L, окно FFT начинает в X +1 выборку длины CP.

  • Когда смещение выборки символа является нулем, никакое смещение не применяется, и окно FFT запускается на первой выборке символа.

  • Когда смещение выборки символа является циклической длиной префикса, CP L, окно FFT начинается после последней выборки CP. Это смещение является настройкой по умолчанию, если смещение выборки символа не задано.

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Смотрите также

Функции

Системные объекты

Введенный в R2018a