• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
nikellanjilo

Центральная Предельная Теорема

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

Доброго времени суток, уважаемые форумчане.

Вопрос состоит в следующем - мне нужно по ЦПТ получить нормальное распределение. Я решил сделать сделать это по ЦПТ (возможно как-то еще можно).

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

Собственно вопрос. У меня есть уже сумма из 12 или n слабозависимых величин, какую мне нужно сделать над ними операцию, чтобы получить свой колокол с нужным матожиданием и дисперсией.

Собственно - матожидание понятно, просто сумма: матожидание+(выражение) , но что мне нужно сделать в выражении чтобы значения укладывались в заданное мною СКО.

Ссылка на ЦПТ в википедии ====>.

https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Vascom    605

Просто посчитай получающуюся дисперсию. Затем умножь числа на 2 и посчитай снова. И тебе станет ясно на сколько надо умножать, чтобы получить требуемую дисперсию.

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


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

То есть если поэтапно.

1. Я считаю сумму всех значений, делю на количество - получаю среднее значение (чтобы потом найти дисперсию),

2. Затем нахожу дисперсию каждой величины

3. Нахожу дисперсию суммарную

4. Проделываю снова все для 2хЗНАЧЕНИЙ

5. Нахожу нужный коэффициент, на который буду домножать, чтобы значения укладывались в СКО

Так?

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


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

Эм... проще так:

У тебя есть набор случайных чисел, допустим 1000 штук в массиве noise. Выполни в Matlab или Octave функцию mean(noise) - получишь матожиданее, выполни std(noise) получишь СКО (соответственно std(noise)^2 - это дисперсия).

Это чтобы не запутаться в вычислениях.

Затем умножь массив noise на 2 и повтори вычисления матожидания и дисперсии.

P.S. 1000 значений может быть мало, возьми миллион.

Вот пример

octave:8> n=normrnd(1,5,1000000,1);
octave:9> mean(n)
ans = 1.0031
octave:10> std(n)
ans = 5.0054
octave:11> std(n*2)
ans =  10.011

В первой строке создаётся одномерный массив из миллиона элементов с матожиданием 1 и СКО (sigma) 5. Вычисления mean и std довольно точны.

Если умножим числа на 2, то и СКО увеличится в два раза, а дисперсия в 4 раза.

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

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


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 094
Я генерирую рандом, используя сдвиговый регистр с линейной обратной связью, затем суммирую полученные значения. Но вот если посмотреть то, что у меня получается - это далеко не колокол Гауссовский.

может это поможет?

http://www.microchip.su/showthread.php?t=4487&page=43

посты 1074-1077

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


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

Хорошо если так, когда есть матлаб, но как мне все это использовать в железе? На ПЛИСе

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


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

Ну можно (нужно) промоделировать всё это в симуляторе перед программированием ПЛИС.

Мы же не знаем конкретную твою задачу. Например нужно ли тебе менять матожидание и дисперсию в процессе работы.

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

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


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

module gauss(
input [7:0] MO,
input [7:0] CKO,
input CLK,
output reg [7:0] GAUS,
output reg [7:0] CH,
output reg [7:0] SUMMER
);
reg [7:0] change = 8'd12;
wire feed = change[7]^change[5]^change[4]^change[3];
reg [7:0] count=8'd0;
reg [7:0] sum = 8'd0;
always @(posedge CLK)
begin
change[0]<=feed;
change[7:1]<=change[6:0];
if (count<12)
begin
 count<=count+1;
 sum<=$signed(sum)+$signed(change);
end
else
begin
 count<=0;
 sum<=0;
 SUMMER<=$signed(sum);
 CH<=$signed(change);
 GAUS<=$signed(MO)+(($signed(sum)*$signed(CKO))/144);	
end

end
endmodule

По-сути:

1. Делаю методом Фебоначи на сдвиговом регистре с линейной обратной связью рандом,

2. По ЦПТ - считаю сумму 12 элементов,

3. Перевожу значения чтобы получилось нормальное распределение

Но получается бячное что-то...

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

Собственно вот так :thank_you2: :thank_you2:

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


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

Короче... Делал через Бокса-Мюллера, промоделировал модель в Маткаде... потом код скину

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


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

Основная проблема - переполнение регистра sum. Увеличь его разрядность и всё станет лучше.

Я тут переписал твой код чтобы проще и понятнее было.

Сам модуль http://paste.fedorap...215922/15779614

И тестбенч для его запуска http://paste.fedorap...215923/01578031

Получаемое распределение

post-164632-0-81944900-1430158014.png

Конечно не чистый гаусс, но и метод генерации у тебя очень простой.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Похожие публикации

    • Автор: Никита Федотов
      Привет всем! Я буду не многословен и сюда буду выкладывать в основном фото винтовки и видео с различных испытаний. Если на видео я буду чу-чуть ругаться, то не обращайте внимания... Это такие волшебные слова от которых просто все начинает лучше работать =)
       
    • Автор: nikellanjilo

      Доброго времени суток уважаемые форумчане.
      Мой вопрос состоит в следующем - как можно сделать генератор белого гауссовского шума для ПЛИС?
      Без использования MatLab, только силами языка описания аппаратуры Verilog, VHDL.
      Проблема в том, что я генерирую рандом, который имеет равномерное распределение, а вот чтобы из равномерного получить нормальное Гауссово - есть кое-какие проблемы.
      Может вообще есть путь по-проще или как решить ту проблему у которой я сейчас стою... Может есть какие мыслишки? :buba:
    • Автор: Меченый
      Недавно наткнулся на видео, где гаусс-пушка могла стрелять очередями. Схема имела 8 соленоидов с оптопарами. Там только в схеме(как я понял), не было конденсатора, как во всех классических схемах, а энергия подавалась на каждый соленоид прямо из аккумуляторной батареи, состоящей из двух акумов по 3600 мА/ч и 22 В, соединенных последовательно.
      Вот видео:


      Вопросы к профессионалам:
      1) Подскажите пожалуйста, можно ли без ограничивающего сопротивления использовать 4 автомобильных аккумулятора на 12 В, соединенных последовательно(емкость 56 А/ч, пусковой ток 480 А)
      2) Можете, пожалуйста, подкинуть схемку фотодетектора(на фоторезисторах или фототранзисторах), в которой бы пересекание луча открывало мощный транзистор(что бы выдерживал ток из вопроса 2 и напряжение 50 В), при этом транзистор должен потом закрываться, когда свет попадет на датчик снова
      PS: Просьба ногами не пинать, в теоретической части я пока что нуб, и очень нуждаюсь в вашей помощи