comm.ConvolutionalEncoder

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

Описание

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

К сверточному кодированию двоичных данных:

  1. Создайте comm.ConvolutionalEncoder объект и набор его свойства.

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

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?

Создание

Описание

пример

convencoder = comm.ConvolutionalEncoder создает сверточный Системный объект энкодера.

пример

convencoder = comm.ConvolutionalEncoder(trellis) устанавливает TrellisStructure свойство к trellis.

пример

convencoder = comm.ConvolutionalEncoder(___,Name,Value) Свойства наборов с помощью одних или нескольких аргументов name-value в дополнение к любым комбинациям аргументов в предыдущих синтаксисах. Например, 'TerminationMethod','Continuous' задает метод завершения как непрерывный, чтобы сохранить состояния энкодера в конце каждого входного вектора для использования со следующим входным вектором.

Свойства

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

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

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

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

Описание решетки сверточного кода в виде структуры, которая содержит описание решетки для уровня K ∕ код N. K является количеством входных потоков битов, и N является количеством выходных потоков битов.

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

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

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

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

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

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

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

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

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

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

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

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

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

Метод завершения закодированной системы координат в виде одного из этих значений.

  • 'Continuous' — Системный объект сохраняет состояния энкодера в конце каждого входного вектора для использования со следующим входным вектором.

  • 'Truncated' — Системный объект обрабатывает каждый входной вектор независимо. Состояния энкодера сбрасываются в начале каждого входного вектора. Если вы устанавливаете InitialStateInputPort свойство к 0 ложь), объект сбрасывает свои состояния ко все-нулевому состоянию. Если вы устанавливаете InitialStateInputPort свойство к 1TRUE), объект сбрасывает свои состояния к значениям, которые вы задаете в InitialStateInputPort входной параметр.

  • 'Terminated' — Системный объект обрабатывает каждый входной вектор независимо. Для каждого входного вектора объект использует дополнительные биты, чтобы установить состояния энкодера на все-нулевые состояния в конце вектора. Для уровня K/N код, объектные выходные параметры вектор из длины N×(L+S)K, где S = constraintLength – 1 (или, в случае нескольких продолжительностей ограничения, S = сумма (constraintLength (i) –1)). L является длиной входа. constraintLength – 1 задан как log2 (NumStates).

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

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

Зависимости

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

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

Опция, чтобы задержать выходной сброс в виде одного из этих логических значений.

  • 1 TRUE) — Сброс внутренних состояний энкодера происходит после того, как объект вычисляет закодированные данные.

  • 0 ложь) — Сброс внутренних состояний энкодера происходит, прежде чем объект вычисляет закодированные данные.

Зависимости

Чтобы включить это свойство, установите ResetInputPort свойство к 1 TRUE).

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

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

Зависимости

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

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

Опция, чтобы включить конечному состоянию выход в виде логического 1 TRUE) или 0 ложь). Установите это свойство на 1 TRUE) получить конечное состояние энкодера как выход.

Зависимости

Чтобы включить это свойство, установите TerminationMethod свойство к 'Continuous' или 'Truncated'.

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

Источник шаблона прокола в виде одного из этих значений.

  • 'None' — Объект не применяет прокалывание.

  • 'Property' — Объект прокалывает код. Это прокалывание основано на векторе шаблона прокола, который вы задаете для PuncturePattern свойство.

Зависимости

Чтобы включить это свойство, установите TerminationMethod свойство к 'Continuous' или 'Truncated'.

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

Проколите вектор шаблона, чтобы проколоть закодированные данные в виде вектор-столбца. Вектор должен содержать 1s и 0s, где 0 указывает на положение проколотых битов или исключенных битов.

Зависимости

Чтобы включить это свойство, установите TerminationMethod свойство к 'Continuous' или 'Truncated' и PuncturePatternSource свойство к 'Property'.

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

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

Описание

пример

codeword = convencoder(message) кодирует входной сигнал с помощью сверточной схемы кодирования, заданной структурой решетки. codeword закодированная кодовая комбинация. message и codeword вектор-столбцы числовых, логических, или значений фиксированной точки без знака с размером слова 1 (fi объект (Fixed-Point Designer)).

codeword = convencoder(message,initstate) задает начальное состояние энкодера для каждого входного вектора. Чтобы включить этот синтаксис, установите TerminationMethod свойство к 'Truncated' и InitialStateInputPort свойство к 1 TRUE).

codeword = convencoder(message,resetstate) задает вход, чтобы сбросить внутренние состояния энкодера. Чтобы включить этот синтаксис, установите TerminationMethod свойство к 'Continuous' и ResetInputPort свойство к 1 TRUE).

[codeword,finalstate] = convencoder(message) также возвращает конечное состояние энкодера. Чтобы включить этот синтаксис, установите FinalStateOutputPort свойство к 1 TRUE) и TerminationMethod свойство к 'Continuous' или 'Truncated'.

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

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

Входной сигнал в виде вектор-столбца с бинарным знаком.

Типы данных: double | int8 | fi(data,0,1)

Начальное состояние энкодера в виде целого числа.

Зависимости

Чтобы включить этот аргумент, установите TerminationMethod свойство к 'Truncated' и InitialStateInputPort свойство к 1 TRUE).

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

Сбросьте для внутренних состояний энкодера в виде числового или логического 1 TRUE) или 0 ложь).

Зависимости

Чтобы включить этот аргумент, установите TerminationMethod свойство к 'Continuous' и ResetInputPort свойство к 1 TRUE).

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

Выходные аргументы

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

Convolutionally закодировал сообщение, возвращенное как вектор-столбец с бинарным знаком. Этот выходной вектор имеет совпадающий тип данных и ориентацию как вход message.

Когда сверточный энкодер представляет уровень K/N код, длина входного вектора равняется K ×L для некоторого положительного целочисленного L. Объект устанавливает длину этого выходного вектора к L ×N.

Типы данных: double | int8 | fi(data,0,1)

Конечное состояние энкодера, возвращенного как целое число.

Зависимости

Чтобы включить этот аргумент, установите TerminationMethod свойство к 'Continuous' или 'Truncated'.

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

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

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

release(obj)

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

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

Примеры

свернуть все

Передайте модулируемый поток битов convolutionally закодированных 8 дифференциальных манипулирований сдвига фазы (DPSK) через канал аддитивного белого гауссова шума (AWGN). Затем демодулируйте и декодируйте модулируемый поток битов с помощью Декодера Витерби.

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

conEnc = comm.ConvolutionalEncoder;
modDPSK = comm.DPSKModulator('BitInput',true);
chan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (SNR)','SNR',10);
demodDPSK = comm.DPSKDemodulator('BitOutput',true);
vDec = comm.ViterbiDecoder('InputFormat','Hard');
error = 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 = conEnc(data);
    modSignal = modDPSK(encodedData);
    receivedSignal = chan(modSignal);
    demodSignal = demodDPSK(receivedSignal);
    receivedBits = vDec(demodSignal);
    errors = error(data,receivedBits);
end

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

errors(2)
ans = 3

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

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

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

Создайте сверточный энкодер и Декодер Витерби, в котором шаблон прокола задан pPatternVec.

conEnc = comm.ConvolutionalEncoder('PuncturePatternSource','Property','PuncturePattern',pPatternVec);
viDec = comm.ViterbiDecoder('InputFormat','Hard','PuncturePatternSource','Property', ...
        'PuncturePattern',pPatternVec);

Создайте коэффициент ошибок, отвечают соответствующей задержкой приема.

error = comm.ErrorRate('ReceiveDelay',viDec.TracebackDepth);

Закодируйте последовательность случайных битов, и затем декодируйте закодированное сообщение.

dataIn = randi([0 1],600,1);
dataEncoded = conEnc(dataIn);
dataOut = viDec(dataEncoded);

Проверьте, что никакие ошибки не существуют в выходных данных.

errStats = error(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 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

Больше о

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

Ссылки

[1] Кларк, Джордж К. и J. Затвор Каин. Кодирование с коррекцией ошибок для цифровой связи. Приложения коммуникационной теории. Нью-Йорк: нажатие пленума, 1981.

[2] Gitlin, Ричард Д., Иеремия Ф. Хейз и Стивен Б. Вайнштейн. Принципы передачи данных. Приложения коммуникационной теории. Нью-Йорк: нажатие пленума, 1992.

[3] Yasuda, Y., К. Кэшики и И. Хирэта. “Высокий показатель Проколотые Сверточные коды для Мягкого Решения Декодирование Viterbi”. Транзакции IEEE на Коммуникациях 32, № 3 (март 1984): 315–19. https://doi.org/10.1109/TCOM.1984.1096047.

[4] Haccoun, D. и G. Начало. “Высокий показатель Проколотые Сверточные коды для Viterbi и Sequential Decoding”. Транзакции IEEE на Коммуникациях 37, № 11 (ноябрь 1989): 1113–25. https://doi.org/10.1109/26.46505.

[5] Начните, G., Д. Хэккун и К. Пакуин. “Дальнейшие Результаты на Высоком показателе Проколотые Сверточные коды для Viterbi и Sequential Decoding”. Транзакции IEEE на Коммуникациях 38, № 11 (ноябрь 1990): 1922–28. https://doi.org/10.1109/26.61470.

[6] Moision, B. "Эмпирическое правило глубины усечения для сверточных кодов". В теории информации и семинаре приложений (27 января 2008 - 1 февраля 2008, Сан-Диего, Калифорния), 555-557. Нью-Йорк: IEEE, 2008.

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

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