Domanda

Ho bisogno di creare Generalized generatore di rumore gaussiano in Matlab.

GGN è un segnale casuale di v seguente distribuzione:

v ~ GN(mi, alfa, beta) :

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

dove p è la probablility contato valore v.

Si noti che gamma è costruito in funzione Matlab che calcola il valore di funzione Gamma .

Stavo cercando di creare il generatore in modo seguente:

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

Ma il ciclo sembra essere infinita, Qualcosa è sbagliato.

Si noti inoltre che per:
beta = 2 questo generatore deve restituire valori pari normale distribuzione gaussiana con mi valore medio e deviazione standard alfa^2/2

Modifica OK, Doug mi ha segnalato nella giusta direzione. Abbiamo bisogno di creare il valore v che è più o meno probabile essere selezionato (ho pensato, che il 10 * std è abbastanza buono) e quindi controllare la probabilità condizionata.
E 'anche importante per disegnare un nuovo valore prob per ogni controllo probabilità (in ciclo while).
Quindi il problema è RISOLTO

Si noti che questo generatore consente di generare:
- rumore gaussiano per beta = 2 - Laplasian (impulso) rumore per beta = 1

È stato utile?

Soluzione

Ho provato questo e ha funzionato bene. Si noti che ho impostato la soglia casuale per il numero più casuale mai, 0.1 (una scelta valida dal [0 1]). pval deve essere grande rispetto prob per essere accettata.

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

Sembra a me come questo è solo una lotteria difficile vincere quando la soglia casuale è vicino a 1. Si noti i possibili numeri che vengono fuori per pval.

Non è loop infinito, solo che si sta chiedendo MATLAB di scegliere numeri casuali fino a vincere la lotteria, più volte! Sembra un po 'di un Stupid Sort

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top