In [29]:
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE OverloadedStrings #-}
import Data.Bits.Lens (bits)
import Data.Bits (Bits)
import Data.Complex (Complex((:+)), realPart, imagPart)
import Control.Lens.Combinators (toListOf)
import Control.Lens ((.~),(&))
import Data.Word (Word8)
import Graphics.Plotly qualified as PT
import WGL.IHaskell qualified as WGL
am2 ::(Foldable t, Bits a, Num a) => (Double,Double) -> t a -> [Double]
am2 (loAmp,hiAmp) dataBits = let bools = foldMap (toListOf bits) dataBits in map (\b -> if b then hiAmp else loAmp) bools
ampModTest1 = am2 (0.5, 1.5) [1,2,3 :: Word8]
amp2IQ = map (:+ 0)
amIQ1 = amp2IQ ampModTest1
iqToSig carrierFreq rate iqs =
let c = 2*pi*carrierFreq/rate
is = [realPart iq * cos (c*t) | (t,iq) <- zip [0..] iqs]
qs = [imagPart iq * sin (c*t) | (t,iq) <- zip [0..] iqs]
in zipWith (+) is qs
iqMod width carrierFreq rate iqs = iqToSig carrierFreq rate $ foldMap (replicate width) iqs
signal1 = iqMod
300 -- number of samples to hold each symbol
1e5 -- carrier frequency
15e6 -- sample rate
amIQ1 -- IQ symbols
simpleLinePlot xs ys = let points = zip xs ys in PT.plotly "simple" [PT.line (PT.aes & PT.x .~ fst & PT.y .~ snd) points]
simplerLinePlot = simpleLinePlot [0..]
sig1Plot = simplerLinePlot signal1
WGL.displayPlotly sig1Plot
In [ ]:
import Data.Word (Word8)
import WGL.Word (Word5, Word3)
data EightTen = EightTenData Word8 | EightTenControl EightTenControl
data EightTenControl
encodeEightTen rd et