convenc

Convolutionally кодируют двоичные данные

Синтаксис

code = convenc(msg,trellis)
code = convenc(msg,trellis,puncpat)
code = convenc(msg,trellis,...,init_state)
[code,final_state] = convenc(...)

Описание

code = convenc(msg,trellis) кодирует бинарный векторный msg с помощью сверточного энкодера, чьей структурой решетки MATLAB является trellis. Для получения дополнительной информации о структурах решетки MATLAB, см. Описание Решетки Сверточного кода. Каждый символ в msg состоит из битов log2(trellis.numInputSymbols). Векторный msg содержит один или несколько символов. code выходного вектора содержит один или несколько символов, каждый из которых состоит из битов log2(trellis.numOutputSymbols).

code = convenc(msg,trellis,puncpat) совпадает с синтаксисом выше, за исключением того, что он задает шаблон прокола, puncpat, чтобы позволить более высокое кодирование уровня. puncpat должен быть вектором 1 s и 0 s, где 0 s указывает на проколотые биты. puncpat должен иметь длину, по крайней мере, битов log2(trellis.numOutputSymbols).

code = convenc(msg,trellis,...,init_state) позволяет регистрам энкодера запускаться в состоянии, заданном init_state. init_state является целым числом между 0 и trellis.numStates-1 и должен быть последним входным параметром.

[code,final_state] = convenc(...) кодирует входной сигнал и также возвращает состояние энкодера в final_state. final_state имеет тот же формат как init_state.

Примеры

свернуть все

Закодируйте пять двухбитовых символов с помощью уровня 2/3 сверточный код.

data = randi([0 1],10,1);
trellis1 = poly2trellis([5 4],[23 35 0; 0 5 13]);
code1 = convenc(data,poly2trellis([5 4],[23 35 0; 0 5 13]));

Проверьте, что закодированный вывод составляет 15 битов, 3/2 времена длина входной последовательности, data.

length(code1)
ans = 15

Задайте структуру решетки энкодера явным образом и затем используйте convenc, чтобы закодировать 10 однобитных символов.

trellis2 = struct('numInputSymbols',2,'numOutputSymbols',4,...
'numStates',4,'nextStates',[0 2;0 2;1 3;1 3],...
'outputs',[0 3;1 2;3 0;2 1]);
code2 = convenc(randi([0 1],10,1),trellis2);

Используйте аргументы конечного и начального состояния при вызове convenc. Закодируйте часть data, записав конечное состояние для дальнейшего использования.

[code3,fstate] = convenc(data(1:6),trellis1);

Закодируйте остальную часть data, с помощью fstate в качестве входного параметра.

code4 = convenc(data(7:10),trellis1,fstate);

Проверьте, что [code3; code4] совпадает с code1.

isequal(code1,[code3; code4])
ans = logical
   1

Создайте структуру решетки для уровня 1/2 feedforward сверточный код. Используйте решетку, чтобы закодировать и декодировать случайный поток битов.

Создайте структуру решетки. Установите продолжительность ограничения на 7 и задайте генератор кода как массив ячеек полиномиальных векторов символов.

trellis = poly2trellis(7,{'1 + x^3 + x^4 + x^5 + x^6', ...
    '1 + x + x^3 + x^4 + x^6'})
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 64
          nextStates: [64x2 double]
             outputs: [64x2 double]

Сгенерируйте случайные двоичные данные, convolutionally закодируйте данные и декодируйте данные с помощью алгоритма Viterbi.

data = randi([0 1],70,1);
codedData = convenc(data,trellis);
decodedData = vitdec(codedData,trellis,34,'trunc','hard');

Проверьте, что декодируемые данные не имеют никаких битовых ошибок.

biterr(data,decodedData)
ans = 0

Оцените производительность частоты ошибок по битам (BER) для Декодеров Витерби трудного решения и мягкого решения в AWGN. Сравните производительность с той из незакодированной 64-QAM ссылки.

Установите параметры симуляции.

clear; close all
rng default
M = 64;                 % Modulation order
k = log2(M);            % Bits per symbol
EbNoVec = (4:10)';       % Eb/No values (dB)
numSymPerFrame = 1000;   % Number of QAM symbols per frame

Инициализируйте векторы результатов BER.

berEstSoft = zeros(size(EbNoVec)); 
berEstHard = zeros(size(EbNoVec));

Установите структуру решетки и traceback длину для уровня 1/2, продолжительность ограничения 7, сверточный код.

trellis = poly2trellis(7,[171 133]);
tbl = 32;
rate = 1/2;

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

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

  • Convolutionally кодируют данные.

  • Примените модуляцию QAM к символам данных. Задайте модульную среднюю степень для переданного сигнала.

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

  • Демодулируйте полученный сигнал с помощью трудного решения и аппроксимируйте методы LLR. Задайте модульную среднюю степень для полученного сигнала.

  • Viterbi декодируют сигналы, использующие трудно и неквантованные методы.

  • Вычислите количество битовых ошибок.

Цикл while продолжает обрабатывать данные, пока с или 100 ошибками не сталкиваются или 1e7, биты передаются.

for n = 1:length(EbNoVec)
    % Convert Eb/No to SNR
    snrdB = EbNoVec(n) + 10*log10(k*rate);
    % Noise variance calculation for unity average signal power.
    noiseVar = 10.^(-snrdB/10);
    % Reset the error and bit counters
    [numErrsSoft,numErrsHard,numBits] = deal(0);
    
    while numErrsSoft < 100 && numBits < 1e7
        % Generate binary data and convert to symbols
        dataIn = randi([0 1],numSymPerFrame*k,1);
        
        % Convolutionally encode the data
        dataEnc = convenc(dataIn,trellis);
        
        % QAM modulate
        txSig = qammod(dataEnc,M,'InputType','bit','UnitAveragePower',true);
        
        % Pass through AWGN channel
        rxSig = awgn(txSig,snrdB,'measured');
        
        % Demodulate the noisy signal using hard decision (bit) and
        % soft decision (approximate LLR) approaches.
        rxDataHard = qamdemod(rxSig,M,'OutputType','bit','UnitAveragePower',true);
        rxDataSoft = qamdemod(rxSig,M,'OutputType','approxllr', ...
            'UnitAveragePower',true,'NoiseVariance',noiseVar);
        
        % Viterbi decode the demodulated data
        dataHard = vitdec(rxDataHard,trellis,tbl,'cont','hard');
        dataSoft = vitdec(rxDataSoft,trellis,tbl,'cont','unquant');
        
        % Calculate the number of bit errors in the frame. Adjust for the
        % decoding delay, which is equal to the traceback depth.
        numErrsInFrameHard = biterr(dataIn(1:end-tbl),dataHard(tbl+1:end));
        numErrsInFrameSoft = biterr(dataIn(1:end-tbl),dataSoft(tbl+1:end));
        
        % Increment the error and bit counters
        numErrsHard = numErrsHard + numErrsInFrameHard;
        numErrsSoft = numErrsSoft + numErrsInFrameSoft;
        numBits = numBits + numSymPerFrame*k;

    end
    
    % Estimate the BER for both methods
    berEstSoft(n) = numErrsSoft/numBits;
    berEstHard(n) = numErrsHard/numBits;
end

Отобразите предполагаемые твердые и мягкие данные о BER на графике. Постройте теоретическую производительность для незакодированного 64-QAM канала.

semilogy(EbNoVec,[berEstSoft berEstHard],'-*')
hold on
semilogy(EbNoVec,berawgn(EbNoVec,'qam',M))
legend('Soft','Hard','Uncoded','location','best')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')

Как ожидалось мягкое декодирование решения приводит к лучшим результатам.

Примеры

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

Ссылки

[1] Кларк, G. C. Младший и J. Затвор Каин., кодирование с коррекцией ошибок для цифровой связи, Нью-Йорка, нажатия пленума, 1981.

[2] Gitlin, Ричард Д., Иеремия Ф. Хейз, и Стивен Б. Вайнштейн, Дэта-Коммуникэйшнс-Принкиплс, Нью-Йорк, пленум, 1992.

[3] Yasuda, Y., и. al., “Высокий показатель проколол сверточные коды для мягкого решения декодирование Viterbi”, Транзакции IEEE на Коммуникациях, издании COM-32, № 3, стр 315–319, март 1984.

[4] Haccoun, D. и G. Начните, “Высокий показатель проколол сверточные коды для Viterbi и последовательного декодирования”, Транзакции IEEE на Коммуникациях, издании 37, № 11, стр 1113–1125, ноябрь 1989.

[5] Начните, G., et.al., “Дальнейшие результаты на высоком показателе прокололи сверточные коды для Viterbi и последовательного декодирования”, Транзакции IEEE на Коммуникациях, издании 38, № 11, стр 1922–1928, ноябрь 1990.

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

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

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

| | |

Представлено до R2006a