diff --git a/dsp/delay.c b/dsp/delay.c new file mode 100644 index 0000000..ee7e54e --- /dev/null +++ b/dsp/delay.c @@ -0,0 +1,21 @@ +#include "delay.h" + +void init_delay_line(delay_line_t *delay_line, uint32_t sample_rate) { + delay_line->buffer = malloc(sample_rate * sizeof(float)); + memset(delay_line->buffer, 0, sample_rate * sizeof(float)); +} + +void set_delay_line(delay_line_t *delay_line, uint32_t new_delay) { + delay_line->delay = new_delay; +} + +float delay_line(delay_line_t *delay_line, float in) { + delay_line->buffer[delay_line->idx++] = in; + if (delay_line->idx >= delay_line->delay) delay_line->idx = 0; + return delay_line->buffer[delay_line->idx]; +} + +void exit_delay_line(delay_line_t *delay_line) { + if(delay_line->buffer != NULL) free(delay_line->buffer); + delay_line->buffer = NULL; +} \ No newline at end of file diff --git a/dsp/delay.h b/dsp/delay.h new file mode 100644 index 0000000..9a95336 --- /dev/null +++ b/dsp/delay.h @@ -0,0 +1,12 @@ +#include + +typedef struct delay_line_t { + float *buffer; + uint32_t delay; + uint32_t idx; +} delay_line_t; + +void init_delay_line(delay_line_t *delay_line, uint32_t sample_rate); +void set_delay_line(delay_line_t *delay_line, uint32_t new_delay); +float delay_line(delay_line_t *delay_line, float in); +void exit_delay_line(delay_line_t *delay_line); diff --git a/modulation/stereo_encoder.c b/modulation/stereo_encoder.c index 6289ad6..f7a80a9 100644 --- a/modulation/stereo_encoder.c +++ b/modulation/stereo_encoder.c @@ -1,45 +1,23 @@ #include "stereo_encoder.h" -#ifdef STEREO_SSB -static void init_delay_line(struct delay_line_t *delay_line, uint32_t sample_rate) { - delay_line->buffer = malloc(sample_rate * sizeof(float)); - memset(delay_line->buffer, 0, sample_rate * sizeof(float)); -} - -static void set_delay_line(struct delay_line_t *delay_line, uint32_t new_delay) { - delay_line->delay = new_delay; -} - -static inline float delay_line(struct delay_line_t *delay_line, float in) { - delay_line->buffer[delay_line->idx++] = in; - if (delay_line->idx >= delay_line->delay) delay_line->idx = 0; - return delay_line->buffer[delay_line->idx]; -} - -static void exit_delay_line(struct delay_line_t *delay_line) { - free(delay_line->buffer); -} -#endif - // Multiplier is the multiplier to get to 19 khz void init_stereo_encoder(StereoEncoder* st, uint8_t multiplier, Oscillator* osc, float audio_volume, float pilot_volume) { st->multiplier = multiplier; st->osc = osc; st->pilot_volume = pilot_volume; st->audio_volume = audio_volume; -#ifdef STEREO_SSB - init_delay_line(&st->delay, STEREO_SSB*2+1); -#endif + #ifdef STEREO_SSB + init_delay_line(&st->delay, osc->sample_rate); + set_delay_line(&st->delay, STEREO_SSB*2+1); + #endif } -#ifdef STEREO_SSB float stereo_encode(StereoEncoder* st, uint8_t enabled, float left, float right, firhilbf *hilbert) { -#else -float stereo_encode(StereoEncoder* st, uint8_t enabled, float left, float right) { -#endif float mid = (left+right) * 0.5f; if(!enabled) return mid * st->audio_volume; + #ifdef STEREO_SSB mid = delay_line(&st->delay, mid); + #endif float half_audio = st->audio_volume * 0.5f; @@ -60,4 +38,8 @@ float stereo_encode(StereoEncoder* st, uint8_t enabled, float left, float right) #else return (mid*half_audio) + (signalx1*st->pilot_volume) + ((side*signalx2) * half_audio); #endif +} + +void exit_stereo_encoder(StereoEncoder* st) { + exit_delay_line(&st->delay); } \ No newline at end of file diff --git a/modulation/stereo_encoder.h b/modulation/stereo_encoder.h index 83e1916..5cb6449 100644 --- a/modulation/stereo_encoder.h +++ b/modulation/stereo_encoder.h @@ -4,17 +4,9 @@ #include #include "../dsp/oscillator.h" -#ifdef STEREO_SSB #include #include -#include - -typedef struct delay_line_t { - float *buffer; - uint32_t delay; - uint32_t idx; -} delay_line_t; -#endif +#include "../dsp/delay.h" typedef struct { @@ -22,15 +14,9 @@ typedef struct Oscillator* osc; float audio_volume; float pilot_volume; -#ifdef STEREO_SSB struct delay_line_t delay; -#endif } StereoEncoder; void init_stereo_encoder(StereoEncoder *st, uint8_t multiplier, Oscillator *osc, float audio_volume, float pilot_volume); - -#ifdef STEREO_SSB float stereo_encode(StereoEncoder* st, uint8_t enabled, float left, float right, firhilbf *hilbert); -#else -float stereo_encode(StereoEncoder* st, uint8_t enabled, float left, float right); -#endif +void exit_stereo_encoder(StereoEncoder* st); \ No newline at end of file diff --git a/src/fm95.c b/src/fm95.c index 145e689..eb1a8ae 100644 --- a/src/fm95.c +++ b/src/fm95.c @@ -145,7 +145,7 @@ void cleanup_runtime(FM95_Runtime* runtime, const FM95_Config config) { } #ifdef STEREO_SSB firhilbf_destroy(runtime->stereo_hilbert); - free(runtime->stencode.delay.buffer); + exit_stereo_encoder(runtime->stencode); #endif } diff --git a/ssb.png b/ssb.png new file mode 100644 index 0000000..b50884b Binary files /dev/null and b/ssb.png differ