From 3b1941038e512389cff5036ae4fb4d591ac28e79 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Thu, 27 Mar 2025 18:53:49 +0100 Subject: [PATCH] some lpf changes --- lib/filters.c | 20 ++++++++++---------- lib/filters.h | 20 ++++++++++---------- src/fm95.c | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/filters.c b/lib/filters.c index 9dc0a32..e09a107 100644 --- a/lib/filters.c +++ b/lib/filters.c @@ -15,13 +15,13 @@ float hard_clip(float sample, float threshold) { return fmaxf(-threshold, fminf(threshold, sample)); } -void init_lpf(FIR *filter, float cutoff, int sample_rate) { +void init_lpf(LPFFilter *filter, float cutoff, int sample_rate) { float a = tanf(M_PI*cutoff/sample_rate); float a2 = a*a; float r, e; - for(int i = 0; i < FIR_ORDER; i++) { - r = sinf(M_PI*(2.0f*i+1.0f)/(4.0f*FIR_ORDER)); + for(int i = 0; i < LPF_ORDER; i++) { + r = sinf(M_PI*(2.0f*i+1.0f)/(4.0f*LPF_ORDER)); e = a2+2.0f*a*r+1.0f; filter->A[i] = a2 / e; filter->d1[i] = 2.0f*(1.0f-a2)/e; @@ -29,13 +29,13 @@ void init_lpf(FIR *filter, float cutoff, int sample_rate) { } } -float process_lpf(FIR *filter, float x) { - float output; - for(int i = 0; i < FIR_ORDER; i++) { - filter->w0[i] = filter->d1[i]*filter->w1[i] + filter->d2[i]*filter->w2[i] + x; - output = filter->A[i] * (filter->w0[i] + 2.0f * filter->w1[i] + filter->w2[i]); +float process_lpf(LPFFilter *filter, float x) { + float y = x; + for(int i = 0; i < LPF_ORDER; i++) { + filter->w0[i] = filter->d1[i] * filter->w1[i] + filter->d2[i] * filter->w2[i] + y; + y = filter->A[i] * (filter->w0[i] + 2.0f * filter->w1[i] + filter->w2[i]); filter->w2[i] = filter->w1[i]; filter->w1[i] = filter->w0[i]; - } - return output; + } + return y; } \ No newline at end of file diff --git a/lib/filters.h b/lib/filters.h index 228b645..6712be8 100644 --- a/lib/filters.h +++ b/lib/filters.h @@ -5,7 +5,7 @@ #include "constants.h" #include "oscillator.h" -#define FIR_ORDER 5 +#define LPF_ORDER 5 typedef struct { @@ -21,12 +21,12 @@ float hard_clip(float sample, float threshold); typedef struct { - float A[FIR_ORDER]; - float d1[FIR_ORDER]; - float d2[FIR_ORDER]; - float w0[FIR_ORDER]; - float w1[FIR_ORDER]; - float w2[FIR_ORDER]; -} FIR; -void init_lpf(FIR *filter, float cutoff, int sample_rate); -float process_lpf(FIR *filter, float x); \ No newline at end of file + float A[LPF_ORDER]; + float d1[LPF_ORDER]; + float d2[LPF_ORDER]; + float w0[LPF_ORDER]; + float w1[LPF_ORDER]; + float w2[LPF_ORDER]; +} LPFFilter; +void init_lpf(LPFFilter *filter, float cutoff, int sample_rate); +float process_lpf(LPFFilter *filter, float x); \ No newline at end of file diff --git a/src/fm95.c b/src/fm95.c index 00c4512..c5db697 100644 --- a/src/fm95.c +++ b/src/fm95.c @@ -414,7 +414,7 @@ int main(int argc, char **argv) { init_preemphasis(&preemp_l, preemphasis_tau, sample_rate); init_preemphasis(&preemp_r, preemphasis_tau, sample_rate); - FIR lpf_l, lpf_r; + LPFFilter lpf_l, lpf_r; init_lpf(&lpf_l, 15000, sample_rate); init_lpf(&lpf_r, 15000, sample_rate);