Генератор гауссовского шума в матлабе
Мне нужно создать генератор обобщенного гауссовского шума в Matlab.
GGN - случайный сигнал v
следующего распространения:
v ~ GN(mi, alfa, beta) :
p(v; mi, alfa, beta) = (beta/(2*alfa*gamma(1/beta))) * exp(-(abs(v - mi)/alfa).^beta )
Где p - вероятность, подсчитанная для значения v.
Обратите внимание, что gamma
встроена функция Matlab, которая вычисляет значение гамма-функции.
Я пытался создать генератор следующим образом:
function gn = GN(dim1, dim2, mi, alfa, beta)
gn = zeros(dim1, dim2);
for i=1:dim1
for j=1:dim2
v = mi + 10*(alfa^2)* rand(1) - 5*(alfa^2);
prob = rand(1);
while(p(v, mi, alfa, beta) < prob)
v = mi + 10*alfa* rand(1) - 5*alfa;
prob = rand(1);
end
gn(i,j) = v;
end
end
function pval = p(v, mi, alfa, beta)
pval = (beta/(2*alfa*gamma(1/beta))) * exp(-(abs(v - mi)/alfa).^beta );
Но цикл кажется бесконечным, что-то не так.
Обратите внимание, что для: beta = 2
этот генератор должен возвращать значения, равные нормальному распределению Гаусса со средним значением mi
и стандартное отклонение alfa^2/2
Редактировать ОК, Даг указал мне в правильном направлении. Нам нужно создать v
значение, которое более или менее вероятно будет выбрано (я предположил, что 10* стандартное значение достаточно хорошо), а затем проверьте условие вероятности.
Также важно нарисовать новый prob
значение для каждой проверки вероятности (в цикле while).
Так что проблема решена
Обратите внимание, что этот генератор позволяет генерировать:
- гауссовский шум для beta = 2
- Лапласовский (импульсный) шум для beta = 1
1 ответ
Я попробовал это, и это работало нормально. Обратите внимание, что я установил случайное пороговое значение на самое случайное число в истории, 0,1 (допустимый выбор из [0 1]). pval должен быть больше, чем prob, чтобы быть принятым.
>> GN(2,2,1,1,2)
prob =
0.1000
pval =
0.4738
prob =
0.1000
pval =
0.2674
prob =
0.1000
pval =
0.4885
prob =
0.1000
pval =
0.5473
ans =
0.5821 0.1358
0.6204 0.8254
Мне кажется, это просто трудная лотерея, чтобы выиграть, когда случайный порог близок к 1. Обратите внимание на возможные числа, которые выходят для pval.
Это не бесконечный цикл, просто вы просите MATLAB выбирать случайные числа, пока вы не выиграете в лотерею несколько раз! Похоже, немного Bogosort