diff --git a/README.md b/README.md index 5bb6e40..515ba25 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ FM95 is a audio processor for FM, it does: - Pre-Emphasis +- Low Pass Filtering - Stereo - Polar Stereo - SCA diff --git a/dsp/fm_modulator.c b/dsp/fm_modulator.c index 5fbb3a7..552145b 100644 --- a/dsp/fm_modulator.c +++ b/dsp/fm_modulator.c @@ -12,4 +12,20 @@ float modulate_fm(FMModulator *fm, float sample) { fm->osc_phase += (M_2PI * inst_freq) / fm->sample_rate; fm->osc_phase -= (fm->osc_phase >= M_2PI) ? M_2PI : 0.0f; return sinf(fm->osc_phase); +} + +void init_refrenced_fm_modulator(RefrencedFMModulator* fm, Oscillator* osc, float deviation) { + fm->deviation = deviation; + fm->osc = osc; +} + +float refrenced_modulate_fm(RefrencedFMModulator* fm, float sample) { + float inst_freq = sample * fm->deviation; + float phase = fm->osc->phase + ((M_2PI * inst_freq) / fm->osc->sample_rate); + + if (phase >= M_2PI) { + phase -= M_2PI; + } + + return sinf(phase); } \ No newline at end of file diff --git a/dsp/fm_modulator.h b/dsp/fm_modulator.h index 2af2b75..a00d893 100644 --- a/dsp/fm_modulator.h +++ b/dsp/fm_modulator.h @@ -11,4 +11,12 @@ typedef struct } FMModulator; void init_fm_modulator(FMModulator *fm, float frequency, float deviation, float sample_rate); -float modulate_fm(FMModulator *fm, float sample); \ No newline at end of file +float modulate_fm(FMModulator *fm, float sample); + +typedef struct +{ + float deviation; + Oscillator* osc; +} RefrencedFMModulator; +void init_refrenced_fm_modulator(RefrencedFMModulator *fm, Oscillator *osc, float deviation); +float refrenced_modulate_fm(RefrencedFMModulator *fm, float sample); diff --git a/src/fm95.c b/src/fm95.c index d54fec1..7852461 100644 --- a/src/fm95.c +++ b/src/fm95.c @@ -450,23 +450,22 @@ int main(int argc, char **argv) { float mono = (ready_l + ready_r) / 2.0f; audio = mono*MONO_VOLUME; - float stereo_carrier = 0.0f; if(stereo) { float stereo = (ready_l - ready_r) / 2.0f; - stereo_carrier = get_oscillator_sin_multiplier_ni(&osc, polar_stereo ? 1 : 8); + float stereo_carrier = get_oscillator_sin_multiplier_ni(&osc, polar_stereo ? 1 : 8); // 31.25 or 38 KHz if(polar_stereo) audio += ((stereo+0.2)*stereo_carrier)*STEREO_VOLUME; else { - float pilot = get_oscillator_sin_multiplier_ni(&osc, 4); + float pilot = get_oscillator_sin_multiplier_ni(&osc, 4); // 19 KHz mpx += pilot*PILOT_VOLUME; audio += (stereo*stereo_carrier)*STEREO_VOLUME; } } if(rds_on && polar_stereo == 0) { - float rds_carrier = get_oscillator_cos_multiplier_ni(&osc, 12); + float rds_carrier = get_oscillator_cos_multiplier_ni(&osc, 12); // 57 KHz mpx += (current_rds_in*rds_carrier)*RDS_VOLUME; if(!sca_on) { - float rds2_carrier_66 = get_oscillator_cos_multiplier_ni(&osc, 14); + float rds2_carrier_66 = get_oscillator_cos_multiplier_ni(&osc, 14); // 66.5 KHz mpx += (current_rds2_in*rds2_carrier_66)*RDS2_VOLUME; } } @@ -502,6 +501,7 @@ int main(int argc, char **argv) { iirfilt_rrrf_destroy(lpf_l); iirfilt_rrrf_destroy(lpf_r); iirfilt_rrrf_destroy(mpx_lpf); + free_PulseInputDevice(&input_device); if(mpx_on) free_PulseInputDevice(&mpx_device); if(rds_on) free_PulseInputDevice(&rds_device);