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 #ifndef MLN_FUN_N2V_WHITE_GAUSSIAN_HH
00027 # define MLN_FUN_N2V_WHITE_GAUSSIAN_HH
00028
00032
00033 # include <cstdlib>
00034 # include <ctime>
00035
00036 # include <mln/core/concept/function.hh>
00037 # include <mln/math/sqrt.hh>
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace fun
00044 {
00045
00046 namespace n2v
00047 {
00048
00055 template <typename V>
00056 struct white_gaussian : Function_n2v< white_gaussian<V> >
00057 {
00058 typedef V result;
00059
00060 white_gaussian(double sigma_);
00061 V operator()() const;
00062
00063 double sigma;
00064 };
00065
00066
00067 # ifndef MLN_INCLUDE_ONLY
00068
00069
00070 template <typename V>
00071 white_gaussian<V>::white_gaussian(double sigma_)
00072 : sigma(sigma_)
00073 {
00074 srand(time(0));
00075 }
00076
00077
00078 template <typename V>
00079 V white_gaussian<V>::operator()() const
00080 {
00081 double X = 0;
00082 for (int i = 1; i < 50; ++i)
00083 {
00084 double U = rand() / (float)RAND_MAX;
00085 X = X + U;
00086 }
00087
00088 X = X - 25.f;
00089 X = X * math::sqrt(12 / 50.f);
00090
00091 return sigma * X;
00092 };
00093
00094
00095 # endif // ! MLN_INCLUDE_ONLY
00096
00097 }
00098
00099 }
00100
00101 }
00102
00103
00104 #endif // ! MLN_FUN_N2V_WHITE_GAUSSIAN_HH