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

пример

[outSym,pilots] = ofdmdemod(ofdmSig,nfft,cplen,symOffset,nullidx,pilotidx) возвращает пилотные поднесущие для экспериментальных индексов, заданных в pilotidx. Для этого синтаксиса смещение выборки символа применяется к каждому символу OFDM, и количеством строк в выходе является nfftдлина (nullidx)длина (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);

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

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');

cdScope = comm.ConstellationDiagram('ShowReferenceConstellation',true, ...
    'ReferenceConstellation',constSym);

Сгенерируйте данные сигнала и примените 16-QAM модуляцию.

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);
cdScope(x);

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

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

Компенсируйте сигнал. Отобразите схему созвездия после эквализации.

eqSig = x ./ h_datasubcarr;
cdScope(eqSig);

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

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

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

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

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

свернуть все

Выведите демодулируемые символы, возвращенные как N D NSym NR массивом символов. N D должен равняться nfftдлина (nullidx)длина (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, или для пользовательских распределений. Можно выделить местоположение нулей путем присвоения вектора индексов нулевых поднесущей.

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

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

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

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

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

Чтобы уменьшать интерференцию межсимвола (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