Этот пример показывает реализацию аддитивного генератора белого Гауссова шума (AWGN), который оптимизирован для генерации HDL-кода и аппаратной реализации. Аппаратная реализация AWGN ускоряет оценку эффективности систем радиосвязи с помощью канала AWGN. В этом примере модель Simulink ® принимает значения отношения сигнал/шум (ОСШ) в качестве входов и генерирует Гауссов случайный шум вместе с действительным сигналом. Пример поддерживает входные значения ОСШ в областях значений от -20 до 31 дБ в шагах 0,1 дБ.
Современные системы радиосвязи включают много различных параметров симуляции, таких как полоса пропускания канала, тип модуляции и кодовая скорость. Оценка эффективности этих систем с этими параметрами симуляции является узким местом. Аппаратные возможности FPGA могут ускорить симуляции.
% Run this command to open the HDLAWGNGenerator model.
modelname = 'HDLAWGNGenerator';
open_system(modelname);
Этот пример демонстрирует реализацию генератора AWGN на основе метода Box-Muller. Метод Box-Muller широко принят для генерации Гауссова шума из-за его аппаратной удобной архитектуры и постоянной выходной частоты. Структура верхнего уровня модели включает эти три подсистемы.
Преобразователь dB ОСШ в линейный масштабный преобразователь
Генератор Гауссова шума с единичным отклонением
Генератор Гауссова шума с необходимым отклонением
% Run this command to open the subsystems inside AWGNGenerator model.
open_system([modelname '/AWGNGenerator']);
Подсистема dBtoLinearConverter принимает значение ОСШ в дБ как вход и преобразует его в отклонение шума в линейной шкале. Эта шумовая степень используется, чтобы умножить выход Гауссова шума с единичным отклонением. Этот подход интерполяционной таблицы используется для преобразования значения ОСШ в дБ в значение степени шума в линейной шкале. Во время преобразования степень сигнала принимается равной 1. Эта подсистема имеет задержку 1 такт.
Подсистема GaussianNoiseWithUnitVar генерирует Гауссов шум с единичным отклонением с помощью метода Box-Muller. Метод Box-Muller использует две равномерно распределенные случайные переменные, чтобы сгенерировать две нормально распределенные случайные переменные через ряд логарифмических, квадратный корень, синус и косинусоидные операции, как показано на этом рисунке. Эти два равномерно распределенных случайных переменных сгенерированы с помощью алгоритма Таусворта.
Реализация равномерного случайного числа Tausworth HDL
Модуль генератора единых случайных чисел Tausthe используется для генерации двух 32-битных равномерных случайных целых чисел. Каждое 32-битовое равномерное случайное число с улучшенными статистическими свойствами получают путем объединения трех основанных на линейной обратной связи регистров сдвига (LFSR) генераторов равномерных случайных чисел (URNG). Эта реализация требует этих двух семян: TausURNG1 и TausURNG2. The 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
Подсистема логарифма HDL оценивает приблизительный логарифм на основе кусочно-линейного полиномиального метода. Этот модуль имеет задержку в 3 такта. Реализация логарифма HDL включает эти три шага.
Сокращение области значений - На этом шаге исходная область значений входа, который составляет [0, 1-2 ^ (-48)), уменьшается до более удобной меньшей области значений [1, 2). Функция log аппроксимируется к уменьшенной области значений на следующем шаге.
Вычисление функции - логарифмическая функция аппроксимируется над 256 сегментами с равными интервалами в области значений [1, 2) при помощи полинома второй степени. Коэффициенты полинома второй степени получаются с помощью polyfit
функция. Эти коэффициенты хранятся в интерполяционной таблице, которая индексируется с использованием первых 8 бит входа в блок вычисления функции.
Реконструкция области значений - результат вычисления функции расширен до исходной области значений. Операция бита немного влево используется для реконструкции области значений и для реализации –2*log
функция.
Выполните эту команду, чтобы открыть подсистему логарифма HDL.
open_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/logImplementation/log']);
Внедрение HDL- Квадратного корня
Корневая подсистема HDL-квадрат оценивает приблизительный квадратный корень на основе кусочно-линейного полиномиального метода. Этот модуль имеет задержку 2. Реализация HDL квадратного корня включает эти три шага.
Сокращение области значений - тип входных данных для модуля fi(0, 31, 24)
. Эта область значений сокращается до меньшей области значений [1, 4). Функция квадратного корня аппроксимируется на уменьшенной области значений на следующем шаге.
Вычисление функции - функция квадратного корня аппроксимируется над 64 сегментами с равными интервалами в область значений [1, 2) и [2, 4) при помощи полинома первой степени. Коэффициенты полинома первой степени хранятся в интерполяционной таблице, которая индексируется с использованием первых 6 бит входа в блок вычисления функции.
Реконструкция области значений - результат вычисления функции расширен до исходной области значений с помощью операции левого сдвига.
close_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/logImplementation/log']); open_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/SqrtImplementation/SqrtEval']);
Реализация HDL-синуса и косинуса
Оптимизированная HDL реализация функции синуса или косинуса использует подход интерполяционной таблицы. Sin и Cos реализованы с использованием существующих блоков Sine HDL Optimized (HDL Coder) и Cosine HDL Optimized (HDL Coder) в библиотеке HDL Coder/Lookup Tables.
close_system([modelname '/AWGNGenerator/GaussianNoiseWithUnitVar/SqrtImplementation/SqrtEval']);
Подсистема ГауссоваНойзаWithReqVar преобразует Гауссов шум с единичным отклонением в Гауссов шум с необходимым отклонением. Эта подсистема берёт входы из подсистем d BT o Linear Convertor и Gaussian Noise With Unit Var. Линейное шумовое отклонение, полученная из d BT o Linear Convertor, умножается на нормально распределенные случайные переменные, полученные из Gaussian Noise With Unit Var.
The whdlexamples.hdlawgnGen_init.m
файл скрипта используется, чтобы задать область значений ОСШ, сгенерировать необходимое количество шумовых выборок, инициализировать начальные значения для TausURNG1 и TausURNG2 подсистемы и сгенерировать коэффициенты для вычисления функции HDL- журнала и квадратного корня.
The whdlexamples.hdlawgnGen_init.m
файл скрипта является функцией инициализации модели HDLAWGNGenerator. Эта функция генерирует входные данные и инициализирует начальные значения для tausURNG и коэффициенты для вычисления функции. Моделируйте HDLAWGNGenerator.slx
чтобы сгенерировать 10 ^ 6 допустимые выборки AWGN для каждого ОСШ 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 ® эквивалентной функции HDL.
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, реализован для платы ZC706 Xilinx ® Zynq ® -7000. Результаты реализации показаны в этой таблице.
1. СТЕПЕНЬ ДОКТОРА ЮРИДИЧЕСКИХ НАУК Ли, Джей Ди. Вилласенор, У. Лук и П.Х.В. Леонг. «Генератор Оборудования Гауссова шума с использованием метода Бокса-Мюллера и его Ошибки анализа», 659-71. IEEE, 2006. https://doi.org/10.1109/TC.2006.81.