如何在Java中生成高斯噪声?

5

我希望找到一个高斯噪声生成器,它需要接受两个参数:平均值和方差,并生成高斯噪声。

在搜索过程中,我发现许多这样的生成器都是为图像设计的。然而,我需要一个通用的生成器。我希望能够实现以下功能:

myGaussianNoiseGenerator = new GaussianNoiseGenerator(mean, variance);
mySignalWithNoise = mySignal + myGaussianNoiseGenerator.generate();

我该如何做到这一点?

@ElliottFrisch,没有必要重载+。 信号可以很好地表示为数字数组。 - svz
4个回答

13

Random.nextGaussian()的输出值去规范化以满足您的需求应该很简单:

java.util.Random r = new java.util.Random();
double noise = r.nextGaussian() * Math.sqrt(variance) + mean;

方差的平方根?还是仅仅是方差? - user2881553
2
平方根 - 这里大多数答案实际上想要将输出乘以标准差,而标准差是方差的平方根。 - pobrelkey

0
你可以尝试这样做: 首先创建一个名为GaussianNoiseGenerator的新类。
    public class GaussianNoiseGenerator {

         public final int mean;
         public final int variance;

         public GaussianNoiseGenerator(int mean, int variance) {
          this.mean = mean;
          this.variance = variance;

//do the math here, and return result
int result = this.mean * this.variance;
//I am not sure of the math, just an example for you

return result;
         }
}

然后你可以通过以下方式使用它:

GaussianNoiseGenerator myGaussianNoiseGenerator = new GaussianNoiseGenerator(56115, 455445);

1
我认为OP在询问数学方面的问题。 - svz
哦,我没有很好地理解他 x.x - Ahmed Ekri

0
噪声可能应该有一个平均值为0,因此类似以下的内容应该有效:
import java.util.Random;
...
Random rand = new Random();
mySignalWithNoise = mySignal + rand.nextGaussian()*noiseStandardDeviation;

-1
如果你所说的“信号”只是指双精度浮点数,那么答案就是:
Random rnd = new Random();
double signal = (rnd.nextGaussian() - mean) / Math.sqrt(variance);

Random 是标准类。

证明

如果你在这里将 sigma 和 mu 放在 x 的平方下面分组

指数前的因子是无关紧要的,因为分布可以被重新归一化。

enter image description here


方差还是标准差? - user2881553
1
这看起来不对。nextGaussian 从 N(0,1) 生成数字,所以实际上应该是这样的:signal = rnd.nextGaussian() * stdDev + mean,其中 stdDev = Math.sqrt(variance)。如果我错了,请纠正我。 - Christian Brüggemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接