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:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
10
src/fm95.c
10
src/fm95.c
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user