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是内置于计算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此生成器应返回等于具有平均值mi和标准偏差的正态高斯分布的值alfa^2/2

编辑 好的,Doug 为我指出了正确的方向。我们需要创建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 选择随机数,直到您多次中奖!看起来有点像Bogosort

于 2009-12-14T20:16:22.673 回答