Мне нужно создать генератор обобщенного гауссовского шума в 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* std вполне достаточно), а затем проверить условие вероятности.
Также важно нарисовать новое значение prob
для каждого проверка вероятности (в цикле while).
Итак, проблема РЕШЕНА
Обратите внимание, что этот генератор позволяет генерировать:
- гауссовский шум для beta = 2
- лапласианский (импульсный) шум для beta = 1
GN
, чтобы он зацикливался бесконечно? - person gnovice   schedule 14.12.2009