comm.TurboEncoder

Закодируйте входной сигнал с помощью параллельной конкатенированной схемы кодирования

Описание

The comm.TurboEncoder Система object™ применяет схему параллельного конкатенированного кодирования к двоичному входному сообщению. Эта схема кодирования использует два сверточных энкодеров и добавляет биты окончания в конец потока закодированных данных. Для получения дополнительной информации см. «Схема параллельного конкатенированного сверточного кодирования».

Для кодирования двоичного входного сообщения с использованием схемы параллельного конкатенированного кодирования:

  1. Создайте comm.TurboEncoder Объекту и установите его свойства.

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

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

пример

turboenc = comm.TurboEncoder создает турбо- энкодер Системного объекта. Этот объект выполняет турбокодирование, используя строение объекта по умолчанию.

пример

turboenc = comm.TurboEncoder(Name,Value) устанавливает свойства с помощью одной или нескольких пар "имя-значение". Для примера, comm.TurboEncoder('InterleaverIndicesSource','Input port') конфигурирует турбо- энкодер Системного объекта с индексами перемежителя, которые будут поставляться в качестве входного параметра к Системному объекту при вызове. Заключайте каждое имя свойства в кавычки.

пример

turboenc = comm.TurboEncoder(trellis,interlvrindices) создает объект turbo энкодера System с TrellisStructure и InterleaverIndices свойства, установленные на trellis и interlvrindices, соответственно. The trellis вход должен быть задан как описано в TrellisStructure свойство. The interlvrindices вход должен быть задан как описано в InterleaverIndices свойство.

Свойства

расширить все

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

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

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

Trellis описание составного сверточного кода, заданное как структура, которая содержит описание решетки для скорости KN кода. K - количество входа битовых потоков, а N - количество выхода битовых потоков.

Примечание

K турбокодера должно быть 1. Для получения дополнительной информации смотрите Скорость кодирования.

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник индексов перемежителя, заданный как 'Property' или 'Input port'.

  • Когда вы устанавливаете это свойство на 'Property'объект выполняется с использованием индексов перемежителя, заданных с помощью InterleaverIndices свойство при конфигурировании объекта.

  • Когда вы устанавливаете это свойство на 'Input port'объект выполняется с использованием входного параметра interlvrindices при вызове объекта. Длина вектора и значения индексов перемежителя и двоичного входного сообщения могут изменяться при каждом вызове объекта.

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

Индексы перемежителя, заданные как вектор-столбец целых чисел. Вектор должен иметь длину L, где L - длина двоичного входного сообщения. Каждый элемент вектора должен быть целым числом в области значений [1, L] и должен быть уникальным. Индексы перемежителя определяют отображение, используемую для перестановки входа бит в энкодере.

Настраиваемый: Да

Зависимости

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

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

Источник индексов выхода, заданный как 'Auto', 'Property', или 'Input port'.

  • Когда вы устанавливаете это свойство на 'Auto'объект вычисляет выходные индексы, которые пунктируют второй систематический поток и включают все хвостовые биты.

  • Когда вы устанавливаете это свойство на 'Property'объект использует выходные индексы, которые вы задаете для OutputIndices свойство.

  • Когда вы устанавливаете это свойство на 'Input port'объект выполняется с использованием индексов выхода, заданных входных параметров outindices. Длина вектора и значения для индексов выхода и закодированного выхода сигнала могут изменяться при каждом вызове объекта.

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

Выходные индексы для упорядоченное расположение и прокалывания, используемые на полностью закодированных данных, заданные как вектор-столбец из целых чисел. Количество бит выхода от энкодера равняется длине этого свойства. Максимальная длина не должна превышать полностью закодированную длину (L + mLen) × <reservedrangesplaceholder3> × 2, где L - размер блока входа, mLen - длина памяти, и N количество закодированных потоков для учредительного кодера.

Зависимости

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

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

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

Описание

пример

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

пример

codeword = turboenc(message,interlvrindices) дополнительно задает индексы перемежителя. interlvrindices должно быть вектором-столбцом, содержащей целые числа в области значений [1, L] без повторяющихся значений. L - длина двоичного входного сообщения, message. Этот синтаксис применяется, когда для свойства InterleaverIndicesSource задано значение 'Input port'. Индексы перемежителя определяют отображение, используемую для перестановки входа бит в энкодере.

codeword = turboenc(message,interlvrindices,outindices) дополнительно задает упорядоченное расположение и прокалывание, используемые при кодировании данных сообщения. Чтобы включить этот синтаксис, задайте значение свойства OutputIndicesSource 'Input port'. Значения вектора выходных индексов должны быть относительно полностью закодированных данных для схемы кодирования, включая хвостовые биты для всех потоков.

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

расширить все

Вход сообщение, заданное как двоичный вектор-столбец длины L, где L является длиной незакодированного входа сообщения.

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

Индексы перемежителя, заданные как вектор-столбец целых чисел. Вектор должен иметь длину L, где L - длина двоичного входного сообщения. Каждый элемент вектора должен быть целым числом в области значений [1, L] и должен быть уникальным. Индексы перемежителя определяют отображение, используемую для перестановки входа бит в энкодере.

Зависимости

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

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

Выходные индексы для упорядоченное расположение и прокалывания, используемые на полностью закодированных данных, заданные как вектор-столбец из целых чисел. Значения элемента в outindices вектор должен относиться к полностью закодированным данным для схемы кодирования, включая конечные биты для всех потоков.

Зависимости

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

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

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

расширить все

Параллельное конкатенированное кодовое слово, возвращаемое как двоичный вектор-столбец длины M, где M - количество бит в параллельном конкатенированном кодовом слове. Этот выход наследует свой тип данных от message вход.

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

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

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

release(obj)

расширить все

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

Примеры

свернуть все

Закодируйте вход сообщение с помощью скорости 1/3 турбонаддува энкодера строения с решетчатой структурой по умолчанию poly2trellis(4,[13 15],13), как представлено на этом рисунке.

Для входа сообщения с 64 битами кодовое слово, выход из энкодера, составляет 204 бита. Первые 192 бита выхода соответствовать трем 64-битным потокам, чередующимся как Xk, Zk, и Zk. Систематический поток битов, Xk, и поток битов четности, Zk, из первого энкодера и битового потока четности, Zk, от второго энкодера. Когда переключатели находятся в более низком положении, сигналы следуют за штриховыми линиями, и последние 12 битов соответствуют хвостовым битам от двух энкодеров. Первая группа из шести битов (три систематических бита и три бита четности) являются выходными конечными битами от первого составляющего энкодера. Вторая группа из шести битов (три систематических бита и три бита четности) являются выходными конечными битами от второго составляющего энкодера.

Создайте турбо- энкодер с использованием настроек по умолчанию. Сгенерируйте систему координат двоичных данных сообщения, а затем закодируйте данные сообщения.

rng default
turboenc = comm.TurboEncoder;
frameLen = 64; % Frame length
data = randi([0 1],frameLen,1);
encData = turboenc(data);
codewordLen = length(encData);

Вычислите скорость кодирования. Из-за хвостовых бит выход кода энкодера чуть меньше 1/3.

codingrate = frameLen/codewordLen
codingrate = 0.3137

Определите выходные индексы при помощи OutputIndices свойство. Покажите полноразмерный закодированный выход и проколотый закодированный выход для кода со скоростью 1/2 и длины 10-битного блока.

Инициализация параметров

Задайте параметры, чтобы инициализировать энкодер.

blkLen = 10;
trellis = poly2trellis(4,[13 15],13);
n = log2(trellis.numOutputSymbols);
mLen = log2(trellis.numStates);

Полноразмерный закодированный выход

Инициализируйте переменные и турбо- энкодер Системного объекта для полноразмерного кодирования. Отобразите скорость турбокодирования. Проверьте длину закодированного выхода в зависимости от длины вектора выходных индексов.

fullOut = (1:(mLen+blkLen)*2*n)';
outLen = length(fullOut);
netRate = blkLen/outLen;
data = randi([0 1],blkLen,1);
intIndices  = randperm(blkLen);

turboEnc = comm.TurboEncoder('TrellisStructure',trellis);
turboEnc.InterleaverIndices = intIndices;
turboEnc.OutputIndicesSource = 'Property';
turboEnc.OutputIndices = fullOut;

encMsg = turboEnc(data);   % Encode

disp(['Turbo coding rate: ' num2str(netRate)])
Turbo coding rate: 0.19231
encOutLen = length(encMsg) % Display encoded length
encOutLen = 52
isequal(encOutLen,outLen)  % Check lengths
ans = logical
   1

Проколотый закодированный выход

Задайте выходные индексы для прокалывания второго систематического потока при помощи getTurboIOIndices функция. Инициализируйте переменные и турбо- энкодер Системного объекта для пунктированного кодирования. Отобразите скорость турбокодирования. Проверьте длину закодированного выхода в зависимости от длины вектора выходных индексов.

puncOut = getTurboIOIndices(blkLen,n,mLen);
outLen = length(puncOut);
netRate = blkLen/outLen;
data = randi([0 1],blkLen,1);
intIndices  = randperm(blkLen);

turboEnc = comm.TurboEncoder('TrellisStructure',trellis);
turboEnc.InterleaverIndices = intIndices;
turboEnc.OutputIndicesSource = 'Property';
turboEnc.OutputIndices = puncOut;

encMsg = turboEnc(data);   % Encode

disp(['Turbo coding rate: ' num2str(netRate)])
Turbo coding rate: 0.25641
encOutLen = length(encMsg) % Display encoded length
encOutLen = 39
isequal(encOutLen, outLen) % Check lengths
ans = logical
   1

Сравнение полных и пунктированных выходов

Выходные выходы энкодера чередуют отдельные битовые потоки. Третий бит каждого 4-битного кортежа удаляется из полноразмерного кода, чтобы получить проколотый код. Этот третий выходной поток битов соответствует второму систематическому потоку битов. Отобразите индексы полноразмерного кода и индексы проколотого кода, чтобы показать, что третий бит каждого 4-битного кортежа проколот.

fullOut'
ans = 1×52

     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23    24    25    26    27    28    29    30    31    32    33    34    35    36    37    38    39    40    41    42    43    44    45    46    47    48    49    50

puncOut'
ans = 1×39

     1     2     4     5     6     8     9    10    12    13    14    16    17    18    20    21    22    24    25    26    28    29    30    32    33    34    36    37    38    40    41    42    44    45    46    48    49    50    52

Моделируют передачу и прием данных BPSK по каналу AWGN с помощью турбокодирования и декодирования.

Задайте параметры симуляции, а затем вычислите эффективную скорость кодирования и отклонение шума. Для BPSK модуляции, ES/N0 равняется Eb/N0 потому что количество бит на символ (bps) равно 1. Чтобы облегчить повторное использование этого кода для других схем модуляции, вычисления в этом примере включают условия bps. Задайте длину пакета, структуру шпалеры и количество итераций. Вычислите отклонение шума, используя ES/N0 и скорость кода. Установите генератор случайных чисел в состояние по умолчанию, чтобы убедиться, что результаты повторяемы.

modOrd = 2; % Modulation order
bps = log2(modOrd); % Bits per symbol
EbNo = 1; % Energy per bit to noise power spectral density ratio in dB
EsNo = EbNo + 10*log10(bps); % Energy per symbol to noise power spectral density ratio in dB

L = 256; % Input packet length in bits
trellis = poly2trellis(4,[13 15 17],13);
numiter = 4;
n = log2(trellis.numOutputSymbols);
numTails = log2(trellis.numStates)*n;
M = L*(2*n - 1) + 2*numTails; % Output codeword packet length
rate = L/M; % Coding rate

snrdB = EsNo + 10*log10(rate); % Signal to noise ratio in dB
noiseVar = 1./(10.^(snrdB/10)); % Noise variance

rng default

Сгенерируйте случайные индексы перемежителя.

intrlvrIndices = randperm(L);

Создайте пару турбо- энкодера и декодера. Используйте заданную структуру шпалеры и случайные индексы перемежителя. Сконфигурируйте декодер, чтобы запустить не более четырех итераций.

turboenc = comm.TurboEncoder(trellis,intrlvrIndices);
turbodec = comm.TurboDecoder(trellis,intrlvrIndices,numiter);

Создайте пару модулятора и демодулятора BPSK, где демодулятор выводит мягкие биты, определенные с помощью метода LLR.

bpskmod = comm.BPSKModulator;
bpskdemod = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio', ...
    'Variance',noiseVar);

Создайте объект канала AWGN и объект частоты ошибок.

awgnchan = comm.AWGNChannel('NoiseMethod','Variance','Variance',noiseVar);
errrate = comm.ErrorRate;

Основной цикл обработки выполняет эти шаги.

  1. Сгенерируйте двоичные данные.

  2. Турбокодируйте данные.

  3. Модулируйте закодированные данные.

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

  5. Демодулируйте сигнал с шумом с помощью LLR для вывода мягких бит.

  6. Турбодекодируйте демодулированные данные. Поскольку битовое отображение от демодулятора противоположно отображению, ожидаемому турбодекодером, вход декодера должен использовать обратное значение демодулированного сигнала.

  7. Вычислите статистику ошибок.

for frmIdx = 1:100
    data = randi([0 1],L,1);
    encodedData = turboenc(data);
    modSignal = bpskmod(encodedData);
    receivedSignal = awgnchan(modSignal);
    demodSignal = bpskdemod(receivedSignal);
    receivedBits = turbodec(-demodSignal);
    errorStats = errrate(data,receivedBits);
end

Отобразите данные об ошибке.

fprintf('Bit error rate = %5.2e\nNumber of errors = %d\nTotal bits = %d\n', errorStats)
Bit error rate = 2.34e-04
Number of errors = 6
Total bits = 25600

Симулируйте сквозную линию связи с помощью 16-QAM сигнала и турбокодов в канале AWGN. Внутри цикла обработки системы координат размеры пакетов случайным образом выбираются равными 500, 1000 или 1500 битам. Поскольку размер пакета изменяется, индексы перемежителя подаются в турбодекодер и энкодер как входной параметр связанного с ними системного объекта. Сравнение результатов турбокодированной частоты битовой ошибки с незакодированными результатами битовой ошибки.

Инициализация симуляции

Установите порядок модуляции и область значений Eb/N0 значения. Вычислите количество бит на символ и отношение энергии на символ к шуму (ES/N0) на основе порядка модуляции и Eb/N0. Чтобы получить повторяемые результаты, задайте случайное число.

modOrder = 16;               % Modulation order
bps = log2(modOrder);        % Bits per symbol
EbNo = (2:0.5:4);            % Energy per bit to noise power spectral density ratio in dB
EsNo = EbNo + 10*log10(bps); % Energy per symbol to noise power spectral density ratio in dB
rng(1963);

Создайте пару турбо- энкодера и декодера. Поскольку длина пакета изменяется для каждой системы координат, задайте, что индексы перемежителя передаются входному параметру объекта System при выполнении. Укажите, что декодер выполняет четыре итерации.

turboEnc = comm.TurboEncoder('InterleaverIndicesSource','Input port');
turboDec = comm.TurboDecoder('InterleaverIndicesSource','Input port','NumIterations',4);
trellis = poly2trellis(4,[13 15 17],13);
n = log2(turboEnc.TrellisStructure.numOutputSymbols);
numTails = log2(turboEnc.TrellisStructure.numStates)*n;

Создайте объект частоты ошибок.

errRate = comm.ErrorRate;

Основной цикл обработки

Цикл обработки системы координат выполняет эти шаги.

  1. Выберите случайную длину пакета и сгенерируйте случайные двоичные данные.

  2. Вычислите выход кодового слова и скорость кодирования.

  3. Вычислите отношение сигнал/шум (ОСШ) и отклонение шума.

  4. Сгенерируйте индексы перемежителя.

  5. Турбокодируйте данные.

  6. Примените 16-QAM модуляцию и нормализуйте среднюю степень сигнала.

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

  8. Демодулируйте сигнал с шумом с помощью метода LLR, выводите мягкие биты и нормализуйте среднюю степень сигнала.

  9. Турбодекодируйте данные. Поскольку порядок отображения бит от демодулятора противоположен порядку отображения, ожидаемому турбодекодером, вход декодера должен использовать обратный сигнал демодулированного сигнала.

  10. Вычислите статистику ошибок.

ber = zeros(1,length(EbNo));
for k = 1:length(EbNo)
    % numFrames = 100;
    errorStats = zeros(1,3);
    %for pktIdx = 1:numFrames
    L = 500*randi([1 3],1,1);         % Packet length in bits
    M = L*(2*n - 1) + 2*numTails;     % Output codeword packet length
    rate = L/M;                       % Coding rate for current packet
    snrdB = EsNo(k) + 10*log10(rate); % Signal to noise ratio in dB
    noiseVar = 1./(10.^(snrdB/10));   % Noise variance
    
    while errorStats(2) < 100 && errorStats(3) < 1e7
        data = randi([0 1],L,1);
        intrlvrIndices = randperm(L);
        encodedData = turboEnc(data,intrlvrIndices);
        modSignal = qammod(encodedData,modOrder, ...
            'InputType','bit','UnitAveragePower',true);
        rxSignal = awgn(modSignal,snrdB);
        demodSignal = qamdemod(rxSignal,modOrder,'OutputType','llr', ...
            'UnitAveragePower',true,'NoiseVariance',noiseVar);
        rxBits = turboDec(-demodSignal,intrlvrIndices); % Demodulated signal is negated
        errorStats = errRate(data,rxBits);
    end
    % Save the BER data and reset the bit error rate object
    ber(k) = errorStats(1);
    reset(errRate)
end

Графическое изображение результатов

Постройте график частоты битовой ошибки и сравните ее с незакодированной частотой битовой ошибки.

semilogy(EbNo,ber,'-o')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
uncodedBER = berawgn(EbNo,'qam',modOrder); % Estimate of uncoded BER
hold on
semilogy(EbNo,uncodedBER)
legend('Turbo','Uncoded','location','sw')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Turbo, Uncoded.

Подробнее о

расширить все

Ссылки

[1] Berrou, C., A. Glavieux, and P. Thitimajshima. Near Shannon Limit Error-Correcting Coding and Decoding: Turbo-Codes (неопр.) (недоступная ссылка). Материалы Международной конференции по коммуникациям ICC 93 - IEEE, Женева, Швейцария, май 1993, 1064-70 года. https://doi.org/10.1109/icc.1993.397441.

[2] Бенедетто, С., Г. Монторси, Д. Дивсалар и Ф. Поллара. Модуль Soft-Input Soft-Output MAP для декодирования параллельных и последовательных конкатенированных кодов. Прогресс лаборатории реактивного движения TDA, 42-127 (ноябрь 1996 года).

[3] Шлегель, Кристиан и Ланс Перес. Trellis и турбокодирование. Серия прессы IEEE по цифровой и мобильной связи. Piscataway, NJ; Hoboken, NJ: IEEE Press; Wiley-Interscience, 2004.

[4] 3GPP TS 36.212. «Мультиплексирование и канальное кодирование». 3rd Генерация Partnership Project; Группа технических спецификаций Radio Доступа Network; Evolved Universal Terrestrial Radio Access (E-UTRA). https://www.3gpp.org.

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

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