comm.ConvolutionalEncoder

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

Описание

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

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

  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

Структура Trellis сверточного кода

Задайте шпалеру как структуру 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

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

Примеры

свернуть все

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

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

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. Декодируйте данные с помощью алгоритма 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

Кодируйте и декодируйте последовательность бит, используя сверточный энкодер и декодер Витерби с заданным шаблоном прокола. Проверьте, что входной и выходной биты идентичны

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

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

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

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

Алгоритмы

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

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

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

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