comm.TurboDecoder

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

Описание

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

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

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

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

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

Создание

Описание

turbodec = comm.TurboDecoder создает турбо Системный объект декодера. Этот объект использует декодер составляющей по опыту вероятности (APP), чтобы итеративно декодировать конкатенированные параллелью convolutionally закодированные входные данные.

пример

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

пример

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

Свойства

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

Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и 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 индексы, interlvrindices, установите, когда вы вызовете объект. Длина вектора и значения для interleaver индексов и закодированного входного сигнала могут измениться с каждым вызовом объекта.

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

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

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

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

Зависимости

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

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

Декодирование алгоритма в виде 'True APP'Max , или 'Max'. Когда вы устанавливаете это свойство на 'True APP', объект реализует истинное декодирование APP. Когда вы устанавливаете это свойство на 'Max*' или 'Max', объект использует приближения, чтобы увеличить скорость расчетов. Для получения дополнительной информации смотрите Декодер APP.

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

Количество масштабирующихся битов в виде целого числа в области значений [0, 8]. Это наборы свойств количество битов составляющее использование декодеров, чтобы масштабировать входные данные, чтобы не терять точность во время расчетов. Составляющие декодеры умножают вход на 2 NumScalingBits и разделите предварительный выход на тот же фактор. Для получения дополнительной информации смотрите Декодер APP.

Зависимости

Это включает это свойство, установило свойство Algorithm на 'Max*'.

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

Количество декодирования итераций в виде положительного целого числа. Это наборы свойств количество декодирования итераций, используемых для каждого вызова объекта. Объект выполняет итерации и обеспечивает обновления отношений логарифмической правдоподобности (LLR) незакодированных выходных битов. Выход объекта является трудным решением выход итогового обновления LLR.

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

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

Описание

пример

decmsg = turbodec(codeword) декодирует входную кодовую комбинацию с помощью конкатенированной сверточной схемы декодирования параллели, которая задана структурой решетки и interleaver индексами. turbodec возвращается двоичный файл декодировал данные. Для получения дополнительной информации см. Параллельную Конкатенированную Сверточную Схему Декодирования.

пример

decmsg = turbodec(codeword,interlvrindices) дополнительно задает interleaver индексы. Чтобы включить этот синтаксис, установите свойство InterleaverIndicesSource на 'Input port'. interleaver индексы задают отображение, используемое, чтобы переставить вход в декодере.

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

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

Параллель конкатенировала кодовую комбинацию в виде вектор-столбца длины M, где M является длиной конкатенированной кодовой комбинации параллели.

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

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

Зависимости

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

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

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

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

Декодируемое сообщение, возвращенное как вектор столбца двоичных данных из длины L, где L является длиной декодируемого выходного сигнала. Этот выходной сигнал совпадает с типом данных codeword входной параметр.

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

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

release(obj)

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

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

Примеры

свернуть все

Симулируйте передачу и прием данных о 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] Бенедетто, S., Г. Монторси, Д. Дивсэлэр и Ф. Поллара. "Модуль Мягкого Входа Мягкого Выхода Максимума следующего (MAP), чтобы декодировать параллельные и последовательные каскадные коды". Лаборатория реактивного движения отчет о выполнении работ TDA, 42–127, (ноябрь 1996).

[2] Viterbi, A.J. “Интуитивное Выравнивание и Упрощенное внедрение Декодера MAP для Сверточных кодов”. Журнал IEEE на Выбранных областях в Коммуникациях 16, № 2 (февраль 1998): 260–64. https://doi.org/10.1109/49.661114.

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

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

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

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

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

Объекты

Функции

Блоки

Представленный в R2012a