comm.TurboEncoder

Закодируйте входной сигнал с помощью конкатенированной схемы кодирования параллели

Описание

comm.TurboEncoder Система object™ применяется, параллель конкатенировала схему кодирования к сообщению двоичного входа. Эта схема кодирования использует два идентичных сверточных энкодера и добавляет биты завершения в конце закодированного потока бита данных. Для получения дополнительной информации см. Параллельную Конкатенированную Сверточную Схему кодирования.

Закодировать сообщение двоичного входа с помощью параллели конкатенировало схему кодирования:

  1. Создайте comm.TurboEncoder объект и набор его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?.

Создание

Описание

пример

turboenc = comm.TurboEncoder создает турбо Системный объект энкодера. Этот объект выполняет турбо кодирование с помощью конфигурации объекта по умолчанию.

пример

turboenc = comm.TurboEncoder(Name,Value) свойства наборов с помощью одной или нескольких пар "имя-значение". Например, comm.TurboEncoder('InterleaverIndicesSource','Input port') конфигурирует турбо Системный объект энкодера с interleaver индексами, которые будут предоставлены как входной параметр Системному объекту, когда он называется. Заключите каждое имя свойства в кавычки.

пример

turboenc = comm.TurboEncoder(trellis,interlvrindices) создает турбо Системный объект энкодера с TrellisStructure и InterleaverIndices набор свойств к trellis и interlvrindices, соответственно. trellis введите должен быть задан аналогичный описанному TrellisStructure свойство. interlvrindices введите должен быть задан аналогичный описанному InterleaverIndices свойство.

Свойства

развернуть все

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

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты.

Описание решетки составляющего сверточного кода в виде структуры, которая содержит описание решетки для уровня K/N код. K является количеством входных потоков битов, и N является количеством выходных потоков битов.

Примечание

K должен быть 1 для турбо кодера. Для получения дополнительной информации смотрите Уровень Кодирования.

Можно или использовать poly2trellis функция, чтобы создать структуру решетки или создать его вручную. Для больше об этой структуре, см. Описание Решетки Сверточного кода и istrellis функция.

Структура решетки содержит эти поля.

Количество входа символов к энкодеру в виде целого числа равняется 2K, где K является количеством входных потоков битов.

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

Количество символов, которым выход от энкодера в виде целого числа равняется 2N, где N является количеством выходных потоков битов.

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

Количество состояний в энкодере в виде степени 2.

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

Следующие состояния для всех комбинаций текущих состояний и текущих входных параметров в виде матрицы целых чисел. Матричным размером должен быть numStates- 2K.

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

Выходные параметры для всех комбинаций текущих состояний и текущих входных параметров в виде матрицы восьмеричных чисел. Матричным размером должен быть numStates- 2K.

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

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

Источник interleaver индексов в виде 'Property' или 'Input port'.

  • Когда вы устанавливаете это свойство на 'Input port', объект выполняет использование входа interleaver индексы, набор, когда вы вызываете объект. Длина вектора и значения для interleaver индексов и сообщения двоичного входа могут измениться с каждым вызовом объекта.

  • Когда вы устанавливаете это свойство на 'Property', объект использует interleaver индексы, которые вы задаете для InterleaverIndices свойство.

Типы данных: char | string

Индексы Interleaver в виде вектор-столбца целых чисел. Вектор должен иметь длину L, где L является длиной сообщения двоичного входа. Каждый элемент вектора должен быть целым числом в области значений [1, L] и должен быть уникальным. interleaver индексы задают отображение, используемое, чтобы переставить входные биты в энкодере.

Настраиваемый: да

Зависимости

Чтобы включить это свойство, установите InterleaverIndicesSource свойство к 'Property'.

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

Использование

Описание

пример

codeword = turboenc(message) кодирует входной сигнал с помощью конкатенированной сверточной схемы кодирования параллели, заданной структурой решетки и interleaver индексами. turboenc возвращается двоичный файл закодировал кодовую комбинацию. message и codeword вектор-столбцы числовых, логических, или значений фиксированной точки без знака с размером слова 1 (fi Объект (Fixed-Point Designer)). Для получения дополнительной информации см. Параллельную Конкатенированную Сверточную Схему кодирования.

пример

codeword = turboenc(message,interlvrindices) дополнительно задает interleaver индексы. interlvrindices должен быть вектор-столбец, содержащий целые числа в области значений [1, L] без повторных значений. L является длиной сообщения двоичного входа, message. Этот синтаксис применяется, когда свойство InterleaverIndicesSource установлено в 'Input port'. interleaver индексы задают отображение, используемое, чтобы переставить входные биты в энкодере.

Входные параметры

развернуть все

Входной сигнал в виде вектора столбца двоичных данных из длины L, где L является длиной незакодированного входного сигнала.

Типы данных: double | int8 | fi(data,0,1)

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

развернуть все

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

Типы данных: double | int8 | fi(data,0,1)

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

свернуть все

Закодируйте входной сигнал при помощи уровня 1/3 турбо настройка энкодера со структурой решетки по умолчанию, poly2trellis(4,[13 15],13), как представлено в этом рисунке.

Для входного сигнала с 64 битами кодовая комбинация вывела от энкодера, 204 бита. Первый выход на 192 бита соответствует три 64 потока битов, чередованные как Xk, Zk, и Zk. Систематический поток битов, Xk, и поток бита четности, Zk, от первого энкодера и потока бита четности, Zk, от второго энкодера. Когда переключатели находятся в более низком положении, сигналы следуют за пунктирными линиями, и последние 12 битов соответствуют битам хвоста от этих двух энкодеров. Первая группа шести битов (три систематических бита и три бита четности) является выходными битами хвоста от первого составляющего энкодера. Вторая группа шести битов (три систематических бита и три бита четности) является выходными битами хвоста от второго составляющего энкодера.

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

rng default
turboenc = comm.TurboEncoder;
frameLen = 64; % Frame length
data = randi([0 1],frameLen,1);
encData = turboenc(data);
codewordLen = length(encData);

Вычислите уровень кодирования. Из-за битов хвоста, выходной уровень энкодера кода немного меньше 1/3.

codingrate = frameLen/codewordLen
codingrate = 0.3137

Симулируйте передачу и прием данных о BPSK по каналу AWGN при помощи турбо кодирования и декодирования.

Задайте параметры симуляции, и затем вычислите эффективный уровень кодирования и шумовое отклонение. Для модуляции BPSK, ES/N0 равняется Eb/N0 потому что количество битов на символ (бит/с) равняется 1. Чтобы упростить повторное использование этого кода для других схем модуляции, вычисления в этом примере включают условия бит/с. Задайте пакетную длину, структуру решетки и количество итераций. Вычислите шумовое использование отклонения ES/N0 и уровень кода. Установите генератор случайных чисел на его состояние по умолчанию гарантировать, что результаты повторяемы.

modOrd = 2; % Modulation order
bps = log2(modOrd); % Bits per symbol
EbNo = 1; % Energy per bit to noise power spectral density ratio in dB
EsNo = EbNo + 10*log10(bps); % Energy per symbol to noise power spectral density ratio in dB

L = 256; % Input packet length in bits
trellis = poly2trellis(4,[13 15 17],13);
numiter = 4;
n = log2(trellis.numOutputSymbols);
numTails = log2(trellis.numStates)*n;
M = L*(2*n - 1) + 2*numTails; % Output codeword packet length
rate = L/M; % Coding rate

snrdB = EsNo + 10*log10(rate); % Signal to noise ratio in dB
noiseVar = 1./(10.^(snrdB/10)); % Noise variance

rng default

Сгенерируйте случайные interleaver индексы.

intrlvrIndices = randperm(L);

Создайте турбо пару энкодера и декодера. Используйте заданную структуру решетки и случайные interleaver индексы. Сконфигурируйте декодер, чтобы запустить максимум четырех итераций.

turboenc = comm.TurboEncoder(trellis,intrlvrIndices);
turbodec = comm.TurboDecoder(trellis,intrlvrIndices,numiter);

Создайте модулятор BPSK и пару демодулятора, где демодулятор выходные параметры мягкие биты определил использование метода LLR.

bpskmod = comm.BPSKModulator;
bpskdemod = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio', ...
    'Variance',noiseVar);

Создайте объект канала AWGN и объект коэффициента ошибок.

awgnchan = comm.AWGNChannel('NoiseMethod','Variance','Variance',noiseVar);
errrate = comm.ErrorRate;

Основной цикл обработки выполняет эти шаги.

  1. Сгенерируйте двоичные данные.

  2. Турбо кодирует данные.

  3. Модулируйте закодированные данные.

  4. Передайте модулируемый сигнал через канал AWGN.

  5. Демодулируйте сигнал с шумом при помощи LLR, чтобы вывести мягкие биты.

  6. Турбо декодирует демодулируемые данные. Поскольку побитовое отображение от демодулятора является противоположностью отображения, ожидаемого турбо декодером, вход декодера должен использовать инверсию демодулируемого сигнала.

  7. Вычислите ошибочную статистику.

for frmIdx = 1:100
    data = randi([0 1],L,1);
    encodedData = turboenc(data);
    modSignal = bpskmod(encodedData);
    receivedSignal = awgnchan(modSignal);
    demodSignal = bpskdemod(receivedSignal);
    receivedBits = turbodec(-demodSignal);
    errorStats = errrate(data,receivedBits);
end

Отобразите ошибочные данные.

fprintf('Bit error rate = %5.2e\nNumber of errors = %d\nTotal bits = %d\n', errorStats)
Bit error rate = 2.34e-04
Number of errors = 6
Total bits = 25600

Симулируйте сквозную линию связи при помощи 16-QAM и турбокоды сигнала в канале AWGN. В цикле обработки системы координат пакетные размеры случайным образом выбраны, чтобы быть 500, 1000, или 1 500 битов. Поскольку пакетный размер варьируется, interleaver индексы предоставляются турбо энкодеру и декодеру как входной параметр их связанного Системного объекта.

Установите порядок модуляции и Eb/N0. Вычислите количество битов на символ и энергии на символ к шумовому отношению (ES/N0) на основе порядка модуляции и Eb/N0. Чтобы получить повторяемые результаты, установите генератор случайных чисел на его состояние по умолчанию.

modOrder = 16;
bps = log2(modOrder); % Bits per symbol
EbNo = 2.8; % Energy per bit to noise power spectral density ratio in dB
EsNo = EbNo + 10*log10(bps); % Energy per symbol to noise power spectral density ratio in dB
rng default

Создайте турбо пару энкодера и декодера. Поскольку пакетная длина варьируется для каждой системы координат, укажите, что interleaver индексы предоставляются входным параметром Системного объекта, когда выполняется. Укажите, что декодер выполняет четыре итерации.

turboEnc = comm.TurboEncoder('InterleaverIndicesSource','Input port');
turboDec = comm.TurboDecoder('InterleaverIndicesSource','Input port','NumIterations',4);
trellis = poly2trellis(4,[13 15 17],13);
n = log2(turboEnc.TrellisStructure.numOutputSymbols);
numTails = log2(turboEnc.TrellisStructure.numStates)*n;

Создайте объект коэффициента ошибок.

errRate = comm.ErrorRate;

Цикл обработки системы координат выполняет эти шаги.

  1. Выберите случайную пакетную длину и сгенерируйте случайные двоичные данные.

  2. Вычислите выходную длину кодовой комбинации и уровень кодирования.

  3. Вычислите сигнал к шумовому отношению (ОСШ) и шумовому отклонению.

  4. Сгенерируйте interleaver индексы.

  5. Турбо кодирует данные.

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

  7. Передайте модулируемый сигнал через канал AWGN.

  8. Демодулируйте сигнал с шумом при помощи метода LLR, выведите мягкие биты и нормируйте среднюю степень сигнала.

  9. Турбо декодирует данные. Поскольку порядок побитового отображения от демодулятора напротив порядка отображения, ожидаемого турбо декодером, вход декодера должен использовать инверсию демодулируемого сигнала.

  10. Вычислите ошибочную статистику.

numFrames = 100;
for pktIdx = 1:numFrames
    L = 500*randi([1 3],1,1); % Packet length in bits
    data = randi([0 1],L,1);

    M = L*(2*n - 1) + 2*numTails; % Output codeword packet length
    rate = L/M; % Coding rate for current packet
    snrdB = EsNo + 10*log10(rate); % Signal to noise ratio in dB
    noiseVar = 1./(10.^(snrdB/10)); % Noise variance
    
    intrlvrIndices = randperm(L);
    encodedData = turboEnc(data,intrlvrIndices);
    modSignal = qammod(encodedData,modOrder,'InputType','bit','UnitAveragePower',true);
    receivedSignal = awgn(modSignal,snrdB);
    demodSignal = qamdemod(receivedSignal,modOrder,'OutputType','llr', ...
        'UnitAveragePower',true,'NoiseVariance',noiseVar);
    receivedBits = turboDec(-demodSignal,intrlvrIndices); % Demodulated signal is negated
    
    errorStats = errRate(data,receivedBits);
end

Отобразите ошибочные данные.

fprintf('Bit error rate = %5.2e\nNumber of errors = %d\nTotal bits = %d\n',errorStats)
Bit error rate = 8.51e-04
Number of errors = 80
Total bits = 94000

Больше о

развернуть все

Ссылки

[1] Berrou, C., А. Глэвиукс и П. Титимэджшима. “Около Шенноновского Предельного Кодирования с коррекцией ошибок и Декодирования: турбокоды”. Продолжения ICC 93 - Международная конференция IEEE по вопросам Коммуникаций, Женевы, Швейцария, май 1993, 1064–70. https://doi.org/10.1109/icc.1993.397441.

[2] Бенедетто, S., Г. Монторси, Д. Дивсэлэр и Ф. Поллара. "Модуль Мягкого Входа Мягкого Выхода Максимума следующего (MAP), чтобы декодировать параллельные и последовательные каскадные коды". Лаборатория реактивного движения отчет о выполнении работ TDA, 42–127, (ноябрь 1996).

[3] Шлегель, христианин, и Ланс Перес. Решетчатое кодирование и турбокодирование. IEEE нажимает Series on Digital & Mobile Communication. Пискатауэй, NJ  ; Хобокен, NJ: нажатие IEEE  ; Wiley-межнаука, 2004.

[4] 3GPP TS 36.212. "Мультиплексирование и кодирование канала". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group; Развитый Универсальный Наземный Радио-доступ (к E-UTRA). https://www.3gpp.org.

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

Смотрите также

Объекты

Функции

Блоки

Представленный в R2012a
Для просмотра документации необходимо авторизоваться на сайте