1

Matlabで一般化ガウスノイズジェネレーターを作成する必要があります。

vGGNは、次の分布のランダム信号です。

v ~ GN(mi, alfa, beta) :

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

ここで、pは値vとしてカウントされる確率です。

これは、ガンマ関数gammaの値を計算するMatlab関数に組み込まれていることに注意してください。

私は次の方法でジェネレーターを作成しようとしていました:

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

しかし、ループは無限のようで、何かがおかしいです。

また、次の点にも注意してください。このジェネレーターは、平均値と標準偏差
beta = 2を持つ正規ガウス分布に等しい値を返す必要があります。mialfa^2/2

編集 OK、ダグは私を正しい方向に向けました。v多かれ少なかれ選択される可能性が高い値を作成し(10 * stdが非常に良いと仮定しました)、確率条件を確認する必要があります。(whileループで)確率チェックごと
に新しい値を描画することも重要です。 だから問題は解決しましprob

このジェネレータを使用すると、次のものを生成できることに注意してください。-
ガウスノイズの場合beta = 2 -ラプラシアン(インパルス)ノイズの場合beta = 1

4

1 に答える 1

2

私はこれを試しましたが、うまくいきました。ランダムしきい値をこれまでで最もランダムな数値である0.1([0 1]からの有効な選択)に設定したことに注意してください。pvalは、受け入れられるためにprobよりも大きくなければなりません。

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

ランダムなしきい値が1に近い場合、これは勝つための難しい宝くじのように見えます。pvalに出てくる可能性のある数字に注意してください。

無限ループではありません。宝くじに数回当選するまで、MATLABに乱数を選択するように要求しているだけです。ボゴソートのビットのようです

于 2009-12-14T20:16:22.673 に答える