comm.TurboDecoder

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

Описание

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

Для декодирования входного сигнала с использованием параллельной конкатенированной схемы декодирования:

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

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

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

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

пример

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

пример

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

Свойства

расширить все

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

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

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

Trellis описание составного сверточного кода, заданное как структура, которая содержит описание решетки для скорости KN кода. K - количество входа битовых потоков, а N - количество выхода битовых потоков.

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник индексов перемежителя, заданный как 'Property' или 'Input port'.

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

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

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

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

Зависимости

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

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

Источник индексов входа, заданный как 'Auto', 'Property', или 'Input port'.

  • Когда вы устанавливаете это свойство на 'Auto'объект вычисляет входные индексы, которые предполагают, что второй систематический поток проколот, и все хвостовые биты включены во вход.

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

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

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

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

Зависимости

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

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

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

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

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

Зависимости

Это включает это свойство, задайте свойство Algorithm равным 'Max*'.

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

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

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

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

Описание

пример

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

пример

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

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

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

расширить все

Параллельное конкатенированное кодовое слово, заданное как вектор-столбец длины M, где M - длина параллельного конкатенированного кодового слова.

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

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

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

Зависимости

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

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

Входные индексы для упорядоченное расположение и прокалывания, используемые на полностью закодированных данных, заданные как вектор-столбец из целых чисел. Длина inindices вектор должен равняться длине вектора входных данных codeword. Значения элемента в inindices вектор должен относиться к полностью закодированным данным, включая конечные биты для схемы кодирования для всех потоков.

Зависимости

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

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

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

расширить все

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

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

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

release(obj)

расширить все

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

Примеры

свернуть все

Определите выходные индексы при помощи OutputIndices свойство для турбокодирования и определения входных индексов при помощи InputIndices свойство для турбодекодирования. Покажите полноразмерное пунктированное кодирование и декодирование для кода со скоростью 1/2 и длины 10-битного блока.

Инициализация параметров

Задайте параметры, чтобы инициализировать энкодер.

blkLen = 10;
trellis = poly2trellis(4,[13 15],13);
n = log2(trellis.numOutputSymbols);
mLen = log2(trellis.numStates);

Полноразмерная кодировка и декодирование

Инициализируйте переменные и Системные объекты турбокодирования и декодирования для полноразмерного кодирования. Турбокодируйте и декодируйте сообщение. Отобразите скорость турбокодирования. Проверьте длину закодированного выхода в зависимости от длины вектора выходных индексов.

fullOut = (1:(mLen+blkLen)*2*n)';
outLen = length(fullOut);
netRate = blkLen/outLen;
data = randi([0 1],blkLen,1);
intIndices  = randperm(blkLen);

turboEnc = comm.TurboEncoder('TrellisStructure',trellis);
turboEnc.InterleaverIndices = intIndices;
turboEnc.OutputIndicesSource = 'Property';
turboEnc.OutputIndices = fullOut;

turboDec = comm.TurboDecoder('TrellisStructure',trellis);
turboDec.InterleaverIndices = intIndices;
turboDec.InputIndicesSource = 'Property';
turboDec.InputIndices = fullOut;

encMsg = turboEnc(data);      % Encode

disp(['Turbo coding rate: ' num2str(netRate)])
Turbo coding rate: 0.19231
encOutLen = length(encMsg)    % Display encoded length
encOutLen = 52
isequal(encOutLen,outLen)     % Check lengths
ans = logical
   1

rxMsg = turboDec(2*encMsg-1); % Decode

isequal(data, rxMsg)          % Compare bits with decoded bits
ans = logical
   1

Проколотая кодировка и декодирование

Задайте выходные индексы для прокалывания второго систематического потока при помощи getTurboIOIndices функция. Инициализируйте переменные и Системные объекты турбокодирования и декодирования для пунктированного кодирования. Турбокодируйте и декодируйте сообщение. Отобразите скорость турбокодирования. Проверьте длину закодированного выхода в зависимости от длины вектора выходных индексов.

puncOut = getTurboIOIndices(blkLen,n,mLen);
outLen = length(puncOut);
netRate = blkLen/outLen;
data = randi([0 1],blkLen,1);
intIndices  = randperm(blkLen);

turboEnc = comm.TurboEncoder('TrellisStructure',trellis);
turboEnc.InterleaverIndices = intIndices;
turboEnc.OutputIndicesSource = 'Property';
turboEnc.OutputIndices = puncOut;

turboDec = comm.TurboDecoder('TrellisStructure',trellis);
turboDec.InterleaverIndices = intIndices;
turboDec.InputIndicesSource = 'Property';
turboDec.InputIndices = puncOut;

encMsg = turboEnc(data);   % Encode

disp(['Turbo coding rate: ' num2str(netRate)])
Turbo coding rate: 0.25641
encOutLen = length(encMsg) % Display encoded length
encOutLen = 39
isequal(encOutLen, outLen) % Check lengths
ans = logical
   1

rxMsg = turboDec(2*encMsg-1); % Decode

isequal(data, rxMsg)          % Compare bits with decoded bits
ans = logical
   1

Сравнение полных и пунктированных выходов

Выходные выходы энкодера чередуют отдельные битовые потоки. Третий бит каждого 4-битного кортежа удаляется из полноразмерного кода, чтобы получить проколотый код. Этот третий выходной поток битов соответствует второму систематическому потоку битов. Отобразите индексы полноразмерного кода и индексы проколотого кода, чтобы показать, что третий бит каждого 4-битного кортежа проколот.

fullOut'
ans = 1×52

     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23    24    25    26    27    28    29    30    31    32    33    34    35    36    37    38    39    40    41    42    43    44    45    46    47    48    49    50

puncOut'
ans = 1×39

     1     2     4     5     6     8     9    10    12    13    14    16    17    18    20    21    22    24    25    26    28    29    30    32    33    34    36    37    38    40    41    42    44    45    46    48    49    50    52

Моделируют передачу и прием данных BPSK по каналу AWGN с помощью турбокодирования и декодирования.

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

Сгенерируйте случайные индексы перемежителя.

intrlvrIndices = randperm(L);

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

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 или 1500 битам. Поскольку размер пакета изменяется, индексы перемежителя подаются в турбодекодер и энкодер как входной параметр связанного с ними системного объекта. Сравнение результатов турбокодированной частоты битовой ошибки с незакодированными результатами битовой ошибки.

Инициализация симуляции

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

modOrder = 16;               % Modulation order
bps = log2(modOrder);        % Bits per symbol
EbNo = (2:0.5:4);            % 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(1963);

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

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. Сгенерируйте индексы перемежителя.

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

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

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

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

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

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

ber = zeros(1,length(EbNo));
for k = 1:length(EbNo)
    % numFrames = 100;
    errorStats = zeros(1,3);
    %for pktIdx = 1:numFrames
    L = 500*randi([1 3],1,1);         % Packet length in bits
    M = L*(2*n - 1) + 2*numTails;     % Output codeword packet length
    rate = L/M;                       % Coding rate for current packet
    snrdB = EsNo(k) + 10*log10(rate); % Signal to noise ratio in dB
    noiseVar = 1./(10.^(snrdB/10));   % Noise variance
    
    while errorStats(2) < 100 && errorStats(3) < 1e7
        data = randi([0 1],L,1);
        intrlvrIndices = randperm(L);
        encodedData = turboEnc(data,intrlvrIndices);
        modSignal = qammod(encodedData,modOrder, ...
            'InputType','bit','UnitAveragePower',true);
        rxSignal = awgn(modSignal,snrdB);
        demodSignal = qamdemod(rxSignal,modOrder,'OutputType','llr', ...
            'UnitAveragePower',true,'NoiseVariance',noiseVar);
        rxBits = turboDec(-demodSignal,intrlvrIndices); % Demodulated signal is negated
        errorStats = errRate(data,rxBits);
    end
    % Save the BER data and reset the bit error rate object
    ber(k) = errorStats(1);
    reset(errRate)
end

Графическое изображение результатов

Постройте график частоты битовой ошибки и сравните ее с незакодированной частотой битовой ошибки.

semilogy(EbNo,ber,'-o')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
uncodedBER = berawgn(EbNo,'qam',modOrder); % Estimate of uncoded BER
hold on
semilogy(EbNo,uncodedBER)
legend('Turbo','Uncoded','location','sw')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Turbo, Uncoded.

Подробнее о

расширить все

Ссылки

[1] Бенедетто, С., Г. Монторси, Д. Дивсалар и Ф. Поллара. Модуль Soft-Input Soft-Output MAP для декодирования параллельных и последовательных конкатенированных кодов. Прогресс лаборатории реактивного движения TDA, 42-127 (ноябрь 1996 года).

[2] Viterbi, A.J. «Интуитивное обоснование и упрощенная реализация декодера MAP для сверточных кодов». IEEE Journal on Selected Areas in Communications 16, no. 2 (February 1998): 260-64. https://doi.org/10.1109/49.661114.

[3] Berrou, C., A. Glavieux, and P. Thitimajshima. Near Shannon Limit Error-Correcting Coding and Decoding: Turbo-Codes (неопр.) (недоступная ссылка). Материалы Международной конференции по коммуникациям ICC 93 - IEEE, Женева, Швейцария, май 1993, 1064-70 года. https://doi.org/10.1109/icc.1993.397441.

[4] Шлегель, Кристиан и Ланс Перес. Trellis и турбокодирование. Серия прессы IEEE по цифровой и мобильной связи. Piscataway, NJ; Hoboken, NJ: IEEE Press; Wiley-Interscience, 2004.

[5] 3GPP TS 36.212. «Мультиплексирование и канальное кодирование». 3rd Генерация Partnership Project; Группа технических спецификаций Radio Доступа Network; Evolved Universal Terrestrial Radio Access (E-UTRA). https://www.3gpp.org.

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

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