Пунктированное сверточное кодирование

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

Введение

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

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

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

Создайте скорость 1/2, длина ограничения 7 comm.ConvolutionalEncoder Системный объект. Этот энкодер принимает однобитовые символы в качестве входов и генерирует 2-битовые символы в качестве выходов. Если вы предполагаете 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);

Декодирование Viterbi с депункционированием

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

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

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

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

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

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

vitDecoder.TracebackDepth = 96;

Вычисление частоты ошибок

Создайте comm.ErrorRate Системный объект калькулятора для сравнения декодированных битов с исходными переданными битами. Объект вычислителя выхода частоты ошибок является трехэлементным вектором, содержащим вычисленную вероятность битовой ошибки (BER), количество наблюдаемых ошибок и количество обработанных бит. Декодер Viterbi создает задержку в выход декодированном битовом потоке, равную длине отслеживания. Чтобы учесть эту задержку, установите ReceiveDelay свойство вычислителя частоты ошибок Системный объект 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 битовых ошибок) или из-за конечной глубины отслеживания в декодере.

Сводные данные

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

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

  1. Yasuda, Y., K. Kashiki, and Y. Hirata, «High Rate Puctured Convolutional Codes for Soft Decoding Viterbi», IEEE ® Transactions on Communications, Vol. COM-32, March, 1984, pp. 315-319

  2. Begin, G., Haccoun, D. and Paquin, C., «Дальнейшие результаты по высокоскоростным пунктированным сверточным кодам для Viterbi и последовательного декодирования», Транзакции IEEE по коммуникациям, том 38, № 11, ноябрь 1990, стр. 1923