Class PinkNoise

java.lang.Object
  extended by PinkNoise

public class PinkNoise
extends java.lang.Object

A class that provides a source of pink noise with a power spectrum density (PSD) proportional to 1/f^alpha. "Regular" pink noise has a PSD proportional to 1/f, i.e. alpha=1. However, many natural systems may require a different PSD proportionality. The value of alpha may be from 0 to 2, inclusive. The special case alpha=0 results in white noise (directly generated random numbers) and alpha=2 results in brown noise (integrated white noise).

The values are computed by applying an IIR filter to generated Gaussian random numbers. The number of poles used in the filter may be specified. For each number of poles there is a limiting frequency below which the PSD becomes constant. Values as low as 1-3 poles produce relatively good results, however these values will be concentrated near zero. Using a larger number of poles will allow more low frequency components to be included, leading to more variation from zero. However, the sequence is stationary, that is, it will always return to zero even with a large number of poles.

The distribution of values is very close to Gaussian with mean zero, but the variance depends on the number of poles used. The algorithm can be made faster by changing the method call rnd.nextGaussian() to rnd.nextDouble()-0.5 in the method nextValue(). The resulting distribution is almost Gaussian, but has a relatively larger amount of large values.

The IIR filter used by this class is presented by N. Jeremy Kasdin, Proceedings of the IEEE, Vol. 83, No. 5, May 1995, p. 822.


Constructor Summary
PinkNoise()
          Generate pink noise with alpha=1.0 using a five-pole IIR.
PinkNoise(double alpha)
          Generate a specific pink noise using a five-pole IIR.
PinkNoise(double alpha, int poles)
          Generate pink noise specifying alpha and the number of poles.
PinkNoise(double alpha, int poles, java.util.Random random)
          Generate pink noise from a specific randomness source specifying alpha and the number of poles.
 
Method Summary
static void main(java.lang.String[] arg)
          A main method to demonstrate the functionality.
 double nextValue()
          Return the next pink noise sample.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

PinkNoise

public PinkNoise()
Generate pink noise with alpha=1.0 using a five-pole IIR.


PinkNoise

public PinkNoise(double alpha)
Generate a specific pink noise using a five-pole IIR.

Parameters:
alpha - the exponent of the pink noise, 1/f^alpha.
Throws:
java.lang.IllegalArgumentException - if alpha < 0 or alpha > 2.

PinkNoise

public PinkNoise(double alpha,
                 int poles)
Generate pink noise specifying alpha and the number of poles. The larger the number of poles, the lower are the lowest frequency components that are amplified.

Parameters:
alpha - the exponent of the pink noise, 1/f^alpha.
poles - the number of poles to use.
Throws:
java.lang.IllegalArgumentException - if alpha < 0 or alpha > 2.

PinkNoise

public PinkNoise(double alpha,
                 int poles,
                 java.util.Random random)
Generate pink noise from a specific randomness source specifying alpha and the number of poles. The larger the number of poles, the lower are the lowest frequency components that are amplified.

Parameters:
alpha - the exponent of the pink noise, 1/f^alpha.
poles - the number of poles to use.
random - the randomness source.
Throws:
java.lang.IllegalArgumentException - if alpha < 0 or alpha > 2.
Method Detail

nextValue

public double nextValue()
Return the next pink noise sample.

Returns:
the next pink noise sample.

main

public static void main(java.lang.String[] arg)
A main method to demonstrate the functionality. The program is used as:
     java PinkNoise samples [alpha [poles]]

     samples  =  number of samples to output
     alpha    =  PSD distribution exponent, 1/f^alpha (default 1.0)
     poles    =  number of IIR poles to use (default 5)