module DSP.Source.Oscillator (nco, ncom,
quadrature_nco, complex_ncom,
quadrature_ncom,
agc) where
import Data.Complex
nco :: RealFloat a => a
-> a
-> [a]
nco :: forall a. RealFloat a => a -> a -> [a]
nco a
wn a
phi = [a]
y
where a0 :: a
a0 = a
2 forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
cos a
wn
y1 :: [a]
y1 = -(forall a. Floating a => a -> a
sin (a
wn forall a. Num a => a -> a -> a
+ a
phi)) forall a. a -> [a] -> [a]
: [a]
y
y2 :: [a]
y2 = -(forall a. Floating a => a -> a
sin (a
2 forall a. Num a => a -> a -> a
* a
wn forall a. Num a => a -> a -> a
+ a
phi)) forall a. a -> [a] -> [a]
: [a]
y1
y :: [a]
y = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (-) (forall a b. (a -> b) -> [a] -> [b]
map (a
a0 forall a. Num a => a -> a -> a
*) [a]
y1) [a]
y2
ncom :: RealFloat a => a
-> a
-> [a]
-> [a]
ncom :: forall a. RealFloat a => a -> a -> [a] -> [a]
ncom a
wn a
phi [a]
x = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) [a]
x (forall a. RealFloat a => a -> a -> [a]
nco a
wn a
phi)
agc :: RealFloat a => Complex a -> Complex a
agc :: forall a. RealFloat a => Complex a -> Complex a
agc (a
x:+a
y) = a
x forall a. Num a => a -> a -> a
* a
r forall a. a -> a -> Complex a
:+ a
y forall a. Num a => a -> a -> a
* a
r
where r :: a
r = (a
3 forall a. Num a => a -> a -> a
- a
x forall a. Num a => a -> a -> a
* a
x forall a. Num a => a -> a -> a
- a
y forall a. Num a => a -> a -> a
* a
y) forall a. Fractional a => a -> a -> a
/ a
2
quadrature_nco :: RealFloat a => a
-> a
-> [ Complex a ]
quadrature_nco :: forall a. RealFloat a => a -> a -> [Complex a]
quadrature_nco a
wn a
phi = (forall a. Floating a => a -> Complex a
cis a
phi) forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (forall a. Num a => a -> a -> a
(*) (forall a. Floating a => a -> Complex a
cis a
wn)) (forall a. RealFloat a => a -> a -> [Complex a]
quadrature_nco a
wn a
phi)
complex_ncom :: RealFloat a => a
-> a
-> [ Complex a ]
-> [ Complex a ]
complex_ncom :: forall a. RealFloat a => a -> a -> [Complex a] -> [Complex a]
complex_ncom a
_ a
_ [] = []
complex_ncom a
wn a
phi [Complex a]
x = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) (forall a. RealFloat a => a -> a -> [Complex a]
quadrature_nco a
wn a
phi) [Complex a]
x
quadrature_mult :: RealFloat a => Complex a -> Complex a -> a
quadrature_mult :: forall a. RealFloat a => Complex a -> Complex a -> a
quadrature_mult (a
x1:+a
y1) (a
x2:+a
y2) = a
x1 forall a. Num a => a -> a -> a
* a
x2 forall a. Num a => a -> a -> a
+ a
y1 forall a. Num a => a -> a -> a
* a
y2
quadrature_ncom :: RealFloat a => a
-> a
-> [Complex a]
-> [a]
quadrature_ncom :: forall a. RealFloat a => a -> a -> [Complex a] -> [a]
quadrature_ncom a
wn a
phi [Complex a]
x = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. RealFloat a => Complex a -> Complex a -> a
quadrature_mult [Complex a]
x (forall a. RealFloat a => a -> a -> [Complex a]
quadrature_nco a
wn a
phi)