///|
pub(all) struct Complex {
  re : Double
  im : Double
} derive(Debug, Eq, ToJson)

///|
pub(all) enum WindowKind {
  Rectangular
  Hann
  Hamming
  Blackman
} derive(Debug, Eq, ToJson)

///|
pub(all) struct Peak {
  index : Int
  frequency : Double
  magnitude : Double
} derive(Debug, Eq, ToJson)

///|
pub(all) struct SignalStats {
  count : Int
  mean : Double
  variance : Double
  stddev : Double
  rms : Double
  minimum : Double
  maximum : Double
  peak_to_peak : Double
} derive(Debug, Eq, ToJson)

///|
pub(all) struct SignalPeak {
  index : Int
  value : Double
} derive(Debug, Eq, ToJson)

///|
pub(all) struct WelchResult {
  frequencies : Array[Double]
  psd : Array[Double]
} derive(Debug, Eq, ToJson)

///|
pub(all) struct SpectralSummary {
  centroid : Double
  bandwidth : Double
  flatness : Double
  entropy : Double
  rolloff : Double
} derive(Debug, Eq, ToJson)

///|
pub(all) struct FrequencyResponse {
  frequencies : Array[Double]
  magnitude : Array[Double]
} derive(Debug, Eq, ToJson)

///|
pub(all) struct SpectrogramResult {
  frequencies : Array[Double]
  frame_times : Array[Double]
  magnitudes : Array[Array[Double]]
} derive(Debug, Eq, ToJson)

///|
pub(all) suberror SpectrumError {
  EmptySignal
  LengthMismatch
  NonPowerOfTwo(length~ : Int)
  InvalidArgument(message~ : String)
} derive(Debug, Eq, ToJson)