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

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

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

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

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

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

  • ДБ ОСШ к Конвертеру Линейной шкалы

  • Гауссов шумовой генератор с модульным отклонением

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

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

ДБ ОСШ к Конвертеру Линейной шкалы

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

Гауссов шумовой генератор с модульным отклонением

Подсистема GaussianNoiseWithUnitVar генерирует Гауссов шум с модульным отклонением при помощи метода Поля-Muller. Метод Поля-Muller использует две равномерно распределенных случайных переменные, чтобы сгенерировать две нормально распределенных случайных переменные через серию логарифмического, квадратного корня, синуса и операций косинуса как показано в этом рисунке. Те два равномерно распределенных случайных varibles сгенерированы с помощью алгоритма Tausworthe.

Реализация HDL универсальное случайное число Tausworthe

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

Подсистема 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). Логарифмическая функция аппроксимирована на уменьшаемой области значений на следующем шаге.

  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 реализованы с помощью существующего HDL Синуса, Оптимизированного (HDL Coder) и HDL Косинуса, Оптимизированный (HDL Coder) блоки в библиотеке HDL Coder / Lookup Tables.

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

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

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

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

whdlexamples.hdlawgnGen_init.m файл скрипта используется, чтобы указать диапазон ОСШ, сгенерировать необходимое количество шумовых выборок, инициализировать seed для TausURNG1 и подсистемы TausURNG2 и сгенерировать коэффициенты для вычисления функции журнала HDL и квадратного корня.

whdlexamples.hdlawgnGen_init.m файл скрипта является функцией инициализации модели HDLAWGNGenerator. Эта функция генерирует входные данные и инициализирует seed для 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 с выходом HDL эквивалентная функция 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. Степень доктора юридических наук Ли, степень доктора юридических наук Виллэзенор, В. Лук и P.H.W. Leong. “Оборудование Гауссов Шумовой Генератор Используя Метод Поля-Muller и Его Анализ ошибок”, 659–71. IEEE, 2006. https://doi.org/10.1109/TC.2006.81.