comm.TurboDecoder

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

Описание

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

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

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

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

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

Создание

Описание

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

пример

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') конфигурирует турбо Системный объект декодера с interleaver индексами, которые будут предоставлены как входной параметр Системному объекту, когда он называется.

Свойства

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

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

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

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

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

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

Зависимости

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

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

Источник входных индексов в виде 'Auto'Свойство, или '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) декодирует входную кодовую комбинацию с помощью конкатенированной сверточной схемы декодирования параллели, которая задана структурой решетки и interleaver индексами. turbodec возвращается двоичный файл декодировал данные. Для получения дополнительной информации см. Параллельную Конкатенированную Сверточную Схему Декодирования.

пример

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

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

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

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

Параллель конкатенировала кодовую комбинацию в виде вектор-столбца длины M, где M является длиной конкатенированной кодовой комбинации параллели.

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

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

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

Зависимости

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

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

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

Зависимости

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

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

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

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

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

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

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

release(obj)

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

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

Примеры

свернуть все

Выходные Define индексы при помощи 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

Сгенерируйте случайные 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 object. The axes object contains 2 objects of type line. These objects represent Turbo, Uncoded.

Больше о

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

Ссылки

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

[2] Viterbi, A.J. “Интуитивное Выравнивание и Упрощенное внедрение Декодера MAP для Сверточных кодов”. Журнал IEEE на Выбранных областях в Коммуникациях 16, № 2 (февраль 1998): 260–64. https://doi.org/10.1109/49.661114.

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

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

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

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

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