Генератор обобщенного гауссовского шума в Matlab

Мне нужно создать генератор обобщенного гауссовского шума в 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


person Gacek    schedule 14.12.2009    source источник
comment
Какие значения вы передаете GN, чтобы он зацикливался бесконечно?   -  person gnovice    schedule 14.12.2009
comment
Если это помогло, пожалуйста, примите ответ. Спасибо! Дуг   -  person MatlabDoug    schedule 16.12.2009


Ответы (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

person MatlabDoug    schedule 14.12.2009
comment
спасибо Дуг, ты указал мне правильное направление. Решение состоит в том, чтобы перед проверкой вероятности создать случайное значение, которое с большей или меньшей вероятностью будет выбрано. Спасибо! - person Gacek; 16.12.2009