exponenta event banner

Сверточное кодирование с проколом

В этом примере показано, как использовать сверточный кодер и объекты системы декодеров Витерби для моделирования проколотой системы кодирования. Сложность декодера Витерби быстро возрастает с кодовой скоростью. Прокалывание - это метод, который позволяет кодировать и декодировать коды с более высокой скоростью, используя кодеры со стандартной скоростью 1/2 и декодеры.

Введение

В этом примере показано моделирование системы связи, состоящей из случайного двоичного источника, сверточного кодера, модулятора BPSK, аддитивного канала белого гауссова шума (AWGN) и декодера Витерби. Пример показывает, как выполнять моделирование для получения кривых частоты битовых ошибок (BER), и сравнивает эти кривые с теоретической границей.

Инициализация

Сверточное кодирование с прокалыванием

Создание скорости 1/2, длина ограничения 7 comm.ConvolutionalEncoder Системный объект. Этот кодер принимает однобитовые символы в качестве входных сигналов и генерирует двухбитовые символы в качестве выходных сигналов. Если в качестве входных данных принять 3-битовые слова сообщения, то кодер будет генерировать 6-битовые выходы кодового слова.

convEncoder = comm.ConvolutionalEncoder(poly2trellis(7, [171 133]));

Укажите образец прокола для создания кода скорости 3/4 из предыдущего кода скорости 1/2 с помощью вектора образца прокола [1; 1; 0; 1; 1; 0]. Единицы в векторе шаблона прокола указывают, что биты в позициях 1, 2, 4 и 5 передаются, тогда как нули указывают, что биты в позициях 3 и 6 проколоты или удалены из передаваемого сигнала. Эффект прокалывания заключается в том, что теперь для каждых 3 битов входного сигнала прокалываемый код генерирует 4 бита выходного сигнала (в отличие от 6 битов, полученных до прокалывания). Это приводит к коду скорости 3/4. В рассматриваемом примере длина вектора шаблона прокола должна быть кратной целому числу 6, поскольку 3-битовые входы преобразуются в 6-битовые выходы сверточным кодером скорости 1/2.

Чтобы задать требуемый шаблон прокола в объекте системы сверточного кодера, hConvEnc , установите PuncturePatternSource свойство для Property и PuncturePattern свойство для [1;1;0;1;1;0] .

convEncoder.PuncturePatternSource = 'Property';
convEncoder.PuncturePattern = [1;1;0;1;1;0];

Модулятор и канал

Создать comm.BPSKModulator Объект системы для передачи кодированных данных с использованием модуляции с двоичной фазовой манипуляцией по каналу.

bpskMod = comm.BPSKModulator;

Создание comm.AWGNChannel Системный объект. Установите NoiseMethod свойство канала для Signal to noise ratio (Eb/No) для задания уровня шума с использованием отношения спектральной плотности энергии на бит к мощности шума (Eb/No). При выполнении моделирования протестируйте систему кодирования на различные значения отношения Eb/No путем изменения EbNo свойство объекта канала. Выход модулятора BPSK генерирует сигналы мощности блока; установите SignalPower свойство 1 Вт. Рассматриваемая система находится на скорости передачи символов; установите SamplesPerSymbol свойство 1.

channel = comm.AWGNChannel('NoiseMethod', 'Signal to noise ratio (Eb/No)',...
  'SignalPower', 1, 'SamplesPerSymbol', 1);

Декодирование Витерби с депунктированием

Конфигурирование comm.ViterbiDecoder Системный объект, так что он декодирует проколотый код, заданный для сверточного кодера. В этом примере предполагаются неквантованные входы в декодер Витерби, поэтому установите InputFormat свойство для Unquantized .

vitDecoder = comm.ViterbiDecoder(poly2trellis(7, [171 133]), ...
  'InputFormat', 'Unquantized');

В общем случае векторы шаблона прокола, используемые для сверточного кодера и декодера Витерби, должны быть одинаковыми. Чтобы задать образец прокола, установите PuncturePatternSource свойство объекта System декодера Витерби, hVitDec Кому Property . Установите PuncturePattern для того же вектора шаблона прокола, который используется для сверточного кодера.

Поскольку проколотые биты не передаются, нет информации, указывающей их значения. В результате процесс декодирования игнорирует их.

vitDecoder.PuncturePatternSource =  'Property';
vitDecoder.PuncturePattern = convEncoder.PuncturePattern;

Для кода скорости 1/2 без прокалывания обычно устанавливается глубина отслеживания декодера Витерби, близкая к 40. Декодирование проколотых кодов требует более высокого значения, чтобы дать декодеру достаточно данных для разрешения неоднозначностей, которые вводят проколы. В этом примере используется глубина отслеживания 96. Задайте это значение с помощью TraceBackDepth свойство объекта декодера Витерби, hVitDec .

vitDecoder.TracebackDepth = 96;

Расчет частоты ошибок

Создание comm.ErrorRate вычислитель Системный объект для сравнения декодированных битов с исходными передаваемыми битами. Выходной сигнал объекта калькулятора частоты ошибок представляет собой трехэлементный вектор, содержащий вычисленный коэффициент битовых ошибок (BER), количество наблюдаемых ошибок и количество обработанных битов. Декодер Витерби создает задержку в выходном декодированном битовом потоке, равную длине трекбэка. Чтобы учесть эту задержку, установите ReceiveDelay свойство вычислителя частоты ошибок System object to 96.

errorCalc = comm.ErrorRate('ReceiveDelay', vitDecoder.TracebackDepth);

Цикл обработки потока

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

Некодированные и кодированные значения отношения Eb/No

Как правило, производительность системы измеряется в соответствии со значением отношения спектральной плотности энергии на бит к мощности шума (Eb/No), доступным на входе канального кодера. Причина этого заключается в том, что это количество непосредственно контролируется системным инженером. Проанализируйте производительность системы кодирования для значений Eb/No от 2 до 5 дБ.

EbNoEncoderInput = 2:0.5:5; % in dB

Сигнал, поступающий в канал AWGN, является кодированным сигналом. Преобразуйте значения Eb/No таким образом, чтобы они соответствовали соотношению энергии на выходе кодера. Если ввести три бита в кодер и получить четыре битовых выхода, то соотношение энергии задаётся скоростью 3/4 следующим образом:

EbNoEncoderOutput = EbNoEncoderInput + 10*log10(3/4);

Цикл моделирования

Для получения результатов работы BER передайте кадры размером 3000 бит через систему связи. Для каждого значения Eb/No остановите моделирование по достижении определенного количества ошибок или передач. Для повышения точности результатов увеличьте целевое количество ошибок или максимальное количество передач.

frameLength = 3000;         % this value must be an integer multiple of 3
targetErrors = 300; 
maxNumTransmissions = 5e6;

Закольцовывание закодированных значений Eb/No (моделирование займет несколько секунд).

BERVec = zeros(3,length(EbNoEncoderOutput)); % Allocate memory to store results
for n=1:length(EbNoEncoderOutput)
  reset(errorCalc)
  reset(convEncoder)
  reset(vitDecoder)
  channel.EbNo = EbNoEncoderOutput(n); % Set the channel EbNo value for simulation
  while (BERVec(2,n) < targetErrors) && (BERVec(3,n) < maxNumTransmissions)  
    % Generate binary frames of size specified by the frameLength variable
    data = randi([0 1], frameLength, 1);
    % Convolutionally encode the data
    encData = convEncoder(data);
    % Modulate the encoded data
    modData = bpskMod(encData);
    % Pass the modulated signal through an AWGN channel
    channelOutput = channel(modData);
    % Pass the real part of the channel complex outputs as the unquantized
    % input to the Viterbi decoder. 
    decData = vitDecoder(real(channelOutput));
    % Compute and accumulate errors
    BERVec(:,n) = errorCalc(data, decData);
  end
end

Сравнение результатов с теоретическими кривыми

Сравниваем результаты моделирования с помощью аппроксимации вероятности битовой ошибки, связанной с проколотым кодом согласно [1]. Следующие команды вычисляют аппроксимацию этой границы, используя первые семь членов суммирования для значений Eb/No в 2:0.5:5. Значения, используемые для nerr, приведены в таблице 2 из [2].

dist = 5:11;
nerr = [42 201 1492 10469 62935 379644 2253373];
codeRate = 3/4;
bound = nerr*(1/6)*erfc(sqrt(codeRate*(10.0.^((2:.02:5)/10))'*dist))';

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

berfit(EbNoEncoderInput,BERVec(1,:)); % Curve-fitted simulation results
hold on;
semilogy((2:.02:5),bound,'g'); % Theoretical results
legend('Empirical BER','Fit for simulated BER', 'Theoretical bound on BER')
axis([1 6 10^-5 1])

Figure contains an axes. The axes with title BER vs. Eb/No with Best Curve Fit contains 3 objects of type line. These objects represent Empirical BER, Fit for simulated BER, Theoretical bound on BER.

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

Резюме

Мы использовали несколько объектов System для моделирования системы связи со сверточным кодированием и прокалыванием. Мы смоделировали систему, чтобы получить производительность BER по сравнению с различными значениями отношения Eb/No. Результаты BER сравнивали с теоретическими границами.

Избранная библиография

  1. Yasuda, Y., K. Kashiki и Y. Hirata, «High Rate Punctured Convolutional Codes for Soft Decoding Viterbi», IEEE ® Transactions on Communications, том COM-32, март 1984, стр. 315-319

  2. Begin, G., Haccoun, D. и Paquin, C., «Дальнейшие результаты по высокоскоростным проколотым сверточным кодам для Витерби и последовательного декодирования», IEEE Transactions on Communications, Vol. 38, No. 11, November, 1990, p. 1923