noisegenerator.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __NOISEGENERATOR_H
00025 #define __NOISEGENERATOR_H
00026
00027 #include <stdlib.h>
00028 #include <time.h>
00029 #include <cmath>
00030 #include <assert.h>
00031
00032 #include "randomgenerator.h"
00033
00034
00035
00036
00037 class NoiseGenerator{
00038 public:
00039 NoiseGenerator()
00040 {
00041 dimension = 0;
00042 randGen = 0;
00043 ownRandGen = false;
00044 };
00045
00046 virtual ~NoiseGenerator()
00047 {
00048 if (this->ownRandGen && this->randGen)
00049 {
00050 delete this->randGen;
00051 this->randGen = 0;
00052 this->ownRandGen = false;
00053 }
00054 }
00055
00056
00057
00058
00059
00060
00061 virtual void init(unsigned int dimension, RandGen* randGen=0)
00062 {
00063 this->dimension = dimension;
00064 if(randGen)
00065 this->randGen=randGen;
00066
00067 else {
00068 this->randGen=new RandGen();
00069 this->randGen->init(rand());
00070 this->ownRandGen=true;
00071 }
00072 };
00073
00074
00075
00076
00077
00078 virtual double generate() = 0;
00079
00080
00081
00082
00083
00084
00085 virtual void add(double *value, double noiseStrength){
00086 for (unsigned int i = 0; i < dimension; i++){
00087 value[i]+=generate()*noiseStrength;
00088 }
00089 }
00090
00091 protected:
00092
00093 double uniform(double min=-0.1, double max=0.1){
00094 assert(randGen);
00095 return( randGen->rand()*(max-min)+min);
00096 }
00097
00098 double uniform01(){
00099 assert(randGen);
00100 return randGen->rand();
00101 }
00102 unsigned int dimension;
00103 RandGen* randGen;
00104 bool ownRandGen;
00105 };
00106
00107
00108 class NoNoise : public NoiseGenerator{
00109 public:
00110 NoNoise() {}
00111 virtual ~NoNoise(){}
00112 virtual double generate() {
00113 return 0;
00114 };
00115 };
00116
00117
00118
00119 class WhiteUniformNoise : public NoiseGenerator{
00120 public:
00121 WhiteUniformNoise() {}
00122 virtual ~WhiteUniformNoise(){}
00123 virtual double generate() {
00124 return uniform(-1,1);
00125 };
00126
00127 };
00128
00129
00130
00131 class WhiteNormalNoise : public NoiseGenerator{
00132 public:
00133 WhiteNormalNoise(){}
00134 virtual ~WhiteNormalNoise(){}
00135 virtual double generate() {
00136 double x1=uniform01();
00137 double x2=uniform01();
00138 return( (sqrt(-2*log(x1)) *cos(2*M_PI*x2)));
00139 };
00140
00141
00142
00143
00144
00145
00146
00147 };
00148
00149
00150 class ColorUniformNoise : public NoiseGenerator{
00151 public:
00152
00153
00154
00155 ColorUniformNoise(double tau=0.05)
00156 : tau(tau){
00157 sqrttau = sqrt(tau);
00158 mean1channel=0.0;
00159 mean=0;
00160 }
00161 virtual ~ColorUniformNoise(){ if(mean) free(mean);}
00162 virtual void init(unsigned int dimension, RandGen* randGen=0){
00163 NoiseGenerator::init(dimension, randGen);
00164 mean = (double*)malloc(sizeof(double) * dimension);
00165 for (unsigned int i=0; i<dimension; i++){
00166 mean[i]=0.0;
00167 }
00168 }
00169
00170 virtual double generate() {
00171 mean1channel+= sqrttau * uniform(-1, +1) - tau * mean1channel;
00172 return(mean1channel);
00173 }
00174
00175
00176
00177
00178
00179
00180 virtual void add(double *value, double noiseStrength){
00181 for (unsigned int i = 0; i < dimension; i++){
00182 mean[i]+= sqrttau * uniform(-1, +1)*noiseStrength - tau * mean[i];
00183 value[i]+=mean[i];
00184 }
00185 }
00186
00187 virtual double getTau(){ return tau;}
00188 virtual void setTau(double newTau){
00189 if(newTau >=0 && newTau <= 1){
00190 tau=newTau;
00191 sqrttau = sqrt(tau);
00192 }
00193 }
00194
00195 protected:
00196 double tau;
00197 double sqrttau;
00198 double* mean;
00199 double mean1channel;
00200 };
00201
00202
00203 class ColorNormalNoise : public WhiteNormalNoise{
00204 public:
00205 ColorNormalNoise(double tau=0.05)
00206 : tau(tau){
00207 sqrttau = sqrt(tau);
00208 mean = 0;
00209 mean1channel=0.0;
00210 }
00211
00212 virtual ~ColorNormalNoise(){if(mean) free(mean);}
00213
00214 virtual void init(unsigned int dimension, RandGen* randGen=0){
00215 WhiteNormalNoise::init(dimension, randGen);
00216 mean = (double*)malloc(sizeof(double) * dimension);
00217 for (unsigned int i=0; i<dimension; i++){
00218 mean[i]=0.0;
00219 }
00220 }
00221
00222 virtual double generate() {
00223 mean1channel += sqrttau * WhiteNormalNoise::generate() - tau*mean1channel;
00224 return(mean1channel);
00225 }
00226
00227 virtual void add(double *value, double noiseStrength) {
00228 for (unsigned int i = 0; i < dimension; i++){
00229 mean[i]+=sqrttau * WhiteNormalNoise::generate()*noiseStrength - tau*mean[i];
00230 value[i]+=mean[i];
00231 }
00232 }
00233
00234 virtual double getTau(){ return tau;}
00235 virtual void setTau(double newTau){
00236 if(newTau >=0 && newTau <= 1){
00237 tau=newTau;
00238 sqrttau = sqrt(tau);
00239 }
00240 }
00241
00242 protected:
00243 double tau;
00244 double sqrttau;
00245 double* mean;
00246 double mean1channel;
00247 double factor;
00248 };
00249
00250
00251 class SineWhiteNoise : public NoiseGenerator{
00252 public:
00253
00254
00255
00256
00257
00258 SineWhiteNoise(double omega, double amplitude, double phaseShift = M_PI/2,
00259 unsigned int channels = 0xFFFF)
00260 : omega(omega), amplitude(amplitude)
00261 , channels(channels), phaseShift(phaseShift){
00262 t=0;
00263 }
00264
00265 virtual ~SineWhiteNoise(){}
00266
00267 virtual double generate() {
00268 t ++;
00269 return (1-amplitude)*uniform(-1, 1) + sin(t*omega)*amplitude;
00270 }
00271
00272
00273
00274
00275 virtual void add(double *value, double noiseStrength) {
00276
00277 for (unsigned int i = 0; i < dimension; i++){
00278 if(i < channels){
00279 value[i]+=sin(t*omega+i*phaseShift)*amplitude*noiseStrength;
00280 value[i]+=(1-amplitude)*uniform(-1, 1)*noiseStrength;
00281 }else{
00282 value[i]+=uniform(-1, 1)*noiseStrength;
00283 }
00284 }
00285 t ++;
00286 }
00287 void setOmega(double omega){
00288 this->omega=omega;
00289 }
00290 void setPhaseShift(double phaseShift){
00291 this->phaseShift=phaseShift;
00292 }
00293
00294 protected:
00295 long int t;
00296 double omega;
00297 double amplitude;
00298 unsigned int channels;
00299 double phaseShift;
00300
00301 };
00302
00303
00304 #endif
00305