exponenta event banner

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

Сверточное кодирование двоичных данных

Описание

ConvolutionalEncoder объект кодирует последовательность двоичных входных векторов для получения последовательности двоичных выходных векторов.

Для сверточного кодирования двоичного сигнала:

  1. Определите и настройте сверточный объект кодера. См. раздел Строительство.

  2. Звонить step кодировать последовательность двоичных входных векторов для получения последовательности двоичных выходных векторов в соответствии со свойствами comm.ConvolutionalEncoder. Поведение step относится к каждому объекту на панели инструментов.

Примечание

Начиная с R2016b, вместо использования step для выполнения операции, определенной системным object™, можно вызвать объект с аргументами, как если бы это была функция. Например, y = step(obj,x) и y = obj(x) выполнять эквивалентные операции.

Строительство

H = comm.ConvolutionalEncoder создает объект System, H, который сверточно кодирует двоичные данные.

H = comm.ConvolutionalEncoder(Name,Value) создает сверточный объект кодера, H, каждое указанное свойство имеет заданное значение. Можно указать дополнительные аргументы пары имя-значение в любом порядке как (Name1,Value1,...,NameN,ValueN).

H = comm.ConvolutionalEncoder(TRELLIS,Name,Value) создает сверточный объект кодера, H Этот объект имеет TrellisStructure свойство имеет значение TRELLISи другие указанные свойства имеют указанные значения.

Свойства

TrellisStructure

Решетчатая структура сверточного кода

Укажите решетку как структуру MATLAB, содержащую описание решетки сверточного кода. Используйте istrellis для проверки того, является ли структура действительной решетчатой структурой. Значение по умолчанию является результатом poly2trellis(7, [171 133]).

TerminationMethod

Метод завершения кодированного кадра

Укажите, как закодированный кадр завершается как один из Continuous | Truncated | Terminated. Значение по умолчанию: Continuous. При установке для этого свойства значения Continuousобъект сохраняет состояния кодера в конце каждого входного вектора для использования со следующим входным вектором. При установке для этого свойства значения Truncatedобъект обрабатывает каждый входной вектор независимо. Состояния кодера сбрасываются в начале каждого входного вектора. Если установить InitialStateInputPort свойство для falseобъект сбрасывает свои состояния в состояние «все нули». Если установить InitialStateInputPort свойство для true, объект сбрасывает состояния в значения, указанные в начальных состояниях step ввод способа. При установке для этого свойства значения Terminatedобъект обрабатывает каждый входной вектор независимо. Для каждого входного вектора объект использует дополнительные биты для установки состояний кодера в состояние «все нули» в конце вектора. Для кода скорости K/N метод шага выводит вектор с длиной N × (L + S) K, где S = constraintLength-1 (или, в случае нескольких длин ограничения, S = сумма (constraintLength (i) -1)). L - длина входа вstep способ.

ResetInputPort

Включить вход сброса кодера

Установить для этого свойства значение true для включения дополнительного ввода в step способ. Значение по умолчанию: false. Когда этот дополнительный вход сброса является ненулевым значением, внутренние состояния кодера сбрасываются до их начальных условий. Это свойство применяется при установке TerminationMethod свойство для Continuous.

DelayedResetAction

Сброс выходного сигнала задержки

Установить для этого свойства значение true для задержки сброса вывода объекта. Значение по умолчанию: false. При установке для этого свойства значения trueсброс внутренних состояний кодера происходит после того, как объект вычисляет кодированные данные. При установке для этого свойства значения falseсброс внутренних состояний кодера происходит до того, как объект вычисляет кодированные данные. Это свойство применяется при установке ResetInputPort свойство для true.

InitialStateInputPort

Включить ввод начального состояния

Установить для этого свойства значение true для включения step ввод способа, который позволяет определить начальное состояние кодера для каждого входного вектора. Значение по умолчанию: false. Это свойство применяется при установке TerminationMethod свойство для Truncated.

FinalStateOutputPort

Включить вывод конечного состояния

Установите для этого свойства значение true, чтобы получить конечное состояние кодера через step выход способа. Значение по умолчанию: false. Это свойство применяется при установке TerminationMethod свойство для Continuous или Truncated.

PuncturePatternSource

Источник прокола

Укажите источник образца прокола как один из None | Property. Значение по умолчанию: None. При установке для этого свойства значения None объект не применяет прокалывание. При установке для этого свойства значения Propertyобъект прокалывает код. Это прокалывание основано на векторе образца прокола, указанном в PuncturePattern собственность. Это свойство применяется при установке TerminationMethod свойство для Continuous или Truncated.

PuncturePattern

Вектор прокола

Укажите шаблон прокола, используемый для прокола кодированных данных в виде вектора столбца. Значение по умолчанию: [1; 1; 0; 1; 0; 1]. Вектор содержит 1s и 0s, где 0 указывает проколотые или исключенные биты. Это свойство применяется при установке TerminationMethod свойство для Continuous или Truncated и PuncturePatternSource свойство для Property.

Методы

шагСверточное кодирование двоичных данных
Общие для всех системных объектов
release

Разрешить изменение значения свойства объекта системы

reset

Сброс внутренних состояний объекта System

Примеры

свернуть все

Передавать сверточно кодированный 8-DPSK модулированный битовый поток через канал AWGN. Затем демодулируют и декодируют с помощью декодера Витерби.

Создайте необходимые системные объекты.

hConEnc = comm.ConvolutionalEncoder;
hMod = comm.DPSKModulator('BitInput',true);
hChan = comm.AWGNChannel('NoiseMethod', ...
    'Signal to noise ratio (SNR)',...
    'SNR',10);
hDemod = comm.DPSKDemodulator('BitOutput',true);
hDec = comm.ViterbiDecoder('InputFormat','Hard');
hError = comm.ErrorRate('ComputationDelay',3,'ReceiveDelay', 34);

Обработка данных выполняется с помощью следующих шагов:

  1. Генерировать случайные биты

  2. Сверточное кодирование данных

  3. Применение модуляции DPSK

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

  5. Демодуляция шумного сигнала

  6. Декодирование данных с помощью алгоритма Витерби

  7. Сбор статистики об ошибках

for counter = 1:20
    data = randi([0 1],30,1);
    encodedData = step(hConEnc, data);
    modSignal = step(hMod, encodedData);
    receivedSignal = step(hChan, modSignal);
    demodSignal = step(hDemod, receivedSignal);
    receivedBits = step(hDec, demodSignal);
    errors = step(hError, data, receivedBits);
end

Отображение количества ошибок.

errors(2)
ans = 3

Кодирование и декодирование последовательности битов с использованием сверточного кодера и декодера Витерби с определенной комбинацией проколов. Убедитесь, что входные и выходные биты идентичны

Определите матрицу шаблона прокола и преобразуйте ее в векторную форму для использования с объектами Encoder и Decoder.

pPatternMat = [1 0 1;1 1 0];
pPatternVec = reshape(pPatternMat,6,1);

Создание сверточного кодера и декодера Витерби, в котором шаблон прокола определяется pPatternVec.

ENC = comm.ConvolutionalEncoder(...
    'PuncturePatternSource','Property', ...
    'PuncturePattern',pPatternVec);

DEC = comm.ViterbiDecoder('InputFormat','Hard', ...
    'PuncturePatternSource','Property',...
    'PuncturePattern',pPatternVec);

Создайте счетчик частоты ошибок с соответствующей задержкой приема.

ERR = comm.ErrorRate('ReceiveDelay',DEC.TracebackDepth);

Кодирование и декодирование последовательности случайных битов.

dataIn = randi([0 1],600,1);

dataEncoded = step(ENC,dataIn);

dataOut = step(DEC,dataEncoded);

Убедитесь в отсутствии ошибок в выходных данных.

errStats = step(ERR,dataIn,dataOut);
errStats(2)
ans = 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

Алгоритмы

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

Рабочий режим Reset на ненулевом входе через параметр port block соответствует ResetInputPort собственность.

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

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