#< # Noise # # Usage # Noise out gauss=0 mean=0. var=0.333 seed=123456 rep=0 # # INPUT PARAMETERS # gauss - integer [0] produces a gaussian distribution if non-zero # and a uniform distribution if zero # mean - integer [0] mean of the random number distribution # var - real variance of distribution defaults to 1/3 for uniform # distribution this creates numbers between -1 and +1 # for mean=0 variance of distribution defaults to 1 # for a gaussian distribution. # seed - integer integer to start random number generator # default=number of seconds from the first of the year # rep - integer replace samples of trace by random noise # default=0 (add random noise) # if !=0 the traces are replaced with random noise # # DESCRIPTION # Add random noise # # COMMENTS # The default operation of this routine is to add random numbers uniformly # distributed between -1.0 and +1.0 using a seed taken from the time. # # Samples: For uniformly distributed numbers between -0.2 and 0.2, use # var=0.0667, or 0.2 * 1/3. # # For uniformly distributed numbers between 0 and 1, use mean=0.5 # and var=0.1667, or 0.5 * 1/3. # # CATEGORY # Seis:Filter # # COMPILE LEVEL # DISTR #> #% # Author - Ray Abma # # ---------- # Keyword: add gaussian noise random variance # ---------- # # integer n1,n2,n3,esize integer gauss,seed,rep,seedin real mean,var,varin integer ftime # fetch dimensions & esize from either: integer n1,n2,n3=1,esize=4 # fetch parameters from par: integer gauss=0 from par: real mean=0. from par: real var=0. from par: integer rep=0 if( getch('var','f',varin) > 0) { var = varin } else { if ( gauss == 0) { var = 1.0/3.0 } else { var = 1.0 } } if( getch('seed','i',seedin) > 0) { seed = seedin } else { seed = 1997 } # if (seed <= 0) seed = 1 call putch('seed','i',seed) call hclose(); allocate: real databuf(n1) subroutine Noise( n1,n2,n3,esize,databuf, gauss,mean,var,seed,rep) integer n1,n2,n3,itr,i,esize integer gauss,seed,rep real mean,var real rnd real databuf(n1) call rseed(seed) do itr=1,n2*n3{ # loop over traces call sreed( 'in', databuf, n1*esize ) # read trace if ( rep != 0 ) { do i=1,n1 { databuf(i) =0. } } # zero trace do i=1,n1 { if (gauss .eq. 0) { call randm(rnd) rnd = (2 * rnd - 1.0) * 3.0 } else { call grand(rnd) } rnd = var * rnd + mean databuf(i) = databuf(i) + rnd } call srite('out', databuf, n1*esize) #write trace } return; end