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

В этом примере показано, как использовать сверточные Системные объекты энкодера и Декодера Витерби, чтобы симулировать проколотую систему кодирования. Сложность Декодера Витерби увеличивается быстро со скоростью кода. Прокалывание является методом, который позволяет кодирование и декодирование более высоких кодов уровня с помощью стандартного уровня 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, декодирующий с Depuncturing

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

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

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

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

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

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

vitDecoder.TracebackDepth = 96;

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

Создайте comm.ErrorRate Системный объект калькулятора, чтобы сравнить декодируемые биты с исходными переданными битами. Выход объекта калькулятора коэффициента ошибок является трехэлементным вектором, содержащим расчетную частоту ошибок по битам (BER), количество ошибок, наблюдаемых и количество обработанных битов. Декодер Витерби создает задержку декодируемого потока битов выхода, равного traceback длине. С учетом этой задержки устанавливает 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, передайте кадры 3 000 битов через систему связи. Для каждого значения 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 object. The axes object 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 битовых ошибок наблюдаются), или от конечной traceback глубины в декодере.

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

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

Выбранная библиография

  1. Yasuda, Y., К. Кэшики и И. Хирэта, "Высокий показатель Проколотые Сверточные коды для Мягкого Решения Декодирование Viterbi", IEEE® Transactions на Коммуникациях, Издании COM-32, март 1984, стр 315-319

  2. Начните, G., Haccoun, D. и Пакуин, C., "Дальнейшие результаты на Высоком показателе Проколотые Сверточные коды для Viterbi и Sequential Decoding", Транзакции IEEE на Коммуникациях, Издании 38, № 11, ноябрь 1990, p. 1923