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    645

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

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

На практике неплохое соответствие нормальному распределению получается при сложении уже 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    645

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

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

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


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

Найдите миллионы труднодоступных

электронных компонентов

Rotor    0

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

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

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


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

Ну для 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    645

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

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

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


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

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

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

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


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

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

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


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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • Да лампочкой конечно на 220В.   Для начала этот до ума доведи.
    • Зачем вы такие злые? Как могу, так и понимаю... --- В общем и целом запустился, все работает, но... Осликом тыкал без развязки, хорошо не погорел, начинает потом глючить...но это ладно, надо от акума питать... Неисправность довольно непонятная...вышел из строя D015, заменил и все заработало.Проверял диод цешкой, кажет, что рабочий...непонятно. Он соединен не как в схеме, а идет последовательно с D08! Идем дальше... Вентиляторов 2, в момент запуска оба стартуют, потом один (первый) останавливается. Каждый старт, так происходит. Ну думаю, что-то с вентелем случилось. Вот теперь, внимательно, отпаиваю его, а теперь второй стартует и останавливается. Обратно запаиваю, все обратно вернулось...Что за чехарда такая???  И заключительный вопрос. Чем разрядить емкости? В сварочнике у меня стоит 4 банки по 560мкф. Впаивал 3 по 560к 0.5вт не помогает. Сварочник пытается сново запуститься...банки не разряжены!!! или больше резюков надо добавить? -------- Про микру читал...я понимаю, как примерно работает.  Я смотрю на сварочник на схему, снова на сварочник на схему и тут рождается мысль....можно проще сделать и надежнее аппарат...как думаете?
    • Недавича латунь старил в парах нашатыря. Покупается в аптеке. Проверить время выдержки на ненужном кусочке.
    • К примеру такой ШИМ: Его схема такова: Заменив транзисторы на низкоомные (например irfb3207) и пропаяв выводы толстыми шинами, обеспечив ne555 стабильным питанием(батарейка на 12 вольт например к C8), добавив активное охлаждение, добавив ёмкости, схема вытянет и 300 ампер.
    • Дык практически вышеуказанным тросиком, только наматывать его на ось (механизма подачи) в обратном направлении. В качестве рукава для этого тросика возьмите оболочку троса спидометра от какого-нибудь ТАЗика. Да и сам тросик в дело пойдет, только вам  его скорее всего нарастить придется (смотря как трос прокладывать будете от станка и до педали).
    • Если входное напряжение устраивает, то можно попробовать запараллелить 4 штуки. Регуляторами выходного напряжения выставить, чтобы ток делился поровну.