0
1
mirror of https://github.com/radio95-rnt/fm95.git synced 2026-02-26 19:23:51 +01:00

maybe the darc will come

This commit is contained in:
2025-05-01 12:52:37 +02:00
parent 1d3171991e
commit 6c4aedc2c8
4 changed files with 31 additions and 6 deletions

View File

@@ -3,6 +3,7 @@
FM95 is a audio processor for FM, it does: FM95 is a audio processor for FM, it does:
- Pre-Emphasis - Pre-Emphasis
- Low Pass Filtering
- Stereo - Stereo
- Polar Stereo - Polar Stereo
- SCA - SCA

View File

@@ -12,4 +12,20 @@ float modulate_fm(FMModulator *fm, float sample) {
fm->osc_phase += (M_2PI * inst_freq) / fm->sample_rate; fm->osc_phase += (M_2PI * inst_freq) / fm->sample_rate;
fm->osc_phase -= (fm->osc_phase >= M_2PI) ? M_2PI : 0.0f; fm->osc_phase -= (fm->osc_phase >= M_2PI) ? M_2PI : 0.0f;
return sinf(fm->osc_phase); 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);
} }

View File

@@ -11,4 +11,12 @@ typedef struct
} FMModulator; } FMModulator;
void init_fm_modulator(FMModulator *fm, float frequency, float deviation, float sample_rate); void init_fm_modulator(FMModulator *fm, float frequency, float deviation, float sample_rate);
float modulate_fm(FMModulator *fm, float sample); 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);

View File

@@ -450,23 +450,22 @@ int main(int argc, char **argv) {
float mono = (ready_l + ready_r) / 2.0f; float mono = (ready_l + ready_r) / 2.0f;
audio = mono*MONO_VOLUME; audio = mono*MONO_VOLUME;
float stereo_carrier = 0.0f;
if(stereo) { if(stereo) {
float stereo = (ready_l - ready_r) / 2.0f; 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; if(polar_stereo) audio += ((stereo+0.2)*stereo_carrier)*STEREO_VOLUME;
else { 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; mpx += pilot*PILOT_VOLUME;
audio += (stereo*stereo_carrier)*STEREO_VOLUME; audio += (stereo*stereo_carrier)*STEREO_VOLUME;
} }
} }
if(rds_on && polar_stereo == 0) { 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; mpx += (current_rds_in*rds_carrier)*RDS_VOLUME;
if(!sca_on) { 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; 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_l);
iirfilt_rrrf_destroy(lpf_r); iirfilt_rrrf_destroy(lpf_r);
iirfilt_rrrf_destroy(mpx_lpf); iirfilt_rrrf_destroy(mpx_lpf);
free_PulseInputDevice(&input_device); free_PulseInputDevice(&input_device);
if(mpx_on) free_PulseInputDevice(&mpx_device); if(mpx_on) free_PulseInputDevice(&mpx_device);
if(rds_on) free_PulseInputDevice(&rds_device); if(rds_on) free_PulseInputDevice(&rds_device);