|
|
|
@@ -3,13 +3,11 @@ package recorder |
|
|
|
import ( |
|
|
|
"errors" |
|
|
|
"log" |
|
|
|
"math" |
|
|
|
"path/filepath" |
|
|
|
|
|
|
|
"sdr-visual-suite/internal/classifier" |
|
|
|
"sdr-visual-suite/internal/demod" |
|
|
|
"sdr-visual-suite/internal/detector" |
|
|
|
"sdr-visual-suite/internal/dsp" |
|
|
|
) |
|
|
|
|
|
|
|
func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, files map[string]any) error { |
|
|
|
@@ -44,20 +42,7 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f |
|
|
|
} else { |
|
|
|
log.Printf("gpudemod: CPU demod fallback used for event %d (%s)", ev.ID, name) |
|
|
|
} |
|
|
|
shifted := dsp.FreqShift(iq, m.sampleRate, offset) |
|
|
|
cutoff := bw / 2 |
|
|
|
if cutoff < 200 { |
|
|
|
cutoff = 200 |
|
|
|
} |
|
|
|
taps := dsp.LowpassFIR(cutoff, m.sampleRate, 101) |
|
|
|
filtered := dsp.ApplyFIR(shifted, taps) |
|
|
|
decim := int(math.Round(float64(m.sampleRate) / float64(d.OutputSampleRate()))) |
|
|
|
if decim < 1 { |
|
|
|
decim = 1 |
|
|
|
} |
|
|
|
dec := dsp.Decimate(filtered, decim) |
|
|
|
inputRate = m.sampleRate / decim |
|
|
|
audio = d.Demod(dec, inputRate) |
|
|
|
audio, inputRate = demodAudioCPU(d, iq, m.sampleRate, offset, bw) |
|
|
|
} |
|
|
|
wav := filepath.Join(dir, "audio.wav") |
|
|
|
if err := writeWAV(wav, audio, inputRate, d.Channels()); err != nil { |
|
|
|
|