【发布时间】:2009-12-14 19:56:59
【问题描述】:
我需要在 Matlab 中创建广义高斯噪声发生器。
GGN 是一个随机信号v,分布如下:
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 函数中的,用于计算 Gamma function 的值。
我试图通过以下方式创建生成器:
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* 标准非常好),然后检查概率条件。
为每个概率检查(在 while 循环中)绘制一个新的 prob 值也很重要。
所以问题是解决了
请注意,此生成器允许您生成:
- beta = 2 的高斯噪声
- beta = 1 的拉普拉斯(脉冲)噪声
【问题讨论】:
-
您传递给
GN的哪些值会导致它无限循环? -
如果这有帮助,请接受答案。谢谢!道格
标签: matlab gaussian noise-generator