comm.APPDecoder

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

Описание

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

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

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

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

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

Создание

Описание

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

пример

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

пример

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

Свойства

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Зависимости

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

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

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

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

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

Описание

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

LUD = appDec(LU,LC) выполняет декодирование APP с помощью LCD выход отключен. Чтобы отключить LCD выход, установите свойство CodedBitLLROutputPort равным 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 могут варьироваться во время нескольких вызовов.

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

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

release(obj)

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

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

Примеры

свернуть все

Задайте отклонение шума и длину системы координат в битах. Создайте сверточный энкодер, 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

Конкатенированные сверточные коды обеспечивают высокую надежность и получили известность и использование в качестве турбокодов. The 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. The 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].

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

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

Ссылки

[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] Бенедетто, С. и Г. Монторси. Эффективность непрерывного и блокированного декодированного турбо- Коды. IEEE Communications Letters 1, № 3 (май 1997 года): 77-79. https://doi.org/10.1109/4234.585802.

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

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