comm.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') конфигурирует Системный объект, 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- 2K.

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

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

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

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

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

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

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

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

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

Зависимости

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

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

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

Типы данных: логический

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

Описание

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

LUD = appDec(LU,LC) выполняет декодирование APP с LCD выведите отключенный. Отключить LCD выведите, установите свойство CodedBitLLROutputPort на 0 ложь).

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

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

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

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

Последовательность LLRs закодированных данных в виде вектор-столбца с действительным знаком. Положительный мягкий вход интерпретирован как логический 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;

Передайте модулируемый поток битов convolutionally закодированных 8 PSK через канал 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, задают основу rate-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 object. The axes object 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 свойство аппроксимированные выражения как logiexp(ai) другими количествами. 'Max' опция использует макс. (ai) в качестве приближения. 'Max*' опция использует макс. (ai) плюс термин коррекции, данный выражением ln(1+exp(|ai1ai|)).

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

Ссылки

[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] Бенедетто, S. и Г. Монторси. “Эффективность Непрерывных и Blockwise Декодируемые Турбокоды”. Коммуникационные Буквы IEEE 1, № 3 (май 1997): 77–79. https://doi.org/10.1109/4234.585802.

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

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

Функции

Объекты

Блоки

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