comm.TurboEncoder

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

Описание

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

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

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

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

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

Создание

Описание

пример

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

пример

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

пример

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

Свойства

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник interleaver индексов в виде 'Property' или 'Input port'.

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

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

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

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

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

Зависимости

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

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

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

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

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

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

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

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

Зависимости

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

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

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

Описание

пример

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

пример

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

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

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

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

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

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

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

Зависимости

Чтобы включить этот аргумент, установите 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

Выходные Define индексы при помощи 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 потому что количество битов на символ (бит/с) равняется 1. Чтобы упростить повторное использование этого кода для других схем модуляции, вычисления в этом примере включают условия бит/с. Задайте пакетную длину, структуру решетки и количество итераций. Вычислите шумовое использование отклонения 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

Сгенерируйте случайные interleaver индексы.

intrlvrIndices = randperm(L);

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

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, или 1 500 битов. Поскольку пакетный размер варьируется, interleaver индексы предоставляются турбо энкодеру и декодеру как входной параметр их связанного Системного объекта. Сравните турбо закодировало результаты частоты ошибок по битам к незакодированным результатам частоты ошибок по битам.

Инициализируйте симуляцию

Установите порядок модуляции и область значений 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);

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

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. Сгенерируйте interleaver индексы.

  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., А. Глэвиукс и П. Титимэджшима. “Около Шенноновского Предельного Кодирования с коррекцией ошибок и Декодирования: турбокоды”. Продолжения ICC 93 - Международная конференция IEEE по вопросам Коммуникаций, Женевы, Швейцария, май 1993, 1064–70. https://doi.org/10.1109/icc.1993.397441.

[2] Бенедетто, S., Г. Монторси, Д. Дивсэлэр и Ф. Поллара. "Модуль Мягкого Входа Мягкого Выхода Максимума следующего (MAP), чтобы декодировать параллельные и последовательные каскадные коды". Лаборатория реактивного движения отчет о выполнении работ TDA, 42–127, (ноябрь 1996).

[3] Шлегель, христианин, и Ланс Перес. Решетчатое кодирование и турбокодирование. IEEE нажимает Series on Digital & Mobile Communication. Пискатауэй, NJ  ; Хобокен, NJ: нажатие IEEE  ; Wiley-межнаука, 2004.

[4] 3GPP TS 36.212. "Мультиплексирование и кодирование канала". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group; Развитый Универсальный Наземный Радио-доступ (к E-UTRA). https://www.3gpp.org.

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

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

Объекты

Функции

Блоки

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