exponenta event banner

коммуникация. TurboEncoder

Кодирование входного сигнала с использованием схемы параллельного конкатенированного кодирования

Описание

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) создает объект системы турбокодера с помощью TrellisStructure и InterleaverIndices свойства установлены в значение trellis и interlvrindicesсоответственно. trellis входные данные должны быть указаны в соответствии с описанием TrellisStructure собственность. interlvrindices входные данные должны быть указаны в соответствии с описанием InterleaverIndices собственность.

Свойства

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

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

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

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

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

Примечание

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

Вы можете либо использовать poly2trellis создать решетчатую структуру или создать ее вручную. Дополнительные сведения об этой структуре см. в разделе Описание сверточного кода и 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) × N × 2, где L - длина входного блока, mLen - длина памяти, а N - количество закодированных потоков для составного кодера.

Зависимости

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

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

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

Описание

пример

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

пример

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

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

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

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

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

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

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

Зависимости

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

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

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

Зависимости

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

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

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

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

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

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

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

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

release(obj)

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

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

Примеры

свернуть все

Кодирование входного сообщения с использованием конфигурации турбокодера со скоростью 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, поскольку количество битов на символ (бит/с) равно 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

Формирование случайных индексов перемежителя.

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. Вычислите отношение сигнал/шум (SNR) и дисперсию шума.

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

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

[3] Шлегель, Кристиан и Лэнс Перес. Решетка и турбокодирование. Серия IEEE Press по цифровой и мобильной связи. Пискатауэй, Нью-Джерси; Хобокен, Нью-Джерси: IEEE Press; Wiley-Interscience, 2004.

[4] 3GPP TS 36.212. «Мультиплексирование и канальное кодирование». Проект партнерства 3-го поколения; техническая спецификация на сеть радиодоступа группы; Усовершенствованный универсальный наземный радиодоступа (E-UTRA). https://www.3gpp.org.

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

.
Представлен в R2012a