exponenta event banner

ofdmdemod

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

Описание

пример

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), которая учитывает удаление нулевых поднесущих. Используйте нулевые поднесущие для учета защитных полос и поднесущих постоянного тока. Для получения дополнительной информации см. Распределение поднесущих и защитные полосы.

пример

[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 к каналу SISO 16-QAM сигнала с релеевским замиранием.

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

k = 4; % bits per symbol
M = 2^k;
constSym = qammod((0:M-1),M,'UnitAveragePower',true);

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 M-1],numTones,1);

modOut = qammod(data,M,'UnitAveragePower',true);

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

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

Определение смещения выборки символов.

symOffset = min(max(sampIdx),cpLen)
symOffset = 9

OFDM демодулирует принятый сигнал.

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

Преобразование выигрышей по путям, 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',constSym);
cdScope(eqSig);

Figure Constellation Diagram contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes contains 2 objects of type line. This object represents Channel 1.

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

rxSym = qamdemod(eqSig,M,'UnitAveragePower',true);

numErr = symerr(data,rxSym);
disp(['Number of symbol errors: ' num2str(numErr) ' out of ' num2str(length(data)) ' symbols.'])
Number of symbol errors: 2 out of 52 symbols.

Ввод данных 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 символы, определенные как 2-D массив комплексных символов.

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

  • Если cplen - вектор строки, размер массива ((nfft × NSym) + sum(cplen)) -по-NR.

    NSym - количество символов на антенну, а NR - количество приемных антенн.

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

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

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

Длина циклического префикса, заданная как скаляр или как вектор строки длиной NSym.

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

  • При указании cplen в качестве вектора строки длиной NSym длина циклического префикса может изменяться по символам, но остается одинаковой во всех антеннах.

Типы данных: 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))Для получения дополнительной информации см. Распределение поднесущих и защитные полосы.

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

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

свернуть все

Выходные демодулированные символы, возвращаемые как массив символов ND-by-NSym-by-NR. ND должен быть равен nfftlength(nullidx)length(pilotidx). NSym - количество символов OFDM на антенну. NR - количество приемных антенн. Для получения информации см. Демодуляция OFDM.

Поднесущие пилот-сигнала, возвращаемые как массив символов NPilot-by-NSym-by-NR. NПилот должен равняться длине pilotidx. NSym - количество символов OFDM на антенну. NR - количество приемных антенн. Функция предполагает, что местоположения пилотных поднесущих одинаковы для каждого символа OFDM и передающей антенны. Используйте comm.OFDMDemodulator для изменения местоположений пилотных поднесущих по символам OFDM или антеннам.

Подробнее

свернуть все

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

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

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

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

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

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

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

  • Поднесущие пилот-сигнала используются для оценки канала.

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

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

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

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

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

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

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

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

Смещение окон и символов

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

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

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

Укажите смещение выборки символов как значение от 0 до LCP.

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

  • Когда смещение выборки символа равно нулю, смещение не применяется, и окно БПФ начинается с первой выборки символа.

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

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2018a