|
- package gpudemod
-
- import (
- "math"
- )
-
- type OracleHarnessConfig struct {
- SignalID int64
- ConfigHash uint64
- NCOPhase float64
- Decim int
- NumTaps int
- PhaseInc float64
- }
-
- func MakeDeterministicIQ(n int) []complex64 {
- out := make([]complex64, n)
- for i := 0; i < n; i++ {
- a := 0.017 * float64(i)
- b := 0.031 * float64(i)
- out[i] = complex64(complex(math.Cos(a)+0.2*math.Cos(b), math.Sin(a)+0.15*math.Sin(b)))
- }
- return out
- }
-
- func MakeToneIQ(n int, phaseInc float64) []complex64 {
- out := make([]complex64, n)
- phase := 0.0
- for i := 0; i < n; i++ {
- out[i] = complex64(complex(math.Cos(phase), math.Sin(phase)))
- phase += phaseInc
- }
- return out
- }
-
- func MakeLowpassTaps(n int) []float32 {
- out := make([]float32, n)
- for i := range out {
- out[i] = 1.0 / float32(n)
- }
- return out
- }
-
- func MakeCPUOracleState(cfg OracleHarnessConfig) *CPUOracleState {
- taps := MakeLowpassTaps(cfg.NumTaps)
- return &CPUOracleState{
- SignalID: cfg.SignalID,
- ConfigHash: cfg.ConfigHash,
- NCOPhase: cfg.NCOPhase,
- Decim: cfg.Decim,
- PhaseCount: 0,
- NumTaps: cfg.NumTaps,
- ShiftedHistory: make([]complex64, 0, maxInt(0, cfg.NumTaps-1)),
- BaseTaps: taps,
- PolyphaseTaps: BuildPolyphaseTapsPhaseMajor(taps, cfg.Decim),
- }
- }
-
- func RunChunkedCPUOraclePolyphase(all []complex64, chunkSizes []int, mkState func() *CPUOracleState, phaseInc float64) []complex64 {
- state := mkState()
- out := make([]complex64, 0)
- pos := 0
- for _, n := range chunkSizes {
- if pos >= len(all) {
- break
- }
- end := pos + n
- if end > len(all) {
- end = len(all)
- }
- out = append(out, CPUOracleExtractPolyphase(all[pos:end], state, phaseInc)...)
- pos = end
- }
- if pos < len(all) {
- out = append(out, CPUOracleExtractPolyphase(all[pos:], state, phaseInc)...)
- }
- return out
- }
|