/** * Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT * All rights reserved. Use is subject to license terms. See LICENSE.TXT */ package org.diirt.datasource.sim; import java.time.Instant; import java.util.Random; import org.diirt.util.array.ArrayDouble; import org.diirt.vtype.VDoubleArray; import org.diirt.vtype.ValueFactory; import static org.diirt.vtype.ValueFactory.*; /** * Function to simulate a waveform containing a uniformly distributed * random data. * * @author carcassi */ public class NoiseWaveform extends SimFunction<VDoubleArray> { private Random rand = new Random(); private double min; private double max; private int nSamples; private double range; private VDoubleArray lastValue; /** * Creates a waveform with samples from a uniform distribution from -5 to 5, * updating every second. */ public NoiseWaveform() { this(-5.0, 5.0, 1.0); } /** * Creates a gaussian waveform signal with a gaussian distribution, updating at the rate * specified. * * @param min the minimum value * @param max the maximum value * @param interval time between samples in seconds */ public NoiseWaveform(Double min, Double max, Double interval) { this(min, max, 100.0, interval); } /** * Creates a gaussian waveform signal with a gaussian distribution, updating at the rate * specified. * * @param min the minimum value * @param max the maximum value * @param nSamples number of elements in the waveform * @param interval time between samples in seconds */ public NoiseWaveform(Double min, Double max, Double nSamples, Double interval) { super(interval, VDoubleArray.class); this.min = min; this.max = max; range = this.max - this.min; this.nSamples = nSamples.intValue(); if (this.nSamples <= 0) { throw new IllegalArgumentException("Number of sample must be a positive integer."); } } private double[] generateNewValue() { double[] newArray = new double[nSamples]; for (int i = 0; i < newArray.length; i++) { newArray[i] = min + rand.nextDouble() * (max - min); } return newArray; } @Override VDoubleArray nextValue() { if (lastTime == null) lastTime = Instant.now(); return ValueFactory.newVDoubleArray(new ArrayDouble(generateNewValue()), alarmNone(), newTime(lastTime), newDisplay(min, min + range * 0.1, min + range * 0.2, "x", Constants.DOUBLE_FORMAT, min + range * 0.8, min + range * 0.9, max, min, max)); } }