exponenta event banner

Внедрение HDL генератора AWGN

В этом примере показана реализация аддитивного генератора белого гауссова шума (AWGN), оптимизированного для генерации кода HDL и реализации аппаратных средств. Аппаратная реализация AWGN ускоряет оценку рабочих характеристик систем беспроводной связи с использованием канала AWGN. В этом примере модель Simulink ® принимает значения отношения сигнал/шум (SNR) в качестве входных данных и генерирует гауссовский случайный шум вместе с действительным сигналом. Пример поддерживает входные значения SNR в диапазоне от -20 до 31 дБ с шагом 0,1 дБ.

Современные системы беспроводной связи включают в себя множество различных параметров моделирования, таких как полоса пропускания канала, тип модуляции и скорость кодирования. Оценка производительности этих систем с этими параметрами моделирования является узким местом. Аппаратные возможности FPGA могут ускорить моделирование.

Архитектура модели

% Run this command to open the HDLAWGNGenerator model.
modelname = 'HDLAWGNGenerator';
open_system(modelname);

Этот пример демонстрирует реализацию генератора AWGN на основе метода Бокса-Мюллера. Метод Бокса-Мюллера широко применяется для генерации гауссова шума из-за его аппаратной архитектуры и постоянной выходной скорости. Структура верхнего уровня модели включает эти три подсистемы.

  • Преобразователь SNR дБ в линейный масштаб

  • Гауссовский генератор шума с единичной дисперсией

  • Гауссовский генератор шума с требуемой дисперсией

% Run this command to open the subsystems inside AWGNGenerator model.
open_system([modelname '/AWGNGenerator']);

Преобразователь SNR дБ в линейный масштаб

Подсистема dBtoLinearConverter принимает значение SNR в дБ в качестве входного значения и преобразует его в дисперсию шума в линейном масштабе. Эта мощность шума используется для умножения выходного сигнала гауссова шума на единичную дисперсию. Этот подход таблицы поиска используется для преобразования значения SNR в дБ в значение мощности шума в линейном масштабе. Во время преобразования мощность сигнала принимается равной 1. Эта подсистема имеет задержку 1 тактовый цикл.

Гауссовский генератор шума с единичной дисперсией

Подсистема GaussianNoaseWireUnitVar генерирует гауссовский шум с единичной дисперсией с помощью метода Бокса-Мюллера. Метод Бокса-Мюллера использует две равномерно распределенные случайные величины для генерации двух нормально распределенных случайных величин посредством ряда логарифмических, квадратных корней, синусов и косинусов, как показано на этом рисунке. Эти две равномерно распределенные случайные переменные генерируются с использованием алгоритма Таусворта.

Внедрение равномерного случайного числа Tausworthe HDL

Модуль генератора равномерных случайных чисел Tausworte используется для генерации двух 32-разрядных однородных случайных чисел. Каждое 32-битное однородное случайное число с улучшенными статистическими свойствами получают путем объединения трех линейных регистров сдвига с обратной связью (LFSR), основанных на одинаковых генераторах случайных чисел (URNG). Эта реализация требует этих двух семян: TausURNG1 и TausURNG2. whdlexamples.hdlawgnGen_init.m файл сценария инициализирует эти начальные значения.

Подсистема ConcatandExtract принимает 32-битовые однородные случайные целые числа, a и b, для генерации двух однородных случайных чисел, u0 и u1, в диапазоне [0, 1) с битовой шириной 48 и 16 соответственно. u0 генерируется путем конкатенации 32-битового значения a и более высоких 16 битов b. Равномерное случайное число u1 генерируется путем извлечения нижних 16 битов b.

open_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/TausUniformRandGen']);
close_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/TausUniformRandGen']);
open_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/TausUniformRandGen/TausURNG1']);
close_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/TausUniformRandGen/TausURNG1']);

Внедрение логарифма ЛПВП

Логарифмическая подсистема HDL оценивает приблизительный логарифм на основе кусочно-линейного метода полинома. Этот модуль имеет задержку 3 тактовых цикла. Реализация логарифма ЛВП включает в себя эти три этапа.

  1. Уменьшение диапазона - на этом шаге исходный диапазон ввода, который равен [0, 1-2 ^ (-48)), уменьшается до более удобного меньшего диапазона [1, 2). Функция log аппроксимируется на уменьшенном диапазоне на следующем шаге.

  2. Оценка функции (Function Evaluation) - логарифмическая функция аппроксимируется для 256 равноотстоящих сегментов в диапазоне [1, 2) с помощью многочлена второй степени. Коэффициенты многочлена второй степени получают с помощью polyfit функция. Эти коэффициенты хранятся в таблице поиска, которая индексируется с использованием первых 8 битов ввода в блок оценки функции.

  3. Реконструкция диапазона (Range Reconstruction) - результат оценки функции расширяется до исходного диапазона. Операция сдвига влево используется для реконструкции диапазона и для реализации –2*log функция.

Эта команда используется для открытия логарифмической подсистемы HDL.

open_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/logImplementation/log']);

Реализация квадратного корня ЛВП

Подсистема квадратного корня HDL вычисляет приблизительный квадратный корень на основе кусочно-линейного метода полинома. Этот модуль имеет задержку 2. Реализация квадратного корня ЛВП включает в себя эти три этапа.

  1. Уменьшение диапазона - тип входных данных модуля: fi(0, 31, 24). Этот диапазон уменьшается до меньшего диапазона [1, 4). Функция квадратного корня аппроксимируется в уменьшенном диапазоне на следующем шаге.

  2. Оценка функции - функция квадратного корня аппроксимируется на 64 равноотстоящих отрезках в диапазоне [1, 2) и [2, 4) с помощью многочлена первой степени. Коэффициенты полинома первой степени сохраняются в таблице поиска, которая индексируется с использованием первых 6 битов ввода в блок оценки функции.

  3. Реконструкция диапазона (Range Reconstruction) - результат оценки функции расширяется до исходного диапазона с помощью операции левой смены.

close_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/logImplementation/log']);
open_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/SqrtImplementation/SqrtEval']);

Внедрение ЛПВП синус и косинус

Оптимизированная HDL реализация синусоидальной или косинусной функции использует подход таблицы поиска. Sin и Cos реализуются с использованием существующих блоков Sine HDL Optimized (кодер HDL) и Cosine HDL Optimized (кодер HDL) в библиотеке таблиц кодирования/поиска HDL.

close_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/SqrtImplementation/SqrtEval']);

Гауссовский генератор шума с требуемой дисперсией

Подсистема GaussianNoaseWireReqVar преобразует гауссовский шум с единичной дисперсией в гауссовский шум с требуемой дисперсией. Эта подсистема получает входные данные от подсистем dBToLinearConvertor и GaussianNoureWireUnitVar. Линейная дисперсия шума, полученная из dBToLinearConvertor, умножается на нормально распределенные случайные величины, полученные из GaussianNoureWireUnitVar.

Результаты и графики

whdlexamples.hdlawgnGen_init.m файл сценария используется для задания диапазона SNR, формирования требуемого количества отсчетов шума, инициализации начальных значений для подсистемы TausURNG1 и TausURNG2 и формирования коэффициентов для оценки функций логарифма ЛВП и квадратного корня.

whdlexamples.hdlawgnGen_init.m файл сценария является функцией инициализации модели HDLAWGNGenerator. Эта функция генерирует входные данные и инициализирует начальные значения для tausURNG и коэффициенты для оценки функции. Моделировать HDLAWGNGenerator.slx для генерации 10 ^ 6 действительных выборок AWGN для каждого SNR, равного 5 дБ и 15 дБ. Реализация является конвейерной для максимизации частоты синтеза, генерируя AWGN с начальной задержкой 11. Постройте график функции плотности вероятности (PDF) выхода AWGN.

latency = 11;
NumOfSamples = 10^6;

% Simulate the model
open_system('HDLAWGNGenerator');
set_param(gcs,'SimulationMode','Accel');
fprintf('\n Simulating HDL AWGN Generator...\n');
outSimulink = sim('HDLAWGNGenerator','ReturnWorkspaceOutputs','on');
fprintf('\n Simulation complete.\n');
awgnSimulink = outSimulink.awgnOut;

% Plot PDF
figure;
title('PDF for Real Part of AWGN');
hold on
histogram(real(awgnSimulink(latency+1:NumOfSamples+latency)),500, ...
        'Normalization','pdf','BinLimits',[-2 2],'FaceColor','blue', ...
        'EdgeColor','none');
histogram(real(awgnSimulink(NumOfSamples+latency+1:end)),500,...
        'Normalization','pdf','BinLimits',[-2 2],'FaceColor','yellow', ...
        'EdgeColor','none');
legend('5 dB SNR','15 dB SNR');

figure;
title('PDF for Imaginary Part of AWGN');
hold on
histogram(imag(awgnSimulink(latency+1:NumOfSamples+latency)),500, ...
        'Normalization','pdf','BinLimits',[-2 2],'FaceColor','blue', ...
        'EdgeColor','none');
histogram(imag(awgnSimulink(NumOfSamples+latency+1:end)),500, ...
        'Normalization','pdf','BinLimits',[-2 2],'FaceColor','yellow', ...
        'EdgeColor','none');
legend('5 dB SNR','15 dB SNR');
 Simulating HDL AWGN Generator...

 Simulation complete.

Проверка

Сравните выходные данные модели AWGN Simulink с выходными данными эквивалентной функции AWGN MATLAB ®.

NumOfSamples = 1000;
% MATLAB output
fprintf('\n Simulating MATLAB HDL AWGN Generator for comparison...\n');
awgnMatlab=whdlexamples.hdlawgn(snrdBSimInput(1:NumOfSamples),seedsURNG1,seedsURNG2);
fprintf('\n Simulation complete. \n')

% Compare MATLAB and Simulink outputs
figure;
ax=axes('FontSize', 20);
plot(1:1000,real([awgnSimulink(latency+1:NumOfSamples+latency) awgnMatlab]));
xlabel(ax,'Number of Samples');
ylabel(ax,'Real Part of AWGN');
title(ax,'Comparison of MATLAB and Simulink Output (Real Part)');
legend('Simulink output','MATLAB output');

figure;
ax=axes('FontSize', 20);
plot(1:1000,imag([awgnSimulink(latency+1:NumOfSamples+latency) awgnMatlab]));
xlabel(ax,'Number of Samples');
ylabel(ax,'Imaginary Part of AWGN');
title(ax,'Comparison of MATLAB and Simulink Output (Imaginary Part)');
legend('Simulink output','MATLAB output');
 Simulating MATLAB HDL AWGN Generator for comparison...

 Simulation complete. 

Создание кода HDL

Для проверки и генерации кода HDL, на который ссылается этот пример, необходимо иметь лицензию HDL Coder™.

Для создания кода HDL введите эту команду в командной строке MATLAB.

makehdl('HDLAWGNGenerator/AWGNGenerator')

Для создания испытательного стенда введите эту команду в командной строке MATLAB.

makehdltb('HDLAWGNGenerator/AWGNGenerator')

В этом примере код HDL, сгенерированный для модуля AWGNGenerator, реализован для платы Xilinx ® Zynq ® -7000 ZC706. Результаты внедрения представлены в этой таблице.

Ссылки

1. СТЕПЕНЬ ДОКТОРА ЮРИДИЧЕСКИХ НАУК Ли, Джей Ди. Вилласенор, У. Люк и П.Х.В. Леонг. «Аппаратный гауссовый генератор шума, использующий метод Бокса-Мюллера и его анализ ошибок», 659-71. IEEE, 2006. https://doi.org/10.1109/TC.2006.81.