///|
pub fn fft_convolve(
  signal : ArrayView[Double],
  kernel : ArrayView[Double],
) -> Array[Double] raise SpectrumError {
  if signal.length() == 0 || kernel.length() == 0 {
    raise EmptySignal
  }
  let output_length = signal.length() + kernel.length() - 1
  let fft_length = next_power_of_two(output_length)
  let left = Array::make(fft_length, Complex::zero())
  let right = Array::make(fft_length, Complex::zero())
  for i in 0..