code: def SVD_sim(sp, lowcut, highcut, samp_rate,
              amp_range=np.arange(-10, 10, 0.01)):
      
      # Convert SP to samples
      sp = int(sp * samp_rate)
      # Scan through a range of amplitude ratios
      synthetics = [Stream(Trace(seis_sim(sp, a))) for a in amp_range]
      for st in synthetics:
          for tr in st:
              tr.stats.station = 'SYNTH'
              tr.stats.channel = 'SH1'
              tr.stats.sampling_rate = samp_rate
              tr.filter('bandpass', freqmin=lowcut, freqmax=highcut)
      # We have a list of obspy Trace objects, we can pass this to EQcorrscan's
      # SVD functions
      U, s, V, stachans = clustering.svd(synthetics)
      return U, s, V, stachans
docs: Generate basis vectors of a set of simulated seismograms.
  
      Inputs should have a range of S-P amplitude ratios, in theory to simulate \
      a range of focal mechanisms.
  
      :type sp: int
      :param sp: S-P time in seconds - will be converted to samples according \
          to samp_rate.
      :type lowcut: float
      :param lowcut: Low-cut for bandpass filter in Hz
      :type highcut: float
      :param highcut: High-cut for bandpass filter in Hz
      :type samp_rate: float
      :param samp_rate: Sampling rate in Hz
      :type amp_range: numpy.ndarray
      :param amp_range: Amplitude ratio range to generate synthetics for.
  
      :returns: set of output basis vectors
      :rtype: :class:`numpy.ndarray`