我需要在 Matlab 中创建广义高斯噪声发生器。
v
GGN 是如下分布的随机信号:
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