code: def dft(blk, freqs, normalize=True):
    
    dft_data = (sum(xn * cexp(-1j * n * f) for n, xn in enumerate(blk))
                                           for f in freqs)
    if normalize:
      lblk = len(blk)
      return [v / lblk for v in dft_data]
    return list(dft_data)
docs: Complex non-optimized Discrete Fourier Transform
  
    Finds the DFT for values in a given frequency list, in order, over the data
    block seen as periodic.
  
    Parameters
    ----------
    blk :
      An iterable with well-defined length. Don't use this function with Stream
      objects!
    freqs :
      List of frequencies to find the DFT, in rad/sample. FFT implementations
      like numpy.fft.ftt finds the coefficients for N frequencies equally
      spaced as ``line(N, 0, 2 * pi, finish=False)`` for N frequencies.
    normalize :
      If True (default), the coefficient sums are divided by ``len(blk)``,
      and the coefficient for the DC level (frequency equals to zero) is the
      mean of the block. If False, that coefficient would be the sum of the
      data in the block.
  
    Returns
    -------
    A list of DFT values for each frequency, in the same order that they appear
    in the freqs input.
  
    Note
    ----
    This isn't a FFT implementation, and performs :math:`O(M . N)` float
    pointing operations, with :math:`M` and :math:`N` equals to the length of
    the inputs. This function can find the DFT for any specific frequency, with
    no need for zero padding or finding all frequencies in a linearly spaced
    band grid with N frequency bins at once.