module Synthesizer.Plain.Filter.Recursive.Test where
import qualified Synthesizer.Plain.Oscillator as Osci
import qualified Synthesizer.Plain.Filter.Recursive.SecondOrder as Filt2
import qualified Synthesizer.Plain.Filter.Recursive.Butterworth as Butter
import qualified Synthesizer.Plain.Filter.Recursive.Chebyshev as Cheby
import Number.Complex((+:))
import qualified Algebra.Ring as Ring
import PreludeBase
import NumericPrelude
sampleRate :: Ring.C a => a
sampleRate = 22050
chirp :: Double -> [Double]
chirp len = Osci.freqModSine 0 (iterate (+0.5/len) 0)
filter2ndOrderTest :: [Double]
filter2ndOrderTest =
take 10
(Filt2.run
(repeat (Filt2.Parameter 1 0 0 0 (1::Double)))
(1 : repeat 0))
butterworthLowpassTest0 :: [Double]
butterworthLowpassTest0 =
take 30 (Butter.lowpass 2 0.2 (repeat (0.1::Double)) (repeat 1))
butterworthLowpassTest1 :: Double
butterworthLowpassTest1 =
maximum (take 300 (drop 500
(Butter.lowpass 6 0.1 (repeat (0.05::Double))
(map sin (iterate (+2*pi*0.05) 0)))))
butterworthLowpassTest2 :: [Double]
butterworthLowpassTest2 =
let len = 1*sampleRate
in take (round len) (Butter.lowpass 20 0.1 (repeat (0.1::Double)) (chirp len))
chebyshevALowpassTest0 :: Filt2.Parameter Double
chebyshevALowpassTest0 =
let beta = (asinh 1) / 4
in Cheby.parameterA 1 (12/13 * cosh beta +: (5/13 * sinh beta)) 0.1
chebyshevBLowpassTest0 :: Filt2.Parameter Double
chebyshevBLowpassTest0 =
let beta = (asinh 1) / 4
in Cheby.parameterB (12/13) (12/13 * cosh beta +: (5/13 * sinh beta)) 0.1
chebyshevLowpassTest1 :: [Double]
chebyshevLowpassTest1 =
let len = 1*sampleRate
in take (round len) (Filt2.run (repeat chebyshevALowpassTest0) (chirp len))
chebyshevLowpassTest2 :: [Double]
chebyshevLowpassTest2 =
let len = 1*sampleRate
in take (round len) (Cheby.lowpassA 10 0.25 (repeat (0.1::Double)) (chirp len))