Этот пример показывает, как использовать сверточные Системные объекты энкодера и Декодера Витерби, чтобы моделировать проколотую систему кодирования. Сложность Декодера Витерби увеличивается быстро с уровнем кода. Прокалывание является методом, который позволяет кодирование и декодирование более высоких кодов уровня с помощью стандартного уровня 1/2 энкодеры и декодеры.
Этот пример демонстрирует симуляцию системы связи, состоящей из случайного бинарного источника, сверточного энкодера, модулятора BPSK, канала аддитивного белого гауссова шума (AWGN) и Декодера Витерби. Пример показывает, как запустить симуляции, чтобы получить кривые частоты ошибок по битам (BER) и сравнивает эти кривые со связанным теоретическим.
Сверточное кодирование с прокалыванием
Создайте уровень 1/2, продолжительность ограничения 7 Системных объектов 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];
Модулятор и канал
Создайте Системный объект BPSKModulator
, чтобы передать закодированные данные с помощью бинарной модуляции манипулирования сдвига фазы по каналу.
bpskMod = comm.BPSKModulator;
Создайте Системный объект 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
Сконфигурируйте Системный объект 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;
Вычисление коэффициента ошибок
Создайте Системный объект калькулятора 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])
В некоторых случаях, с более низкими частотами ошибок по битам, результаты симуляции, кажется, указывают на коэффициенты ошибок немного выше связанного. Это следует из отклонения симуляции (если меньше чем 500 битовых ошибок наблюдаются), или от конечной traceback глубины в декодере.
Мы использовали несколько Системных объектов, чтобы моделировать систему связи со сверточным кодированием и прокалыванием. Мы моделировали систему, чтобы получить производительность BER по сравнению с различными значениями отношения Eb/No. Результаты BER сравнились с теоретическими границами.
Yasuda, Y., К. Кэшики и И. Хирэта, "Высокий показатель Проколотые Сверточные коды для Мягкого Решения Декодирование Viterbi", IEEE® Transactions на Коммуникациях, Издании COM-32, март 1984, стр 315-319
Начните, G., Haccoun, D. и Пакуин, C., "Дальнейшие результаты на Высоком показателе Проколотые Сверточные коды для Viterbi и Sequential Decoding", Транзакции IEEE на Коммуникациях, Издании 38, № 11, ноябрь 1990, p. 1923