exponenta event banner

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

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

Описание

comm.TurboDecoder Система object™ использует схему параллельного конкатенированного декодирования для декодирования кодированного входного сигнала. Входной сигнал обычно является выходным сигналом мягкого решения из операции демодуляции основной полосы частот. Дополнительные сведения см. в разделе Схема параллельного конкатенированного сверточного декодирования.

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

  1. Создать comm.TurboDecoder и задайте его свойства.

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

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

Создание

Описание

turbodec = comm.TurboDecoder создает системный объект турбодекодера. Этот объект использует составляющий декодер α - апостериорной вероятности (APP) для итеративного декодирования параллельно-конкатенированных сверточно кодированных входных данных.

пример

turbodec = comm.TurboDecoder(trellis,interlvrindices,numiter) создает объект системы турбодекодера с помощью TrellisStructure, InterleaverIndices, и numiterсоответственно. trellis входные данные должны быть указаны в соответствии с описанием TrellisStructure собственность. interlvrindices входные данные должны быть указаны в соответствии с описанием InterleaverIndices собственность. numiter входные данные должны быть указаны в соответствии с описанием NumIterations собственность.

пример

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

Свойства

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

Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и 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'.

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

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

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

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

Зависимости

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

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

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

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

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

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

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

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

Зависимости

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

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

Алгоритм декодирования, указанный как 'True APP', 'Max*', или 'Max'. При установке для этого свойства значения 'True APP'объект реализует истинное декодирование APP. При установке для этого свойства значения 'Max*' или 'Max'объект использует аппроксимации для увеличения скорости вычислений. Дополнительные сведения см. в разделе Декодер APP.

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

Число разрядов масштабирования, указанное как целое число в диапазоне [0, 8]. Это свойство задает количество битов, используемых составляющими декодерами для масштабирования входных данных, чтобы избежать потери точности во время вычислений. Составляющие декодеры умножают входной сигнал на 2 NumScalingBits и делят предварительный выход на один и тот же коэффициент. Дополнительные сведения см. в разделе Декодер APP.

Зависимости

Включите это свойство, установите для свойства Algorithm значение 'Max*'.

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

Число итераций декодирования, указанное как положительное целое число. Это свойство задает количество итераций декодирования, используемых для каждого вызова объекта. Объект итерирует и предоставляет обновления логарифмических отношений правдоподобия (LLR) некодированных выходных битов. Выходные данные объекта представляют собой выходные данные окончательного обновления LLR с жестким решением.

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

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

Описание

пример

decmsg = turbodec(codeword) декодирует входное кодовое слово с использованием схемы параллельного конкатенированного сверточного декодирования, которая задана решетчатой структурой и индексами перемежителя. turbodec возвращает двоичные декодированные данные. Дополнительные сведения см. в разделе Схема параллельного конкатенированного сверточного декодирования.

пример

decmsg = turbodec(codeword,interlvrindices) дополнительно задает индексы перемежителя. Чтобы включить этот синтаксис, задайте для свойства InterleaverAdingSource значение 'Input port'. Индексы перемежителя определяют отображение, используемое для перестановки входного сигнала в декодере.

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

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

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

Параллельное конкатенированное кодовое слово, указанное как вектор столбца длиной М, где М - длина параллельного конкатенированного кодового слова.

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

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

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

Зависимости

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

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

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

Зависимости

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

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

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

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

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

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

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

release(obj)

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

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

Примеры

свернуть все

Определите выходные индексы с помощью OutputIndices для турбокодирования и определения входных индексов с помощью InputIndices свойство для турбодекодирования. Отображение полноразмерного проколотого кодирования и декодирования для кода со скоростью 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;

turboDec = comm.TurboDecoder('TrellisStructure',trellis);
turboDec.InterleaverIndices = intIndices;
turboDec.InputIndicesSource = 'Property';
turboDec.InputIndices = 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

rxMsg = turboDec(2*encMsg-1); % Decode

isequal(data, rxMsg)          % Compare bits with decoded bits
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;

turboDec = comm.TurboDecoder('TrellisStructure',trellis);
turboDec.InterleaverIndices = intIndices;
turboDec.InputIndicesSource = 'Property';
turboDec.InputIndices = 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

rxMsg = turboDec(2*encMsg-1); % Decode

isequal(data, rxMsg)          % Compare bits with decoded bits
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] Бенедетто, С., Г. Монторси, Д. Дивсалар и Ф. Поллара. «Модуль Soft-Input Soft-Output Maximum A Posterior (MAP) для декодирования параллельных и последовательных конкатенированных кодов». Доклад о ходе работы лаборатории реактивного движения TDA, 42-127 (ноябрь 1996 года).

[2] Витерби, A.J. «Интуитивное обоснование и упрощенная реализация декодера MAP для сверточных кодов». Журнал IEEE по отдельным областям в сообщениях № 16, № 2 (февраль 1998 года): 260-64. https://doi.org/10.1109/49.661114.

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

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

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

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

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