package stereo import ( "github.com/jan/fm-rds-tx/internal/audio" "github.com/jan/fm-rds-tx/internal/dsp" ) // Components holds the individual MPX components produced by the stereo encoder. type Components struct { Mono float64 // L+R baseband Stereo float64 // L-R baseband on suppressed carrier Pilot float64 // 19 kHz pilot tone } // StereoEncoder generates stereo MPX primitives from stereo audio frames. type StereoEncoder struct { pilot dsp.PilotGenerator LevelStereo float64 } // NewStereoEncoder creates a StereoEncoder configured for the provided sample rate. func NewStereoEncoder(sampleRate float64) StereoEncoder { return StereoEncoder{ pilot: dsp.NewPilotGenerator(sampleRate, 0.1), LevelStereo: 0.75, } } // Encode converts a stereo frame into MPX components. func (s *StereoEncoder) Encode(frame audio.Frame) Components { return Components{ Mono: float64(frame.Mono()), Stereo: float64(frame.Difference()) * s.LevelStereo, Pilot: s.pilot.Sample(), } } // Reset restarts the pilot generator phase. func (s *StereoEncoder) Reset() { s.pilot.Reset() }