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:
|
||||
|
||||
- Pre-Emphasis
|
||||
- Low Pass Filtering
|
||||
- Stereo
|
||||
- Polar Stereo
|
||||
- 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 -= (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);
|
||||
}
|
||||
@@ -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);
|
||||
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;
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user