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 #ifndef __NOISEGENERATOR_H
00056 #define __NOISEGENERATOR_H
00057
00058 #include <stdlib.h>
00059 #include <time.h>
00060 #include <math.h>
00061
00062
00063
00064
00065 class NoiseGenerator{
00066 public:
00067 NoiseGenerator() {
00068 dimension=0;
00069 };
00070
00071 virtual ~NoiseGenerator(){}
00072
00073
00074
00075
00076 virtual void init(unsigned int dimension) {
00077 this->dimension = dimension;
00078 };
00079
00080
00081
00082
00083
00084 virtual double generate(double p1, double p2) = 0;
00085
00086
00087
00088
00089
00090
00091
00092
00093 virtual void add(double *value, double p1, double p2){
00094 for (unsigned int i = 0; i < dimension; i++){
00095 value[i]+=generate(p1,p2);
00096 }
00097 }
00098
00099 protected:
00100
00101 double uniform(double min=-0.1, double max=0.1){
00102 return( (double(rand())/RAND_MAX)*(max-min)+min);
00103 }
00104 unsigned int dimension;
00105 };
00106
00107
00108 class WhiteUniformNoise : public NoiseGenerator{
00109 public:
00110 WhiteUniformNoise(){}
00111 virtual ~WhiteUniformNoise(){}
00112 virtual double generate(double min, double max) {
00113 return uniform(min,max);
00114 };
00115 };
00116
00117
00118 class WhiteNormalNoise : public NoiseGenerator{
00119 public:
00120 WhiteNormalNoise(){}
00121 virtual ~WhiteNormalNoise(){}
00122 virtual double generate(double mean, double variance) {
00123 double x1=uniform(0, 1);
00124 double x2=uniform(0, 1);
00125 return( (sqrt(-2*log(x1)) *cos(2*M_PI*x2)) * variance + mean) ;
00126 };
00127 };
00128
00129
00130 class ColorUniformNoise : public NoiseGenerator{
00131 public:
00132
00133
00134
00135 ColorUniformNoise(double tau=0.3)
00136 : tau(tau){
00137 mean1channel=0.0;
00138 mean=0;
00139
00140
00141
00142 factor=sqrt(1/(tau+0.01));
00143 }
00144 virtual ~ColorUniformNoise(){}
00145 virtual void init(unsigned int dimension){
00146 NoiseGenerator::init(dimension);
00147 mean = (double*)malloc(sizeof(double) * dimension);
00148 for (unsigned int i=0; i<dimension; i++){
00149 mean[i]=0.0;
00150 }
00151 }
00152
00153 virtual double generate(double min, double max) {
00154
00155 mean1channel+=tau * (uniform(min*factor, max*factor) - mean1channel);
00156 return(mean1channel);
00157 }
00158 virtual void add(double *value, double min, double max){
00159 for (unsigned int i = 0; i < dimension; i++){
00160 mean[i]+=tau * (uniform(min*factor, max*factor) - mean[i]);
00161 value[i]+=mean[i];
00162 }
00163 }
00164
00165 protected:
00166 double tau;
00167 double* mean;
00168 double mean1channel;
00169 double factor;
00170 };
00171
00172
00173 class ColorNormalNoise : public WhiteNormalNoise{
00174 public:
00175 ColorNormalNoise(double tau=0.3)
00176 : tau(tau){
00177 mean = 0;
00178 mean1channel=0.0;
00179
00180
00181
00182 factor=sqrt(1/(tau+0.01));
00183 }
00184
00185 virtual ~ColorNormalNoise(){}
00186
00187 virtual void init(unsigned int dimension){
00188 WhiteNormalNoise::init(dimension);
00189 mean = (double*)malloc(sizeof(double) * dimension);
00190 for (unsigned int i=0; i<dimension; i++){
00191 mean[i]=0.0;
00192 }
00193 }
00194
00195 virtual double generate(double variance, double meanvalue) {
00196 mean1channel += tau * WhiteNormalNoise::generate(variance*factor, meanvalue) - mean1channel;
00197 return(mean1channel);
00198 }
00199 virtual void add(double *value, double variance, double meanvalue){
00200 for (unsigned int i = 0; i < dimension; i++){
00201 mean[i]+=tau * (WhiteNormalNoise::generate(variance*factor, meanvalue) - mean[i]);
00202 value[i]+=mean[i];
00203 }
00204 }
00205
00206 protected:
00207 double tau;
00208 double* mean;
00209 double mean1channel;
00210 double factor;
00211 };
00212
00213
00214 class SineWhiteNoise : public NoiseGenerator{
00215 public:
00216
00217
00218
00219
00220 SineWhiteNoise(double omega, double amplitude, double phaseShift = M_PI/2,
00221 unsigned int channels = 0xFFFF)
00222 : omega(omega), amplitude(amplitude)
00223 , channels(channels), phaseShift(phaseShift){
00224 t=0;
00225 }
00226
00227 virtual ~SineWhiteNoise(){}
00228
00229 virtual double generate(double min, double max) {
00230 t ++;
00231 return uniform(min, max) + sin(t*omega)*amplitude*(max-min);
00232 }
00233 virtual void add(double *value, double min, double max){
00234
00235 for (unsigned int i = 0; i < dimension; i++){
00236 if(i < channels)
00237 value[i]+=sin(t*omega+i*phaseShift)*amplitude*(max-min);
00238 value[i]+=uniform(min, max);
00239 }
00240 t ++;
00241 }
00242 void setOmega(double omega){
00243 this->omega=omega;
00244 }
00245 void setPhaseShift(double phaseShift){
00246 this->phaseShift=phaseShift;
00247 }
00248
00249 protected:
00250 long int t;
00251 double omega;
00252 double amplitude;
00253 unsigned int channels;
00254 double phaseShift;
00255
00256 };
00257
00258
00259 #endif
00260