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