poster
2019-12-10, 16:49
我需要在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函数 (http://en.wikipedia.org/wiki/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值
编辑 OK,Doug向我指出了正确的方向。我们需要创建一个或多或少可能被选择的v值(我假设10 * std很好),然后检查概率条件。
为每个概率检查(在while循环中)绘制一个新的prob值也很重要。
所以问题解决了
请注意,此生成器允许您生成:
-高斯噪声对beta = 2 - Laplasian(脉冲)噪声beta = 1
回答:
我尝试了一下,效果很好。请注意,我将随机阈值设置为有史以来最随机的数0.1(从[0 1]中进行有效选择)。 pval必须大于概率才能被接受。
>> 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 (http://en.wikipedia.org/wiki/Bogosort)
更多&回答... (https://stackoverflow.com/questions/1903104)
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函数 (http://en.wikipedia.org/wiki/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值
编辑 OK,Doug向我指出了正确的方向。我们需要创建一个或多或少可能被选择的v值(我假设10 * std很好),然后检查概率条件。
为每个概率检查(在while循环中)绘制一个新的prob值也很重要。
所以问题解决了
请注意,此生成器允许您生成:
-高斯噪声对beta = 2 - Laplasian(脉冲)噪声beta = 1
回答:
我尝试了一下,效果很好。请注意,我将随机阈值设置为有史以来最随机的数0.1(从[0 1]中进行有效选择)。 pval必须大于概率才能被接受。
>> 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 (http://en.wikipedia.org/wiki/Bogosort)
更多&回答... (https://stackoverflow.com/questions/1903104)