Модулируйте сигнал с использованием OFDM метода
The OFDMModulator
объект модулирует сигнал, используя метод ортогонального частотного деления модуляции. Выход является представлением модулированного сигнала в основной полосе частот.
Для моделирования сигнала с использованием OFDM:
Создайте comm.OFDMModulator
Объекту и установите его свойства.
Вызывайте объект с аргументами, как будто это функция.
Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».
создает OFDM модулятор System object™.hMod
= comm.OFDMModulator
задает Свойства, используя один из нескольких аргументов пары "имя-значение". Заключайте каждое имя свойства в кавычки. Для примера, hMod
= comm.OFDMModulator(Name
,Value
)comm.OFDMModulator('NumSymbols',8)
задает восемь символов OFDM во временной частотной сетке.
устанавливает свойства системного объекта модулятора OFDM на основе заданного системного объекта демодулятора OFDM hMod
= comm.OFDMModulator(hDemod
)comm.OFDMDemodulator
.
Если не указано иное, свойства являются нетронутыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируются, когда вы вызываете их, и release
функция разблокирует их.
Если свойство настраивается, можно изменить его значение в любой момент.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.
FFTLength
- Количество точек БПФ64
(по умолчанию) | положительное целое числоКоличество точек быстрого преобразования Фурье (FFT), заданное в виде положительного целого числа. Длина БПФ, N БПФ, должна быть больше или равной 8 и эквивалентна количеству поднесущих.
Типы данных: double
NumGuardBandCarriers
- Количество поднесущих в левой и правой полосах защиты[6;5]
(по умолчанию) | двухэлементный вектор-столбец из целых чиселКоличество поднесущих, выделенных для левых и правых защитных полос, заданное как двухэлементный вектор-столбец из целых чисел. Количество поднесущих должно находиться в пределах [0, ⌊ N FFT/2 ⌋ − 1]. Этот вектор имеет вид [N leftG, N rightG], где N leftG и N rightG задают левые и правые защитные полосы, соответственно.
Типы данных: double
InsertDCNull
- Опция вставки DC nullfalse
или 0
(по умолчанию) | true
или 1
Опция вставки DC null, заданная в виде числа или логического 0
(false
) или 1
(true
). Поднесущая постоянного тока является центром полосы частот и имеет значение индекса:
(FFTLength
/ 2) + 1 при FFTLength
есть даже
(FFTLength
+ 1 )/2 при FFTLength
является нечетным
PilotInputPort
- Опция задать вход пилот-сигналаfalse
или 0
(по умолчанию) | true
или 1
Опция для задания входов пилот-сигнала, заданная в виде числа или логического 0
(false
) или 1
(true
). Если это свойство 1
(true
), можно назначить отдельные поднесущие для передачи пилот-сигнала. Если это свойство 0
(false
), пилот-информация принята как встроенная во входные данные.
PilotCarrierIndices
- Индексы поднесущей пилот-сигнала[12; 26; 40; 54]
(по умолчанию) | вектор-столбецИндексы поднесущей пилот-сигнала, заданные как вектор-столбец. Если для свойства PilotCarrierIndices задано значение 1
(true
), можно задать индексы поднесущих пилот-сигнала. Для каждого символа можно назначить индексы тем же или разным поднесущим. Точно так же индексы пилот-сигнала несущей могут различаться для нескольких передающих антенн. В зависимости от желаемого уровня управления для назначений индекса размерности свойства варьируются. Действительные индексы пилота падают в области значений
где значение индекса не может превышать количество поднесущих. Когда индексы пилот-сигнала одинаковы для каждого символа и передающей антенны, свойство имеет размерности N пилот-сигнал на 1. Когда индексы пилот-сигнала варьируются между символами, свойство имеет размерности N pilot-by N sym. Если вы передаете только один символ, но несколько передающих антенн, свойство имеет размерности N pilot-на-1-by- N t., где N t. - количество передающих антенн. Если индексы варьируются по количеству символов и передающих антенн, свойство имеет размерности N pilot-by N sym-by- N t. Если количество передающих антенн больше единицы, убедитесь, что индексы на символ должны быть взаимно различны между антеннами, чтобы минимизировать интерференцию.
Чтобы включить это свойство, установите PilotInputPort
свойство к 1
(true
).
CyclicPrefixLength
- Длина циклического префикса16
(по умолчанию) | положительное целое число | вектор-строкаДлина циклического префикса, заданная как положительное целое число. Если вы задаете скаляр, длина префикса одинаковая для всех символов через все антенны. Если вы задаете вектор-строку длины N sym, длина префикса может варьироваться между символами, но остается неизменной через все антенны.
Типы данных: double
Windowing
- Опция применения приподнятого окна косинуса между символами OFDMfalse
или 0
(по умолчанию) | true
или 1
Опция для применения приподнятого окна косинуса между символами OFDM, заданная как true
или false
. Оконная обработка - это процесс, в котором символ OFDM умножается на приподнятое окно косинуса перед передачей, чтобы быстрее уменьшить степень внеполосных поднесущих. Оконная обработка уменьшает спектральное восстановление.
WindowLength
- Длина приподнятого окна косинуса1
(по умолчанию) | положительная скалярная величинаДлина приподнятого окна косинуса, заданная как положительная скалярная величина. Это значение должно быть меньше или равно минимальной длине циклического префикса. Для примера в строение четырех символов с длинами циклического префикса 12, 14, 16 и 18 длина окна должна быть меньше или равной 12.
Чтобы включить это свойство, установите Windowing
свойство к 1
(true
).
NumSymbols
- Количество символов OFDM1
(по умолчанию) | положительное целое числоКоличество символов OFDM в частотно-временной сетке, заданное в виде положительного целого числа.
NumTransmitAntennnas
- Количество передающих антенн1
(по умолчанию) | положительное целое числоКоличество передающих антенн, используемых для передачи модулированного сигнала OFDM, заданное в виде положительного целого числа.
присваивает пилот-сигнал, waveform
= hMod(data
,pilot
)pilot
, в поднесущие частоты, заданные значением свойства PilotCarrierIndices hMod
системный объект. Чтобы включить этот синтаксис, задайте для свойства PilotCarrierIndices значение true
.
insignal
- Входной сгенерированный модулированный сигналВходной сгенерированный модулированный сигнал, заданный как матрица или трехмерный массив числовых значений. Размер входа сгенерированного модулированного сигнала должен быть N f-by- N sym-by- N t. где N f - количество частотных поднесущих, исключающих защитные полосы и DC null.
Типы данных: double
Поддержка комплексного числа: Да
data
- Входные данныеВходные данные, заданные как матрица или трехмерный массив. Этот вход должен быть числом размера N d-by- N sym-by- N t. где N d - количество поднесущих данных в каждом символе. Для получения дополнительной информации о том, как вычисляется N d, смотрите свойство PilotCarrierIndices.
Типы данных: double
Поддержка комплексного числа: Да
pilot
- Пилот-сигналПилот-сигнал, заданный как трехмерный массив числовых значений. Пилот-сигнал должен иметь размер N пилот-by N sym-by-Nt.
Типы данных: double
Поддержка комплексного числа: Да
waveform
- OFDM Модулированный сгенерированный модулированный сигналOFDM Модулированный сгенерированный модулированный сигнал, возвращаемый как 2-D массив. Если на CyclicPrefixLength
свойство является скаляром, выходом waveform
имеет размер ((NFFT + CPlen) ⁎ Nsym) -by-Nt. В противном случае размер (NFFT⁎Nsym+∑ (CPlen)) -by-Nt.
Типы данных: double
Поддержка комплексного числа: Да
Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем obj
, используйте следующий синтаксис:
release(obj)
comm.OFDMModulator
info | Предоставьте информацию о величине для модулятора OFDM |
showResourceMapping | Покажите отображение поднесущей символов OFDM, созданных модулятором OFDM Системного объекта |
Создайте и отобразите object™ OFDM-модулятора System со значениями свойств по умолчанию.
hMod = comm.OFDMModulator
hMod = comm.OFDMModulator with properties: FFTLength: 64 NumGuardBandCarriers: [2x1 double] InsertDCNull: false PilotInputPort: false CyclicPrefixLength: 16 Windowing: false NumSymbols: 1 NumTransmitAntennas: 1
Измените количество поднесущих и символов.
hMod.FFTLength = 128; hMod.NumSymbols = 2;
Проверьте, что изменилось количество поднесущих и количество символов.
disp(hMod)
comm.OFDMModulator with properties: FFTLength: 128 NumGuardBandCarriers: [2x1 double] InsertDCNull: false PilotInputPort: false CyclicPrefixLength: 16 Windowing: false NumSymbols: 2 NumTransmitAntennas: 1
Используйте showResourceMapping
функция объекта, чтобы показать отображение данных, пилот-сигнала и ядра поднесущих в частотно-временном пространстве.
showResourceMapping(hMod)
Создайте систему демодулятора OFDM object™ со значениями свойств по умолчанию. Затем задайте индексы пилот-сигнала для одного символа и двух передающих антенн.
Установка PilotCarrierIndices
свойство демодулятора влияет на количество передающих антенн в модуляторе OFDM, когда вы используете демодулятор в создании модулятора. Количество приемных антенн в демодуляторе некоррелировано с количеством передающих антенн.
ofdmDemod = comm.OFDMDemodulator; ofdmDemod.PilotOutputPort = true; ofdmDemod.PilotCarrierIndices = cat(3,[12; 26; 40; 54],[13; 27; 41; 55]);
Используйте демодулятор OFDM, чтобы создать модулятор OFDM.
ofdmMod = comm.OFDMModulator(ofdmDemod);
Отображение свойств модулятора OFDM и демодулятора, проверка соответствия применимых свойств.
disp(ofdmMod)
comm.OFDMModulator with properties: FFTLength: 64 NumGuardBandCarriers: [2x1 double] InsertDCNull: false PilotInputPort: true PilotCarrierIndices: [4x1x2 double] CyclicPrefixLength: 16 Windowing: false NumSymbols: 1 NumTransmitAntennas: 2
disp(ofdmDemod)
comm.OFDMDemodulator with properties: FFTLength: 64 NumGuardBandCarriers: [2x1 double] RemoveDCCarrier: false PilotOutputPort: true PilotCarrierIndices: [4x1x2 double] CyclicPrefixLength: 16 NumSymbols: 1 NumReceiveAntennas: 1
The showResourceMapping
метод отображает отображение ресурсов для каждой передающей антенны.
Создайте OFDM модулятор.
mod = comm.OFDMModulator;
Применить showResourceMapping
способ.
showResourceMapping(mod)
Вставьте значение DC null.
mod.InsertDCNull = true;
Отображение сопоставления ресурсов после добавления значения DC null.
showResourceMapping(mod)
Создайте модулятор OFDM и задайте индексы поднесущей для пилот-сигналов. Задайте индексы для каждого символа и передающей антенны. Когда количество передающих антенн больше единицы, задайте различные индексы пилот-сигнала для каждого символа между антеннами.
Создайте Системный объект модулятора OFDM, задав два символа и вставив DC null.
mod = comm.OFDMModulator('FFTLength',128,'NumSymbols',2,... 'InsertDCNull',true);
Включите входной порт пилот-сигнала, чтобы можно было задать индексы пилот-сигнала.
mod.PilotInputPort = true;
Задайте одинаковые индексы управления для обоих символов.
mod.PilotCarrierIndices = [12; 56; 89; 100];
Визуализируйте размещение пилот-сигналов и нулей в частотно-временной сетке OFDM при помощи showResourceMapping
функция объекта.
showResourceMapping(mod)
Задайте различные индексы для второго символа путем объединения второго столбца индексов пилот-сигнала с PilotCarrierIndices
свойство.
mod.PilotCarrierIndices = cat(2,mod.PilotCarrierIndices, ...
[17; 61; 94; 105]);
Проверьте, что индексы поднесущей управления различаются между этими двумя символами.
showResourceMapping(mod)
Увеличьте количество передающих антенн до двух.
mod.NumTransmitAntennas = 2;
Задайте индексы пилот-сигнала для каждой из двух передающих антенн. Чтобы обеспечить индексы для нескольких антенн с минимизацией помех между антеннами, установите PilotCarrierIndices
свойство как трехмерный массив, таким образом индексы для каждого символа различаются среди антенн.
mod.PilotCarrierIndices = cat(3,[20; 50; 70; 110], [15; 60; 75; 105]);
Отобразите отображение ресурсов для двух передающих антенн. Серые линии обозначают вставку пользовательских нулей. Значения null создаются объектом, чтобы минимизировать интерференцию между символами пилот-сигнала от различных антенн.
showResourceMapping(mod)
Задайте длину циклического префикса для каждого символа OFDM.
Создайте модулятор OFDM, задающий пять символов, четыре левые и три правые защитные поднесущие и длину циклического префикса для каждого символа OFDM.
mod = comm.OFDMModulator('NumGuardBandCarriers',[4;3],... 'NumSymbols',5,... 'CyclicPrefixLength',[12 10 14 11 13]);
Отобразите свойства модулятора OFDM, проверьтеING, что длина циклического префикса изменяется между символами.
disp(mod)
comm.OFDMModulator with properties: FFTLength: 64 NumGuardBandCarriers: [2x1 double] InsertDCNull: false PilotInputPort: false CyclicPrefixLength: [12 10 14 11 13] Windowing: false NumSymbols: 5 NumTransmitAntennas: 1
Получите размерности данных модулятора OFDM при помощи info
функция объекта.
Создайте OFDM-модулятор System object™ с пользовательскими заданными индексами пилот-сигнала, вставленным DC null и задайте две передающие антенны.
hMod = comm.OFDMModulator('NumGuardBandCarriers',[4;3], ... 'PilotInputPort',true, ... 'PilotCarrierIndices',cat(3,[12; 26; 40; 54], ... [11; 25; 39; 53]), ... 'InsertDCNull',true, ... 'NumTransmitAntennas',2);
Используйте info
функция объекта для получения входных данных модулятора, входных данных управления и размеров выходных данных.
info(hMod)
ans = struct with fields:
DataInputSize: [48 1 2]
PilotInputSize: [4 1 2]
OutputSize: [80 2]
Сгенерируйте модулированные OFDM символы для использования в симуляциях канального уровня.
Создайте модулятор OFDM с введенным DC null, семью поднесущими защитного диапазона и двумя символами, имеющими различные индексы пилот-сигнала для каждого символа.
mod = comm.OFDMModulator('NumGuardBandCarriers',[4;3],... 'PilotInputPort',true, ... 'PilotCarrierIndices',[12 11; 26 27; 40 39; 54 55], ... 'NumSymbols',2, ... 'InsertDCNull',true);
Определите входные данные, размерности пилот-сигнала и выходные данные.
modDim = info(mod);
Сгенерируйте символы случайных данных для модулятора OFDM. Структурная переменная, modDim
, определяет количество символов данных.
dataIn = complex(randn(modDim.DataInputSize),randn(modDim.DataInputSize));
Создайте пилот-сигнал, который имеет правильные размерности.
pilotIn = complex(rand(modDim.PilotInputSize),rand(modDim.PilotInputSize));
Примените модуляцию OFDM к данным и пилот-сигналам.
modData = step(mod,dataIn,pilotIn);
Используйте объект модулятора OFDM, чтобы создать соответствующий демодулятор OFDM.
demod = comm.OFDMDemodulator(mod);
Демодулируйте сигнал OFDM и выводите сигналы данных и пилот-сигнала.
[dataOut, pilotOut] = step(demod,modData);
Проверьте, что в пределах жесткого допуска входные данные и пилотные символы совпадают с выходом данными и пилотными символами.
isSame = (max(abs([dataIn(:) - dataOut(:); ...
pilotIn(:) - pilotOut(:)])) < 1e-10)
isSame = logical
1
Операция OFDM разделяет высокоскоростной поток данных на субпотоки с более низкой скоростью передачи данных путем разложения полосы частот передачи на N смежных индивидуально модулированных поднесущих. Несколько параллельных и ортогональных поднесущих несут выборки с почти той же шириной полосы пропускания, что и широкополосный канал. При использовании узких ортогональных поднесущих сигнал OFDM усиливает робастность по частотно-селективному каналу с замираниями и устраняет соседние помехи поднесущей. Межсимвольная интерференция (ISI) уменьшается, потому что субпотоки с более низкой скоростью передачи данных имеют длительности символов, большие, чем разброс задержки канала.
Представление Частотного диапазона ортогональных поднесущих в форме волны OFDM выглядит следующим образом:
Передатчик применяет обратное быстрое преобразование Фурье (IFFT) к N символам за раз. Выход IFFT является суммой N ортогональных синусоидов:
где {X k} - символы данных, а T - время символа OFDM. Символы X k данных обычно являются комплексными и могут быть из любого цифрового алфавита модуляции (например, QPSK, 16-QAM, 64-QAM).
Интервал между поднесущими равен и f = 1/ T; обеспечение ортогональности поднесущих в течение каждого периода символа, как показано ниже:
Модулятор 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.
Пока промежуток времени дисперсии не превышает длительность циклического префикса, преимущество вставки циклического префикса сохраняется.
Вставка циклического префикса приводит к дробному снижению пропускной способности пользовательских данных, потому что циклический префикс занимает полосу пропускания, которая может использоваться для передачи данных.
В то время как циклический префикс создает защитный период во временном интервале для сохранения ортогональности, символ OFDM редко начинается с той же амплитуды и фазы, которые проявляются в конце предыдущего символа OFDM, вызывающего спектральное возрождение и, следовательно, расширение полосы пропускания сигнала из-за интермодуляционных искажений. Чтобы ограничить этот спектральный рост, желательно создать плавный переход между последней выборкой символа и первой выборкой следующего символа. Это может быть сделано с помощью циклического суффикса и приподнятой оконной обмотки косинуса.
Чтобы создать циклический суффикс, первые N выборок WIN данного символа добавляются к концу этого символа. Однако в порядок соответствия стандарту 802.11g, для примера, длина символа не может быть произвольно удлинена. Вместо этого циклический суффикс должен перекрываться во времени и эффективно суммируется с циклическим префиксом следующего символа. Этот перекрывающийся сегмент находится там, где применяется оконная обработка. Приложены два окна, одно из которых является математическим обратным другим. Первое приподнятое окно косинуса прикладывается к циклическому суффиксу k символов и уменьшается с 1 до 0 за свою длительность. Второе приподнятое окно косинуса прикладывается к циклическому префиксу символа k + 1 и увеличивается с 0 до 1 по его длительности. Этот процесс обеспечивает плавный переход от одного символа к следующему.
Приподнятое окно косинуса w (t) во временном интервале может быть выражено как:
где:
T - длительность символа OFDM, включая защитный интервал.
T W является продолжительностью окна.
Отрегулируйте длину циклического суффикса через свойство установки длины окна, с длинами суффикса, установленными между 1 и минимальной длиной циклического префикса. В то время как оконная обработка улучшает спектральное возрождение, она делает это за счет многолучевого затухания иммунитета. Это происходит потому, что избыточность в защитной полосе уменьшается, потому что значения выборки защитной полосы нарушаются сглаживанием.
Следующие рисунки показывают применение приподнятой оконной обмотки косинуса.
[1] Дальман, Эрик, Стефан Парквалль, и Йохан Скёльд. 4G LTE/LTE-Advanced для мобильного широкополосного доступа. Амстердам: Elsevier, Acad. press, 2011.
[2] Эндрюс, Дж. Г., А. Гош и Р. Мухамед. Основы WiMAX. Верхняя Седл-Ривер, Нью-Джерси: Prentice Hall, 2007.
[3] Agilent Technologies, Inc., OFDM Raised Cosine Window, http://rfmw.em.keysight.com/wireless/helpfiles/n7617a/ofdm_raised_cosine_windowing.htm.
[4] Монтрёй, Л., Р. Продан, и Т. Колзе. OFDM TX Symbol Shaping 802,3млрд, https://www.ieee802.org/3/bn/public/jan13/montreuil_01a_0113.pdf. Вещание, 2013.
[5] "Стандарт IEEE 802.16TM-2009, "Нью-Йорк: IEEE, 2009.
Указания и ограничения по применению:
Смотрите Системные объекты в Генерации кода MATLAB (MATLAB Coder).
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.