2009-12-14 20 views
1

Je dois créer un générateur de bruit gaussien généralisé en Matlab.Générateur de bruit gaussien généralisé en 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 valeur v

de notes, qui gamma est construit en fonction Matlab qui calcule la valeur de Gamma function. .

J'ai essayé de créer le générateur manière suivante:

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 aussi que pour:
beta = 2 ce générateur doit renvoyer des valeurs égales à la distribution gaussienne normale avec une valeur moyenne mi et écart-type alfa^2/2

Modifier OK, Doug m'a orienté dans la bonne direction. Nous devons créer la valeur v qui est plus ou moins probable d'être sélectionnée (j'ai supposé que 10 * std est assez bon) et ensuite vérifier la condition de probabilité.
Il est également important de dessiner une nouvelle valeur prob pour chaque vérification de probabilité (dans la boucle while).
Le problème est RESOUDRE

Notez que ce générateur vous permet de générer:
- bruit gaussien pour beta = 2 - Laplasian (impulsion) bruit pour beta = 1

+0

Quelles valeurs passez-vous à 'GN' qui le fait boucler infiniment? – gnovice

+0

Si cela a aidé, veuillez accepter la réponse. Merci! Doug – MatlabDoug

+0

Désolé, j'ai oublié;) – Gacek

Répondre

2

J'ai essayé et il a bien fonctionné . Notez que j'ai mis le seuil aléatoire au nombre le plus aléatoire jamais égal à 0.1 (un choix valide de [0 1]). pval doit être grand que prob pour être accepté.

>> 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 me semble que 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.

Ce n'est pas une boucle infinie, juste que vous demandez à MATLAB de choisir des nombres aléatoires jusqu'à ce que vous gagniez la loterie, plusieurs fois! Cela ressemble à un peu de Bogosort

+0

merci Doug, vous m'a indiqué la bonne direction. La solution consiste à - avant de tester la probabilité - créer une valeur aléatoire plus ou moins probable à sélectionner. Merci! – Gacek