package gpudemod import ( "log" "sdr-wideband-suite/internal/dsp" ) func (r *BatchRunner) ResetSignalState(signalID int64) { if r == nil || r.streamState == nil { return } delete(r.streamState, signalID) r.resetNativeStreamingState(signalID) } func (r *BatchRunner) ResetAllSignalStates() { if r == nil { return } r.streamState = make(map[int64]*ExtractStreamState) r.resetAllNativeStreamingStates() } func (r *BatchRunner) getOrInitExtractState(job StreamingExtractJob, sampleRate int) (*ExtractStreamState, error) { if r == nil { return nil, ErrUnavailable } if r.streamState == nil { r.streamState = make(map[int64]*ExtractStreamState) } decim, err := ExactIntegerDecimation(sampleRate, job.OutRate) if err != nil { return nil, err } state := r.streamState[job.SignalID] if state == nil { state = &ExtractStreamState{SignalID: job.SignalID} r.streamState[job.SignalID] = state } if state.ConfigHash != job.ConfigHash { if state.Initialized { log.Printf("STREAMING STATE RESET: signal=%d oldHash=%d newHash=%d historyLen=%d", job.SignalID, state.ConfigHash, job.ConfigHash, len(state.ShiftedHistory)) } ResetExtractStreamState(state, job.ConfigHash) } state.Decim = decim state.NumTaps = job.NumTaps if state.NumTaps <= 0 { state.NumTaps = 101 } cutoff := job.Bandwidth / 2 if cutoff < 200 { cutoff = 200 } base := dsp.LowpassFIR(cutoff, sampleRate, state.NumTaps) state.BaseTaps = make([]float32, len(base)) for i, v := range base { state.BaseTaps[i] = float32(v) } state.PolyphaseTaps = BuildPolyphaseTapsPhaseMajor(state.BaseTaps, state.Decim) if cap(state.ShiftedHistory) < maxInt(0, state.NumTaps-1) { state.ShiftedHistory = make([]complex64, 0, maxInt(0, state.NumTaps-1)) } else if state.ShiftedHistory == nil { state.ShiftedHistory = make([]complex64, 0, maxInt(0, state.NumTaps-1)) } state.Initialized = true return state, nil }