Generalizada gerador de ruído Gaussian em Matlab
-
19-09-2019 - |
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
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