From 78539e7b6a36578ab5a679846d025ec507370d29 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Sat, 29 Mar 2025 20:52:10 +0100 Subject: [PATCH] idk --- lib/bs412.c | 4 ++++ lib/bs412.h | 2 ++ src/fm95.c | 30 +++++++++++++++++------------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/lib/bs412.c b/lib/bs412.c index d38830f..4ed40fa 100644 --- a/lib/bs412.c +++ b/lib/bs412.c @@ -20,4 +20,8 @@ float measure_mpx(MPXPowerMeasurement* mpx, int deviation) { float dbr_to_deviation(float dbr) { return 19000.0f * powf(10.0f, dbr / 10.0f); +} + +float deviation_to_dbr(float dbr) { + return 10*log10f(deviation/19000.0f); } \ No newline at end of file diff --git a/lib/bs412.h b/lib/bs412.h index 2167f55..135a319 100644 --- a/lib/bs412.h +++ b/lib/bs412.h @@ -13,3 +13,5 @@ void init_modulation_power_measure(MPXPowerMeasurement *mpx, int sample_rate); float measure_mpx(MPXPowerMeasurement *mpx, int deviation); float dbr_to_deviation(float dbr); + +float deviation_to_dbr(float dbr); diff --git a/src/fm95.c b/src/fm95.c index 16925e9..1673fe3 100644 --- a/src/fm95.c +++ b/src/fm95.c @@ -437,8 +437,9 @@ int main(int argc, char **argv) { init_preemphasis(&preemp_l, preemphasis_tau, sample_rate); init_preemphasis(&preemp_r, preemphasis_tau, sample_rate); - MPXPowerMeasurement power; + MPXPowerMeasurement power, sound_power; init_modulation_power_measure(&power, sample_rate); + init_modulation_power_measure(&sound_power, sample_rate); signal(SIGINT, stop); signal(SIGTERM, stop); @@ -487,6 +488,9 @@ int main(int argc, char **argv) { } for (int i = 0; i < BUFFER_SIZE; i++) { + float mpx = 0.0f; + float sound = 0.0f; + float l_in = left[i]; float r_in = right[i]; float current_mpx_in = mpx_in[i]; @@ -500,39 +504,39 @@ int main(int argc, char **argv) { ready_r = hard_clip(ready_r*audio_volume, clipper_threshold); float mono = (ready_l + ready_r) / 2.0f; - output[i] = mono*MONO_VOLUME; + sound = 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); if(polar_stereo) { - output[i] += ((stereo+0.2)*stereo_carrier)*STEREO_VOLUME; + sound += ((stereo+0.2)*stereo_carrier)*STEREO_VOLUME; } else { float pilot = get_oscillator_sin_multiplier_ni(&osc, 4); - output[i] += pilot*PILOT_VOLUME + + sound += pilot*PILOT_VOLUME + (stereo*stereo_carrier)*STEREO_VOLUME; } } if(rds_on && polar_stereo == 0) { float rds_carrier = get_oscillator_cos_multiplier_ni(&osc, 12); - output[i] += (current_rds_in*rds_carrier)*RDS_VOLUME; + mpx += (current_rds_in*rds_carrier)*RDS_VOLUME; if(!sca_on) { float rds2_carrier_66 = get_oscillator_cos_multiplier_ni(&osc, 14); - output[i] += (current_rds2_in*rds2_carrier_66)*RDS2_VOLUME; + mpx += (current_rds2_in*rds2_carrier_66)*RDS2_VOLUME; } } - if(mpx_on) output[i] += hard_clip(current_mpx_in, MPX_CLIPPER_THRESHOLD)*MPX_VOLUME; - if(sca_on) output[i] += modulate_fm(&sca_mod, hard_clip(current_sca_in, sca_clipper_threshold))*SCA_VOLUME; + if(mpx_on) mpx += hard_clip(current_mpx_in, MPX_CLIPPER_THRESHOLD)*MPX_VOLUME; + if(sca_on) mpx += modulate_fm(&sca_mod, hard_clip(current_sca_in, sca_clipper_threshold))*SCA_VOLUME; - float mpower = measure_mpx(&power, output[i]*75000); + float mpower = measure_mpx(&power, (sound+mpx)*75000); + float spower = measure_mpx(&sound_power, sound*75000); if(mpower > mpx_power) { - output[i] -= (mono/2); - output[i] -= ((stereo*stereo_carrier)/2); - printf("Overpower! %f\n", mpower); + float sound_attuenation = (dbr_to_deviation(mpower)-dbr_to_deviation(spower))/75000; + sound *= sound_attuenation; } - output[i] *= master_volume; + output[i] = (sound+mpx)*master_volume; if(rds_on || stereo) advance_oscillator(&osc); }