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