HDL- Реализации генератора AWGN

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

Преобразователь dB ОСШ в линейный масштабный преобразователь

Подсистема 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 включает эти три шага.

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

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

  3. Реконструкция области значений - результат вычисления функции расширен до исходной области значений. Операция бита немного влево используется для реконструкции области значений и для реализации –2*log функция.

Выполните эту команду, чтобы открыть подсистему логарифма HDL.

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

Внедрение HDL- Квадратного корня

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

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

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

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

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-код, на который ссылаются в этом примере, необходимо иметь лицензию 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.