code: def _project(reference_sources, C):
      
      # shapes: ensure that input is 3d (comprising the source index)
      if len(reference_sources.shape) == 2:
          reference_sources = reference_sources[None, ...]
          C = C[None, ...]
  
      (nsrc, nsampl, nchan) = reference_sources.shape
      filters_len = C.shape[-2]
  
      # zero pad
      reference_sources = _zeropad(reference_sources, filters_len - 1, axis=1)
      sproj = np.zeros((nchan, nsampl + filters_len - 1))
  
      for (j, cj, c) in itertools.product(
          list(range(nsrc)), list(range(nchan)), list(range(nchan))
      ):
          sproj[c] += fftconvolve(
              C[j, cj, :, c],
              reference_sources[j, :, cj]
          )[:nsampl + filters_len - 1]
      return sproj.T
docs: Project images using pre-computed filters C
      reference_sources are nsrc X nsampl X nchan
      C is nsrc X nchan X filters_len X nchan