exponenta event banner

коммуникация. APPDecoder

Декодирование сверточного кода с помощью метода APP

Описание

APPDecoder Система object™ выполняет декодирование апостериорной вероятности (APP) сверточного кода.

Чтобы декодировать сверточный код с помощью метода APP:

  1. Создать comm.APPDecoder и задайте его свойства.

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

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

Создание

Описание

appDec = comm.APPDecoder создает системный объект APP-декодера, appDec, который декодирует сверточный код с использованием метода APP.

пример

appDec = comm.APPDecoder(Name,Value) задает свойства, используя одну или несколько пар имя-значение. Например, comm.APPDecoder('Algorithm','True APP') конфигурирует объект System, appDec, чтобы реализовать истинное апостериорное декодирование вероятности. Заключите каждое имя свойства в кавычки.

пример

appDec = comm.APPDecoder(trellis,Name,Value) создает объект декодера APP, appDec, со свойством TrellisStructure, равным trellis.

Свойства

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

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

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

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

Описание решетки, указанное как структура MATLAB ®, которая содержит описание решетки для кода скорости K/N. K представляет количество входных битовых потоков, а N представляет количество выходных битовых потоков.

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

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

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

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

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

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

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

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

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

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

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

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

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

Метод окончания кодированного кадра, указанный как 'Truncated' или 'Terminated'. При установке для этого свойства значения 'Truncated', этот системный объект предполагает, что кодер останавливается после кодирования последнего символа во входном кадре. При установке для этого свойства значения 'Terminated', этот системный объект предполагает, что кодер заставляет решетку заканчивать каждый кадр в состоянии всех нулей посредством кодирования дополнительных символов. Если вы используете comm.ConvolutionalEncoder Системный объект для генерации закодированного кадра, это значение свойства должно соответствовать значению свойства сверточного кодера и этого системного объекта.

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

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

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

Число разрядов масштабирования, указанное как целое число в диапазоне [0, 8]. Это свойство определяет количество битов, которое декодер использует для масштабирования входных данных, чтобы избежать потери точности во время вычислений.

Зависимости

Чтобы включить это свойство, установите для свойства Algorithm значение 'Max*'.

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

Параметр для включения вывода кодированного битового логарифмического отношения правдоподобия (LLR), заданного как числовой или логический 1 (true) или 0 (false). Чтобы отключить второй вывод при вызове этого объекта System, установите для этого свойства значение 0 (false).

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

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

Описание

[LUD,LCD] = appDec(LU,LC) выполняет декодирование APP по последовательности LLR входных битов кодера, LUи последовательность LLR кодированных битов, LC. Объект System возвращает LUD и LCD. Эти выходные значения являются обновленными версиями LU и LCсоответственно и получают на основе информации кодера.

LUD = appDec(LU,LC) выполняет декодирование APP с помощью LCD вывод отключен. Как отключить LCD output, установите для свойства CodedBitLLLROutablePort значение 0 (false).

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

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

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

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

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

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

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

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

Обновленное значение LU, возвращаемое в виде вектора столбца с действительным значением.

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

Обновленное значение LC, возвращаемое в виде вектора столбца с действительным значением.

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

Примечание

Если сверточный код использует алфавит из 2n возможных символов, где n - количество битов на входной символ, то LC и LCD длина вектора равна L × n для некоторого положительного целого L. Аналогично, если декодированные данные используют алфавит из 2k выходных символов, где k - количество битов на выходной символ, то LU и LUD векторные длины L × k.

Этот системный объект принимает входной сигнал вектора столбца с любым положительным целым значением для L. Для входов переменного размера L может изменяться во время нескольких вызовов.

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

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

release(obj)

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

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

Примеры

свернуть все

Укажите дисперсию шума и длину кадра в битах. Создание сверточного кодера, модулятора PSK и объектов системы каналов AWGN.

noiseVar = 2e-1;
frameLength = 300;
convEncoder = comm.ConvolutionalEncoder('TerminationMethod','Truncated');
pskMod = comm.PSKModulator('BitInput',true,'PhaseOffset',0);
awgnChan = comm.AWGNChannel('NoiseMethod','Variance', ...
    'Variance',noiseVar);

Создание сверточного декодера APP, демодулятора PSK и системных объектов с частотой ошибок.

appDecoder = comm.APPDecoder(...
    'TrellisStructure',poly2trellis(7,[171 133]), ...
    'Algorithm','True APP','CodedBitLLROutputPort',false);
pskDemod = comm.PSKDemodulator('BitOutput',true,'PhaseOffset',0, ...
    'DecisionMethod','Approximate log-likelihood ratio', ...
    'Variance',noiseVar);     
errRate = comm.ErrorRate;

Передача сверточно закодированного битового потока 8-PSK-modulated через канал AWGN. Демодулируйте принятый сигнал, используя мягкое решение. Декодируйте демодулированный сигнал с помощью декодера APP.

for counter = 1:5
     data = randi([0 1],frameLength,1);
     encodedData = convEncoder(data);
     modSignal = pskMod(encodedData);
     receivedSignal = awgnChan(modSignal);
     demodSignal = pskDemod(receivedSignal);
     % The APP decoder assumes a polarization of the soft inputs that is
     % inverse to that of the demodulator soft outputs. Change the sign of
     % demodulated signal.
     receivedSoftBits = appDecoder(zeros(frameLength,1),-demodSignal);
     % Convert from soft-decision to hard-decision.
     receivedBits = double(receivedSoftBits > 0);
     % Count errors
     errorStats = errRate(data,receivedBits);
end

Отображение информации о частоте ошибок.

fprintf('Error rate = %f\nNumber of errors = %d\n', ...
     errorStats(1), errorStats(2))
Error rate = 0.000000
Number of errors = 0

Конкатенированные сверточные коды обеспечивают высокую надежность и имеют большую известность и использование в качестве турбокодов. comm.TurboEncoder и comm.TurboDecoder Системные объекты поддерживают только сверточные коды со скоростью 1/n. В этом примере показана параллельная конкатенация двух сверточных кодов скорости 2/3 для достижения эффективного турбокода скорости 1/3 с использованием comm.ConvolutionalEncoder и comm.APPDecoder Системные объекты.

Системные параметры

blkLength = 1024;          % Block length
EbNo = 0:5;                % Eb/No values to loop over
numIter = 3;               % Number of decoding iterations
maxNumBlks = 1e2;          % maximum number of blocks per Eb/No value

Параметры сверточного кодера/декодера

trellis = poly2trellis([5 4],[23 35 0; 0 5 13]);
k = log2(trellis.numInputSymbols);      % number of input bits
n = log2(trellis.numOutputSymbols);     % number of output bits
intrIndices = randperm(blkLength/k)';   % Random interleaving
decAlg = 'True App';                    % Decoding algorithm
modOrder = 2;                           % PSK-modulation order

Инициализация системных объектов

Инициализация объекта Systems для сверточного кодирования, декодирования APP, модуляции и демодуляции BPSK, канала AGWN и вычисления частоты ошибок. Выходные динамические биты демодуляции используют метод логарифмического отношения правдоподобия.

cEnc1 = comm.ConvolutionalEncoder('TrellisStructure',...
        trellis,'TerminationMethod','Truncated');
cEnc2 = comm.ConvolutionalEncoder('TrellisStructure',...
        trellis,'TerminationMethod','Truncated');
cAPPDec1 = comm.APPDecoder('TrellisStructure',trellis,...
            'TerminationMethod','Truncated','Algorithm',decAlg);
cAPPDec2 = comm.APPDecoder('TrellisStructure',trellis,...
            'TerminationMethod','Truncated','Algorithm',decAlg);

bpskMod = comm.BPSKModulator;
bpskDemod = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio', ...
    'VarianceSource','Input port');

awgnChan = comm.AWGNChannel('NoiseMethod','Variance', ...
    'VarianceSource','Input port');

bitError = comm.ErrorRate; % BER measurement

Цикл обработки кадров

Выполните цикл по диапазону значений Eb/N0, чтобы получить результаты для производительности BER. helperTurboEnc и helperTurboDec вспомогательные функции выполняют турбокодирование и декодирование.

ber = zeros(length(EbNo),1); 
bitsPerSymbol = log2(modOrder);
turboEncRate = k/(2*n);

for ebNoIdx = 1:length(EbNo)
    % Calculate the noise variance from EbNo
    EsNo = EbNo(ebNoIdx) + 10*log10(bitsPerSymbol);
    SNRdB = EsNo + 10*log10(turboEncRate); % Account for code rate
    noiseVar = 10^(-SNRdB/10);

    for  numBlks = 1:maxNumBlks 
        % Generate binary data
        data = randi([0 1],blkLength,1);

        % Turbo encode the data
        [encodedData,outIndices] = helperTurboEnc(data,cEnc1,cEnc2, ...
            trellis,blkLength,intrIndices);

        % Modulate the encoded data
        modSignal = bpskMod(encodedData);

        % Pass the modulated signal through an AWGN channel
        receivedSignal = awgnChan(modSignal,noiseVar);

        % Demodulate the noisy signal using LLR to output soft bits
        demodSignal = bpskDemod(receivedSignal,noiseVar);

        % Turbo decode the demodulated data
        receivedBits = helperTurboDec(-demodSignal,cAPPDec1,cAPPDec2, ...
            trellis,blkLength,intrIndices,outIndices,numIter); 
        
        % Calculate the error statistics
        errorStats = bitError(data,receivedBits);        
    end
    
    ber(ebNoIdx) = errorStats(1);
    reset(bitError);
end

Показать результаты

В то время как практические беспроводные системы, такие как LTE и CCSDS, задают сверточные коды базовой скорости 1/n для турбокодов, результаты показывают, что использование сверточных кодов более высокой скорости в качестве турбокодов жизнеспособно.

figure; 
semilogy(EbNo, ber, '*-');
grid on; 
xlabel('E_b/N_0 (dB)'); 
ylabel('BER'); 
title('High Rate Convolutional Codes for Turbo Coding'); 
legend(['N = ' num2str(blkLength) ', ' num2str(numIter) ' iterations']);

Figure contains an axes. The axes with title High Rate Convolutional Codes for Turbo Coding contains an object of type line. This object represents N = 1024, 3 iterations.

Вспомогательные функции

function [yEnc,outIndices] = helperTurboEnc(data,hCEnc1,hCEnc2,trellis,blkLength,intrIndices)
% Turbo encoding using two parallel convolutional encoders.
% No tail bits handling and assumes no output stream puncturing.

    % Trellis parameters
    k = log2(trellis.numInputSymbols);
    n = log2(trellis.numOutputSymbols);
    cLen = blkLength*n/k;

    punctrVec = [0;0;0;0;0;0];      % assumes all streams are output
    N = length(find(punctrVec==0));

    % Encode random data bits
    y1 = step(hCEnc1, data);
    y2 = step(hCEnc2, reshape(intrlv(reshape(data, k, [])',intrIndices)', [], 1));
    y1D = reshape(y1(1:cLen), n, []);
    y2D = reshape(y2(1:cLen), n, []);
    yDTemp = [y1D; y2D];
    y = yDTemp(:);

    % Generate output indices vector using puncturing vector
    idx = 0 : 2*n : (blkLength - 1)*2*(n/k);
    punctrVecIdx = find(punctrVec==0);
    dIdx = repmat(idx, N, 1) + punctrVecIdx;
    outIndices = dIdx(:);
    yEnc = y(outIndices);
end

function yDec = helperTurboDec(yEnc,cAPPDec1,cAPPDec2,trellis,blkLength,intrIndices,inIndices,numIter)
% Turbo decoding using two a-posteriori probability (APP) decoders

    % Trellis parameters
    k = log2(trellis.numInputSymbols);
    n = log2(trellis.numOutputSymbols);
    rCodLen = 2*(n/k)*blkLength;
    typeyEnc = class(yEnc);

    % Re-order encoded bits according to outIndices
    x = zeros(rCodLen, 1);
    x(inIndices) = yEnc;

    % Generate output of first encoder
    yD = reshape(x(1:rCodLen), 2*n, []);
    lc1D = yD(1:n, :);
    Lc1_in = lc1D(:);

    % Generate output of second encoder
    lc2D   = yD(n+1:2*n, :);
    Lc2_in = lc2D(:);

    % Initialize unencoded data input
    Lu1_in = zeros(blkLength, 1, typeyEnc);

    % Turbo Decode
    out1 = zeros(blkLength/k, k, typeyEnc);
    for iterIdx = 1 : numIter
        [Lu1_out, ~] = step(cAPPDec1, Lu1_in, Lc1_in);
        tmp = Lu1_out(1:blkLength);
        Lu2_in = reshape(tmp, k, [])';
        [Lu2_out, ~] = step(cAPPDec2, ...
            reshape(Lu2_in(intrIndices, :)', [], 1), Lc2_in);
        out1(intrIndices, :) = reshape(Lu2_out(1:blkLength), k, [])';
        Lu1_in = reshape(out1', [], 1);
    end
    % Calculate llr and decoded bits for the final iteration
    llr = reshape(out1', [], 1) + Lu1_out(1:blkLength);
    yDec = cast((llr>=0), typeyEnc);
end

Алгоритмы

Этот системный объект реализует алгоритм декодирования APP с мягким входом-мягким выходом согласно [1] и [2].

'True APP' вариант Algorithm свойство реализует декодирование APP по уравнениям 20-23 в разделе V [1]. Чтобы набрать скорость, 'Max*' и 'Max' значения Algorithm приближенные выражения свойства, такие как log∑iexp (ai) другими величинами. 'Max' в качестве аппроксимации используется max (ai). 'Max*' опция использует max (ai) плюс поправочный член, заданный выражением ln (1 + exp (| ai − 1 − ai |)).

Установка Algorithm свойство для 'Max*' включает NumScalingBits свойства данного объекта System. Это свойство обозначает количество битов, на которое этот системный объект масштабирует обрабатываемые данные (умножает входные данные на 2NumScalingBits и делит предварительный выход на один и тот же коэффициент). Используйте это свойство, чтобы избежать потери точности во время вычислений.

Ссылки

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

[2] Витерби, A.J. «Интуитивное обоснование и упрощенная реализация декодера MAP для сверточных кодов». Журнал IEEE по отдельным областям в сообщениях № 16, № 2 (февраль 1998 года): 260-64. https://doi.org/10.1109/49.661114.

[3] Бенедетто, С. и Г. Монторси. «Производительность непрерывных и блоковых декодированных турбокодов». IEEE Communications Letters 1, No. 3 (май 1997 года): 77-79. https://doi.org/10.1109/4234.585802.

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

.
Представлен в R2012a