我希望找到一个高斯噪声生成器,它需要接受两个参数:平均值和方差,并生成高斯噪声。
在搜索过程中,我发现许多这样的生成器都是为图像设计的。然而,我需要一个通用的生成器。我希望能够实现以下功能:
myGaussianNoiseGenerator = new GaussianNoiseGenerator(mean, variance);
mySignalWithNoise = mySignal + myGaussianNoiseGenerator.generate();
我该如何做到这一点?
我希望找到一个高斯噪声生成器,它需要接受两个参数:平均值和方差,并生成高斯噪声。
在搜索过程中,我发现许多这样的生成器都是为图像设计的。然而,我需要一个通用的生成器。我希望能够实现以下功能:
myGaussianNoiseGenerator = new GaussianNoiseGenerator(mean, variance);
mySignalWithNoise = mySignal + myGaussianNoiseGenerator.generate();
将Random.nextGaussian()
的输出值去规范化以满足您的需求应该很简单:
java.util.Random r = new java.util.Random();
double noise = r.nextGaussian() * Math.sqrt(variance) + mean;
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);
import java.util.Random;
...
Random rand = new Random();
mySignalWithNoise = mySignal + rand.nextGaussian()*noiseStandardDeviation;
Random rnd = new Random();
double signal = (rnd.nextGaussian() - mean) / Math.sqrt(variance);
Random
是标准类。
证明
如果你在这里将 sigma 和 mu 放在 x 的平方下面分组
指数前的因子是无关紧要的,因为分布可以被重新归一化。
nextGaussian
从 N(0,1) 生成数字,所以实际上应该是这样的:signal = rnd.nextGaussian() * stdDev + mean
,其中 stdDev = Math.sqrt(variance)
。如果我错了,请纠正我。 - Christian Brüggemann
+
。 信号可以很好地表示为数字数组。 - svz