Этот пример показов, как использовать сверточный энкодер и Системные объекты декодера Витерби для симуляции проколотой системы кодирования. Сложность декодера 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])
В некоторых случаях при более низких частотах битовой ошибки результаты симуляции, по-видимому, указывают на частоту ошибок, немного превышающую границу. Это происходит из-за отклонения симуляции (если наблюдается менее 500 битовых ошибок) или из-за конечной глубины отслеживания в декодере.
Мы использовали несколько системные объекты, чтобы симулировать коммуникационную систему со сверточным кодированием и прокалыванием. Мы моделировали систему, чтобы получить эффективность BER от различных значений отношения Eb/No. Результаты BER сравнивали с теоретическими границами.
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
Begin, G., Haccoun, D. and Paquin, C., «Дальнейшие результаты по высокоскоростным пунктированным сверточным кодам для Viterbi и последовательного декодирования», Транзакции IEEE по коммуникациям, том 38, № 11, ноябрь 1990, стр. 1923