0
1
mirror of https://github.com/radio95-rnt/fm95.git synced 2026-02-26 19:23:51 +01:00

change lpf

This commit is contained in:
2025-03-08 19:41:22 +01:00
parent b1c9e28844
commit 5de87c15a3
4 changed files with 42 additions and 83 deletions

View File

@@ -1,5 +1,5 @@
{ {
"port": 13452, "port": 13452,
"time": 1740903386827, "time": 1741458712922,
"version": "0.0.3" "version": "0.0.3"
} }

View File

@@ -11,92 +11,51 @@ float apply_preemphasis(ResistorCapacitor *filter, float sample) {
} }
void init_lpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate) { void init_lpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate) {
// Calculate intermediate values float cutoffNorm = cutoffFreq / sampleRate;
float omega = 2.0f * M_PI * cutoffFreq / sampleRate; float K = tanf(M_PI * cutoffNorm);
float sn = sinf(omega); float norm = 1.0f/(1.0f+K/qFactor+K*K);
float cs = cosf(omega); filter->a0 = K*K*norm;
float alpha = sn / (2.0f * qFactor); filter->a1 = 2.0f*K*K*norm;
filter->a2 = K*K*norm;
// Calculate coefficients filter->b1 = 2.0f*(K*K-1.0f)*norm;
float b0 = (1.0f - cs) * 0.5f; filter->b2 = (1.0f-K/qFactor+K*K)*norm;
float b1 = 1.0f - cs;
float b2 = (1.0f - cs) * 0.5f; filter->z1 = 0.0f;
float a0 = 1.0f + alpha; filter->z2 = 0.0f;
float a1 = -2.0f * cs;
float a2 = 1.0f - alpha;
// Normalize by a0
filter->b0 = b0 / a0;
filter->b1 = b1 / a0;
filter->b2 = b2 / a0;
filter->a1 = a1 / a0;
filter->a2 = a2 / a0;
// Initialize state variables
filter->x1 = 0.0f;
filter->x2 = 0.0f;
filter->y1 = 0.0f;
filter->y2 = 0.0f;
} }
void init_hpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate) { void init_hpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate) {
float omega = 2.0f * M_PI * cutoffFreq / sampleRate; float cutoffNorm = cutoffFreq / sampleRate;
float alpha = sinf(omega) / (2.0f * qFactor); float K = tanf(M_PI * cutoffNorm);
float cosw = cosf(omega); float norm = 1.0f/(1.0f+K/qFactor+K*K);
filter->a0 = 1.0f*norm;
float b0 = (1.0f + cosw) / 2.0f; filter->a1 = -2.0f*norm;
float b1 = -(1.0f + cosw); filter->a2 = 1.0f*norm;
float b2 = (1.0f + cosw) / 2.0f; filter->b1 = 2.0f*(K*K-1.0f)*norm;
float a0 = 1.0f + alpha; filter->b2 = (1.0f-K/qFactor+K*K)*norm;
float a1 = -2.0f * cosw;
float a2 = 1.0f - alpha; filter->z1 = 0.0f;
filter->z2 = 0.0f;
// Normalize by a0
filter->b0 = b0 / a0;
filter->b1 = b1 / a0;
filter->b2 = b2 / a0;
filter->a1 = a1 / a0;
filter->a2 = a2 / a0;
// Initialize state variables
filter->x1 = 0.0f;
filter->x2 = 0.0f;
filter->y1 = 0.0f;
filter->y2 = 0.0f;
} }
void init_bpf(BiquadFilter* filter, float centerFreq, float qFactor, float sampleRate) { void init_bpf(BiquadFilter* filter, float centerFreq, float qFactor, float sampleRate) {
float omega = 2.0f * M_PI * centerFreq / sampleRate; float cutoffNorm = centerFreq / sampleRate;
float alpha = sinf(omega) / (2.0f * qFactor); float K = tanf(M_PI * cutoffNorm);
float cosw = cosf(omega); float norm = 1.0f/(1.0f+K/qFactor+K*K);
filter->a0 = K/qFactor*norm;
float b0 = alpha; filter->a1 = 0.0f;
float b1 = 0.0f; filter->a2 = -K/qFactor*norm;
float b2 = -alpha; filter->b1 = 2.0f*(K*K-1.0f)*norm;
float a0 = 1.0f + alpha; filter->b2 = (1.0f-K/qFactor+K*K)*norm;
float a1 = -2.0f * cosw;
float a2 = 1.0f - alpha; filter->z1 = 0.0f;
filter->z2 = 0.0f;
// Normalize by a0
filter->b0 = b0 / a0;
filter->b1 = b1 / a0;
filter->b2 = b2 / a0;
filter->a1 = a1 / a0;
filter->a2 = a2 / a0;
// Initialize state variables
filter->x1 = 0.0f;
filter->x2 = 0.0f;
filter->y1 = 0.0f;
filter->y2 = 0.0f;
} }
float apply_frequency_filter(BiquadFilter* filter, float input) { float apply_frequency_filter(BiquadFilter* filter, float input) {
float out = input*filter->b0+filter->x1*filter->b1+filter->x2*filter->b2+filter->y1*filter->a1+filter->y2*filter->a2; float out = input*filter->a0+filter->z1;
filter->y2 = filter->y1; filter->z1 = input*filter->a1+filter->z2-filter->b1*out;
filter->y1 = out; filter->z2 = input*filter->a2-filter->b2*out;
filter->x2 = filter->x1;
filter->x1 = input;
return out; return out;
} }

View File

@@ -15,10 +15,10 @@ void init_preemphasis(ResistorCapacitor *filter, float tau, float sample_rate);
float apply_preemphasis(ResistorCapacitor *filter, float sample); float apply_preemphasis(ResistorCapacitor *filter, float sample);
typedef struct { typedef struct {
float b0, b1, b2; // https://www.earlevel.com/main/2012/11/26/biquad-c-source-code/
float a1, a2; float a0, a1, a2;
float x1, x2; float b0, b1;
float y1, y2; float z1, z2;
} BiquadFilter; } BiquadFilter;
void init_lpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate); void init_lpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate);
void init_hpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate); void init_hpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate);

View File

@@ -42,7 +42,7 @@
#define MPX_VOLUME 1.0f // Passtrough #define MPX_VOLUME 1.0f // Passtrough
#define MPX_CLIPPER_THRESHOLD 1.0f #define MPX_CLIPPER_THRESHOLD 1.0f
#define LPF_CUTOFF 10000 // Should't need to be changed #define LPF_CUTOFF 15000 // Should't need to be changed
volatile sig_atomic_t to_run = 1; volatile sig_atomic_t to_run = 1;