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