comm.ConvolutionalEncoder

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

Описание

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

convolutionally кодировать двоичное сообщение:

  1. Задайте и настройте свой сверточный объект энкодера. Смотрите Конструкцию.

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

Примечание

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

Конструкция

H = comm.ConvolutionalEncoder создает Системный объект, 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 код, метод step выводит вектор с длиной 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

Сбросьте внутренние состояния Системного объекта

Примеры

свернуть все

Передайте модулируемый поток битов convolutionally закодированного 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. Convolutionally кодируют данные

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

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

  5. Демодулируйте сигнал с шумом

  6. Декодируйте данные с помощью алгоритма Viterbi

  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

Закодируйте и декодируйте последовательность битов с помощью сверточного энкодера и Декодера Витерби с заданным шаблоном прокола. Проверьте, что биты ввода и вывода идентичны

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

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, задают основу 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. 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

Алгоритмы

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

Режим работы параметры блоков Reset on nonzero input via port соответствует ResetInputPort свойство.

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

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

|

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