Generalizzata generatore di rumore gaussiano in MATLAB
-
19-09-2019 - |
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
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