Générateur de bruit gaussien généralisé dans Matlab
-
19-09-2019 - |
Question
Je dois créer générateur de bruit gaussien dans Généralisée Matlab.
GGN est un signal aléatoire v
de répartition suivante:
v ~ GN(mi, alfa, beta) :
p(v; mi, alfa, beta) = (beta/(2*alfa*gamma(1/beta))) * exp(-(abs(v - mi)/alfa).^beta )
où p est le probablility compté pour la valeur v.
Notez que gamma
est construit en fonction Matlab qui calcule la valeur de fonction Gamma .
Je suis en train de créer le générateur comme suit:
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 );
Mais la boucle semble être infinie, somethings mal.
Notez également que pour:
beta = 2
ce générateur doit renvoyer des valeurs égales à la distribution gaussienne normale avec une valeur moyenne mi
et alfa^2/2
écart-type
Modifier
OK, Doug m'a orienté dans la bonne direction. Nous devons créer la valeur v
qui est plus ou moins probable à sélectionner (je suppose que 10 * std est tout à fait bien), puis vérifier l'état de probabilité.
Il est également important d'établir une nouvelle valeur de prob
pour chaque vérification de probabilité (en boucle while).
Le problème est RESOLU
Notez que ce générateur vous permet de générer:
- bruit gaussien pour beta = 2
- Laplasian (impulsion) bruit pour beta = 1
La solution
J'ai essayé et il a bien fonctionné. Notez que je mets le seuil aléatoire au nombre le plus aléatoire jamais, 0,1 (un choix valable à partir de [0 1]). pval doit être grande que prob soit acceptée.
>> 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
Il semble à moi comme cela est juste une loterie difficile à gagner lorsque le seuil aléatoire est proche de 1. Notez les numéros possibles qui viennent pour pval.
Il n'est pas boucle infinie, juste que vous demandez Matlab de choisir des nombres aléatoires jusqu'à ce que vous gagnez à la loterie, plusieurs fois! On dirait un peu tri stupide