В этом примере показана реализация аддитивного генератора белого гауссова шума (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']);

Подсистема 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 тактовых цикла. Реализация логарифма ЛВП включает в себя эти три этапа.
Уменьшение диапазона - на этом шаге исходный диапазон ввода, который равен [0, 1-2 ^ (-48)), уменьшается до более удобного меньшего диапазона [1, 2). Функция log аппроксимируется на уменьшенном диапазоне на следующем шаге.
Оценка функции (Function Evaluation) - логарифмическая функция аппроксимируется для 256 равноотстоящих сегментов в диапазоне [1, 2) с помощью многочлена второй степени. Коэффициенты многочлена второй степени получают с помощью polyfit функция. Эти коэффициенты хранятся в таблице поиска, которая индексируется с использованием первых 8 битов ввода в блок оценки функции.
Реконструкция диапазона (Range Reconstruction) - результат оценки функции расширяется до исходного диапазона. Операция сдвига влево используется для реконструкции диапазона и для реализации –2*log функция.
Эта команда используется для открытия логарифмической подсистемы HDL.
open_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/logImplementation/log']);

Реализация квадратного корня ЛВП
Подсистема квадратного корня HDL вычисляет приблизительный квадратный корень на основе кусочно-линейного метода полинома. Этот модуль имеет задержку 2. Реализация квадратного корня ЛВП включает в себя эти три этапа.
Уменьшение диапазона - тип входных данных модуля: fi(0, 31, 24). Этот диапазон уменьшается до меньшего диапазона [1, 4). Функция квадратного корня аппроксимируется в уменьшенном диапазоне на следующем шаге.
Оценка функции - функция квадратного корня аппроксимируется на 64 равноотстоящих отрезках в диапазоне [1, 2) и [2, 4) с помощью многочлена первой степени. Коэффициенты полинома первой степени сохраняются в таблице поиска, которая индексируется с использованием первых 6 битов ввода в блок оценки функции.
Реконструкция диапазона (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 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.