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

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 в виде 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