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

пример

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

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

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

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

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

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

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

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

свернуть все

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

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

Подробнее о

свернуть все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.
Введенный в R2018a