From fc9bbd32629aeadda016e8cec2dcceda9d7d953a Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Wed, 26 Mar 2025 14:04:38 +0100 Subject: [PATCH] try to add a simple rc lpf --- lib/filters.c | 12 ++++++++++++ lib/filters.h | 5 ++++- src/fm95.c | 6 ++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/filters.c b/lib/filters.c index f8fe011..0fe9aab 100644 --- a/lib/filters.c +++ b/lib/filters.c @@ -12,4 +12,16 @@ float apply_preemphasis(ResistorCapacitor *filter, float sample) { float hard_clip(float sample, float threshold) { return fmaxf(-threshold, fminf(threshold, sample)); +} + +void init_rc_lpf(ResistorCapacitor *filter, float cutoff, float sample_rate) { + filter->prev_sample = 0.0f; + float dt = 1.0f/sample_rate; + float rc = 1.0f/(cutoff*M_2PI); + filter->alpha = dt/(rc+dt); +} +float apply_rc_lpf(ResistorCapacitor *filter, float sample) { + float out = filter->prev_sample+(filter->alpha*(sample-filter->prev_sample)); + filter->prev_sample = sample; + return out; } \ No newline at end of file diff --git a/lib/filters.h b/lib/filters.h index ea4aa78..bd51e47 100644 --- a/lib/filters.h +++ b/lib/filters.h @@ -16,4 +16,7 @@ typedef struct void init_preemphasis(ResistorCapacitor *filter, float tau, float sample_rate); float apply_preemphasis(ResistorCapacitor *filter, float sample); -float hard_clip(float sample, float threshold); \ No newline at end of file +float hard_clip(float sample, float threshold); + +void init_rc_lpf(ResistorCapacitor *filter, float cutoff, float sample_rate); +float apply_rc_lpf(ResistorCapacitor *filter, float sample); \ No newline at end of file diff --git a/src/fm95.c b/src/fm95.c index 3693b92..476260a 100644 --- a/src/fm95.c +++ b/src/fm95.c @@ -414,6 +414,10 @@ int main(int argc, char **argv) { ResistorCapacitor preemp_l, preemp_r; init_preemphasis(&preemp_l, preemphasis_tau, sample_rate); init_preemphasis(&preemp_r, preemphasis_tau, sample_rate); + + ResistorCapacitor lpf_l, lpf_r; + init_rc_lpf(&lpf_l, 15000, sample_rate); + init_rc_lpf(&lpf_r, 15000, sample_rate); // #endregion signal(SIGINT, stop); @@ -471,6 +475,8 @@ int main(int argc, char **argv) { float ready_l = apply_preemphasis(&preemp_l, l_in)*2; float ready_r = apply_preemphasis(&preemp_r, r_in)*2; + ready_l = apply_rc_lpf(&lpf_l, ready_l); + ready_r = apply_rc_lpf(&lpf_r, ready_r); ready_l = hard_clip(ready_l*audio_volume, clipper_threshold); ready_r = hard_clip(ready_r*audio_volume, clipper_threshold);