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

В некоторых случаях при более низких коэффициентах битовых ошибок результаты моделирования, по-видимому, указывают коэффициенты ошибок немного выше границы. Это является результатом дисперсии моделирования (если наблюдается менее 500 битовых ошибок) или конечной глубины отслеживания в декодере.
Мы использовали несколько объектов System для моделирования системы связи со сверточным кодированием и прокалыванием. Мы смоделировали систему, чтобы получить производительность BER по сравнению с различными значениями отношения Eb/No. Результаты BER сравнивали с теоретическими границами.
Yasuda, Y., K. Kashiki и Y. Hirata, «High Rate Punctured Convolutional Codes for Soft Decoding Viterbi», IEEE ® Transactions on Communications, том COM-32, март 1984, стр. 315-319
Begin, G., Haccoun, D. и Paquin, C., «Дальнейшие результаты по высокоскоростным проколотым сверточным кодам для Витерби и последовательного декодирования», IEEE Transactions on Communications, Vol. 38, No. 11, November, 1990, p. 1923