Rotor

Генератор Шума (Vhdl)

12 сообщений в этой теме

Rotor    0

Приветствую!

Задача: создать генератор шума с нормальным распределением.

Получил ПСП с помощью LFSR, дальше, как я понимаю, надо реализовать преобразование Бокса-Мюллера для получения из равномерного распределения нормального.

В этом пока и состоит загвоздка. Надо корень, ln и cos c sin.

Или есть другой способ получения из равномерного распределения нормального?

Что имею пока:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.std_logic_unsigned.all;

entity LFSR_1 is

PORT(

clk: in std_logic;

RND: out std_logic

);

end LFSR_1;

architecture Behavioral of LFSR_1 is

signal tmp: std_logic_vector(31 downto 0):= (others=>'1') ;

begin

process (clk, tmp)

begin

if tmp=0 then tmp <= (others=>'1');

elsif (clk'event and clk='1') then

for i in 0 to 30 loop

tmp(i+1) <= tmp(i);

end loop;

tmp(0) <= tmp(31) xor tmp(21) xor tmp(1) xor tmp(0);

end if;

end process;

RND <= tmp(31);

end Behavioral;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    657

Есть и другой способ - центральная предельная теорема.

То есть если сложить много независимых одинаково распределённых случайных величин, то получится нормально распределённая случайная величина.

На практике неплохое соответствие нормальному распределению получается при сложении уже 15-20 равномерно распределённых случайных величин.

Пример. Создадим 20 равномерно распределённых последовательностей по 10000 чисел:

a = unifrnd(-10,10,20,10000);

Гистограмма соответствует равномерному распределению:

post-164632-0-35980000-1451045873.png

Теперь сложим 20 последовательностей

b=zeros(1,10000);
for k=1:20 b=b+a(k, ; end

И посмотрим гистограмму полученной суммы:

post-164632-0-06199500-1451045996.png

Нормальное распределение.

Изменено пользователем Vascom

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Rotor    0

О не я подумал тоже.

Для этого мне нужно минимум 12 таких таких циклов, для получения соответственно 12 псевдослучайных последовательностей и потом загнать все это в сумматор, правильно я понимаю? И у каждой последовательности в сдвиговых регистрах должны быть не повторяющиеся стартовые значения?

Это аж минимум 12*32 регистров будет задействованно и куча лут таблиц- всю ПЛИС этим забью, а ведь там еще куча имитирвать сигналов надо будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    657

Зависит от ПЛИС конечно, но 12 32-разрядных регистров - это же копейки.

Какую ПЛИС используете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Rotor    0

Мммм, раз копеки надо делать, предположительно Virtex 6.

А как потом проверить- построить АКФ и ПРВ с помощью Моделсима? Завязать его или ise webpack с матлабом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    657

Ну для Virtex 6 это точно копейки.

Можешь промоделировать, вывести в файл и проверить всё в Octave/matlab.

По хорошему сперва надо на сишной или матлабовской модели всё проверить, потом уже имплементировать на HDL и смотреть как это будет разводиться и сколько места занимать в FPGA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Rotor    0

Получается, я генерирую 12 вот таких последовательностей (правильно?):

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.std_logic_unsigned.all;

entity LFSR_1 is

PORT(

clk: in std_logic;

RND: out std_logic

);

end LFSR_1;

architecture Behavioral of LFSR_1 is

signal tmp: std_logic_vector(31 downto 0):= (others=>'1') ; ---- только с различными начальными значениями

begin

process (clk, tmp)

begin

if tmp=0 then tmp <= (others=>'1'); ---- вот здесь у меня стоит вопрос и сомнения, если например нач значение signal tmp: std_logic_vector(31 downto 0):= (tmp(0) => '0' others=>'1')

elsif (clk'event and clk='1') then ------ tmp примет значения others=>'0' раньше чем 2^32-1, я сново присвою ему (tmp(0) => '0' others=>'1')- это вообще не хорошо мне кажется??

for i in 0 to 30 loop ---- Если все значения будут=0, то регистр будет молотить эти нули в пустую и плакала ПСП

tmp(i+1) <= tmp(i);

end loop;

tmp(0) <= tmp(31) xor tmp(21) xor tmp(1) xor tmp(0);

end if;

end process;

RND <= tmp(31);

end Behavioral;

Что-то не так мне кажется я написал LFSR,

И еще вопрос как вывести файл и промоделиовать потом, матлаб есть, но я с ним совершенно не дружу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    657

А я не дружу с VHDL. Вот если бы Verilog, то посмотрел бы код.

Пока только алгоритмически предлагаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Rotor    0

Надо как-то выколоть tmp (others=>'0'), я же верно мыслю

Как много я назадавал вопросов :bye:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    657

Ну задай разные начальные значения, которые будут генерировать разные м-последовательности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Rotor    0

Завтра,так и сделаю и буду держать в курсе

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Meteor77    10

Ну задай разные начальные значения, которые будут генерировать разные м-последовательности.

Что бы генераторы не были коррелированы надо иметь разные значения обратной связи, а не начальные значения.

Петли ОС у ТС задаются строкой tmp(0) <= tmp(31) xor tmp(21) xor tmp(1) xor tmp(0);

Вот в ней надо менять разные индексы кроме "старшего", т.е. того, в направлении которого идет сдвиг

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас