Pergunta

Eu preciso criar gerador de ruído Generalized Gaussian em Matlab.

GGN é uma v sinal aleatório da seguinte distribuição:

v ~ GN(mi, alfa, beta) :

p(v; mi, alfa, beta) = (beta/(2*alfa*gamma(1/beta))) * exp(-(abs(v - mi)/alfa).^beta )

Onde p é o probablility contados para o valor v.

Note, que gamma é construído em função Matlab que calcula o valor de função Gamma .

Eu estava tentando criar o gerador na seguinte forma:

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 );

Mas o circuito parece ser infinita, Algo está errado.

Note também, que para:
beta = 2 este gerador deve retornar valores iguais a distribuição de Gauss normal com mi valor médio e desvio padrão alfa^2/2

Editar OK, Doug me apontou na direção certa. Nós precisamos criar o valor v que é mais ou menos provável a ser selecionado (eu assumi, que 10 * std é muito bom) e, em seguida, verificar a condição de probabilidade.
Também é importante para desenhar um novo valor prob para cada cheque de probabilidade (em loop while).
Portanto, o problema é RESOLVIDO

Note que este gerador permite gerar:
- ruído Gaussian para beta = 2 - Laplasian (impulso) de ruído para beta = 1

Foi útil?

Solução

Eu tentei isso e ele funcionou bem. Nota que eu definir o limite aleatório para o número mais aleatória nunca, 0,1 (uma opção válida a partir de [0 1]). pval deve ser grande do que prov para ser aceito.

>> 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

Parece-me que este é apenas um sorteio difícil ganhar quando o limite aleatória está perto de 1. Observe os números possíveis que saem para pval.

Não é loop infinito, só que você está pedindo MATLAB para escolher números aleatórios até que você ganhar na loteria, várias vezes! Parece ser um pouco de um bogosort

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top