From 3ac9d67e3de246807ee07d99b08f99efe5219994 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Tue, 21 Jan 2025 14:32:50 +0100 Subject: [PATCH] turn lpf and emphasis into a common rc --- .vscode/.server-controller-port.log | 2 +- .vscode/settings.json | 4 +++- lib/filters.c | 24 +++++++++++------------- lib/filters.h | 15 +++++---------- src/crosby_stereo_coder.c | 6 +++--- src/mono_passthrough.c | 4 ++-- src/options.h | 2 +- src/polar_stereo_coder.c | 6 +++--- src/sca_mod.c | 4 ++-- src/ssb_stereo_coder.c | 6 +++--- src/stereo_coder.c | 6 +++--- src/stereo_sca_mod.c | 6 +++--- 12 files changed, 40 insertions(+), 45 deletions(-) diff --git a/.vscode/.server-controller-port.log b/.vscode/.server-controller-port.log index 659530e..8602904 100644 --- a/.vscode/.server-controller-port.log +++ b/.vscode/.server-controller-port.log @@ -1,5 +1,5 @@ { "port": 13452, - "time": 1735989625302, + "time": 1737462229390, "version": "0.0.3" } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index ccce945..dec1312 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,8 @@ "stdlib.h": "c", "error.h": "c", "math.h": "c", - "options.h": "c" + "options.h": "c", + "random": "c", + "__locale": "c" } } \ No newline at end of file diff --git a/lib/filters.c b/lib/filters.c index 3483052..c891ad3 100644 --- a/lib/filters.c +++ b/lib/filters.c @@ -1,25 +1,23 @@ #include "filters.h" -void init_emphasis(Emphasis *pe, float tau, float sample_rate) { - pe->prev_sample = 0.0f; - pe->alpha = exp(-1 / (tau * sample_rate)); +void init_rc(ResistorCapacitor *rc, float tau, float sample_rate) { + rc->prev_sample = 0.0f; + rc->alpha = exp(-1 / (tau * sample_rate)); } -float apply_pre_emphasis(Emphasis *pe, float sample) { - float audio = sample-pe->alpha*pe->prev_sample; - pe->prev_sample = audio; +float apply_pre_emphasis(ResistorCapacitor *rc, float sample) { + float audio = sample-rc->alpha*rc->prev_sample; + rc->prev_sample = audio; return audio*2; } -void init_low_pass_filter(LowPassFilter *lp, float cutoff_frequency, float sample_rate) { - float rc = 1/(M_2PI*cutoff_frequency); - lp->alpha = sample_rate/(sample_rate+rc); - lp->prev_sample = 0.0f; +void init_low_pass_filter(ResistorCapacitor *rc, float cutoff_frequency, float sample_rate) { + init_rc(&rc, (-1 / (sample_rate * log(sample_rate/(sample_rate+(1/(M_2PI*cutoff_frequency)))))), sample_rate); } -float apply_low_pass_filter(LowPassFilter *lp, float sample) { - float output = lp->alpha*sample+(1-lp->alpha)*lp->prev_sample; - lp->prev_sample = output; +float apply_low_pass_filter(ResistorCapacitor *rc, float sample) { + float output = rc->alpha*sample+(1-rc->alpha)*rc->prev_sample; + rc->prev_sample = output; return output; } diff --git a/lib/filters.h b/lib/filters.h index 6fac127..d67f0f6 100644 --- a/lib/filters.h +++ b/lib/filters.h @@ -11,18 +11,13 @@ typedef struct { float alpha; float prev_sample; -} Emphasis; +} ResistorCapacitor; -void init_emphasis(Emphasis *pe, float tau, float sample_rate); -float apply_pre_emphasis(Emphasis *pe, float sample); +void init_rc(ResistorCapacitor *pe, float tau, float sample_rate); +float apply_pre_emphasis(ResistorCapacitor *pe, float sample); -typedef struct { - float alpha; - float prev_sample; -} LowPassFilter; - -void init_low_pass_filter(LowPassFilter *lp, float cutoff_frequency, float sample_rate); -float apply_low_pass_filter(LowPassFilter *lp, float sample); +void init_low_pass_filter(ResistorCapacitor *lp, float cutoff_frequency, float sample_rate); +float apply_low_pass_filter(ResistorCapacitor *lp, float sample); typedef struct { diff --git a/src/crosby_stereo_coder.c b/src/crosby_stereo_coder.c index 9f9db77..45309ea 100644 --- a/src/crosby_stereo_coder.c +++ b/src/crosby_stereo_coder.c @@ -122,9 +122,9 @@ int main() { Oscillator osc; init_oscillator(&osc, 50000.0, SAMPLE_RATE); #ifdef PREEMPHASIS - Emphasis preemp_l, preemp_r; - init_emphasis(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); - init_emphasis(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); + ResistorCapacitor preemp_l, preemp_r; + init_rc(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); + init_rc(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); #endif #ifdef LPF LowPassFilter lpf_l, lpf_r; diff --git a/src/mono_passthrough.c b/src/mono_passthrough.c index 9172ef7..eacc83a 100644 --- a/src/mono_passthrough.c +++ b/src/mono_passthrough.c @@ -104,8 +104,8 @@ int main() { } #ifdef PREEMPHASIS - Emphasis preemp; - init_emphasis(&preemp, PREEMPHASIS_TAU, SAMPLE_RATE); + ResistorCapacitor preemp; + init_rc(&preemp, PREEMPHASIS_TAU, SAMPLE_RATE); #endif #ifdef LPF LowPassFilter lpf; diff --git a/src/options.h b/src/options.h index 365a9d6..9bc2866 100644 --- a/src/options.h +++ b/src/options.h @@ -1,4 +1,4 @@ -// #define PREEMPHASIS +#define PREEMPHASIS // #define LPF #define buffer_maxlength 12288 diff --git a/src/polar_stereo_coder.c b/src/polar_stereo_coder.c index bebf66f..f54ddbc 100644 --- a/src/polar_stereo_coder.c +++ b/src/polar_stereo_coder.c @@ -121,9 +121,9 @@ int main() { Oscillator stereo_osc; init_oscillator(&stereo_osc, 31250.0, SAMPLE_RATE); #ifdef PREEMPHASIS - Emphasis preemp_l, preemp_r; - init_emphasis(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); - init_emphasis(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); + ResistorCapacitor preemp_l, preemp_r; + init_rc(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); + init_rc(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); #endif #ifdef LPF LowPassFilter lpf_l, lpf_r; diff --git a/src/sca_mod.c b/src/sca_mod.c index 915f234..f491a69 100644 --- a/src/sca_mod.c +++ b/src/sca_mod.c @@ -112,8 +112,8 @@ int main() { FMModulator mod; init_fm_modulator(&mod, FREQUENCY, DEVIATION, SAMPLE_RATE); #ifdef PREEMPHASIS - Emphasis preemp; - init_emphasis(&preemp, PREEMPHASIS_TAU, SAMPLE_RATE); + ResistorCapacitor preemp; + init_rc(&preemp, PREEMPHASIS_TAU, SAMPLE_RATE); #endif #ifdef LPF LowPassFilter lpf; diff --git a/src/ssb_stereo_coder.c b/src/ssb_stereo_coder.c index fab2c08..dedfa1a 100644 --- a/src/ssb_stereo_coder.c +++ b/src/ssb_stereo_coder.c @@ -128,9 +128,9 @@ int main() { DelayLine monoDelay; init_delay_line(&monoDelay, 99); #ifdef PREEMPHASIS - Emphasis preemp_l, preemp_r; - init_emphasis(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); - init_emphasis(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); + ResistorCapacitor preemp_l, preemp_r; + init_rc(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); + init_rc(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); #endif #ifdef LPF LowPassFilter lpf_l, lpf_r; diff --git a/src/stereo_coder.c b/src/stereo_coder.c index 1c397f6..0d9320e 100644 --- a/src/stereo_coder.c +++ b/src/stereo_coder.c @@ -122,9 +122,9 @@ int main() { Oscillator pilot_osc; init_oscillator(&pilot_osc, 19000.0, SAMPLE_RATE); // Pilot, it's there to indicate stereo and as a refrence signal with the stereo carrier #ifdef PREEMPHASIS - Emphasis preemp_l, preemp_r; - init_emphasis(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); - init_emphasis(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); + ResistorCapacitor preemp_l, preemp_r; + init_rc(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); + init_rc(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); #endif #ifdef LPF LowPassFilter lpf_l, lpf_r; diff --git a/src/stereo_sca_mod.c b/src/stereo_sca_mod.c index 5b5899d..568c25c 100644 --- a/src/stereo_sca_mod.c +++ b/src/stereo_sca_mod.c @@ -124,9 +124,9 @@ int main() { init_fm_modulator(&mod_mono, 67000, 6000, SAMPLE_RATE); init_fm_modulator(&mod_stereo, 80000, 6000, SAMPLE_RATE); #ifdef PREEMPHASIS - Emphasis preemp_l, preemp_r; - init_emphasis(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); - init_emphasis(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); + ResistorCapacitor preemp_l, preemp_r; + init_rc(&preemp_l, PREEMPHASIS_TAU, SAMPLE_RATE); + init_rc(&preemp_r, PREEMPHASIS_TAU, SAMPLE_RATE); #endif #ifdef LPF LowPassFilter lpf_l, lpf_r;