packages feed

classify-frog-0.2.3: src/SignalProcessingMethods.hs

module SignalProcessingMethods where

import qualified SpectralDistribution as SD
import qualified Signal
import qualified Rate
import SignalProcessing (lowpassTwoPass, )
import Parameters (Freq(Freq), )

import qualified Sound.SoxLib as SoxLib
import qualified Data.StorableVector.Lazy as SVL


type Triple a = (a,a,a)

data T =
   Cons {
      dehum :: Signal.Sox -> Signal.Sampled Float,
      rumble :: Signal.Sox -> Signal.Sampled Float,
      downSampleAbs ::
         SoxLib.Rate -> Signal.Sampled Float -> SVL.Vector Float,
      bandpassDownSample ::
         Rate.Feature -> Freq -> Signal.Sox -> SVL.Vector Float,
      bandParameters ::
         Triple Freq -> Signal.Sampled Float ->
         [Int] -> [((Float, Float), SD.T Float)]
   }

envelopeLowRate ::
   (Rate.C rate) =>
   T -> rate -> Signal.Sampled Float ->
   (SVL.Vector Float, SVL.Vector Float)
envelopeLowRate methods featRate sig =
   let env = downSampleAbs methods (Rate.unpack featRate) sig
       volume = lowpassTwoPass featRate (Freq 20) env
   in  (volume, SVL.zipWith (/) env volume)

dehummedEnvelopeLowRate ::
   (Rate.C rate) =>
   T -> rate -> Signal.Sox -> (SVL.Vector Float, SVL.Vector Float)
dehummedEnvelopeLowRate methods featRate sig =
   let env = downSampleAbs methods (Rate.unpack featRate) $ dehum methods sig
       volume = lowpassTwoPass featRate (Freq 20) env
   in  (volume, SVL.zipWith (/) env volume)