0
1
mirror of https://github.com/radio95-rnt/fm95.git synced 2026-02-26 19:23:51 +01:00
Files
fm95/lib/filters.c
2024-12-31 16:10:21 +01:00

41 lines
1.5 KiB
C

#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));
}
float apply_pre_emphasis(Emphasis *pe, float sample) {
float audio = sample-pe->alpha*pe->prev_sample;
pe->prev_sample = audio;
return audio*2;
}
void init_low_pass_filter(LowPassFilter *lp, float cutoff_frequency, float sample_rate) {
for (int i = 0; i < FIR_TAPS; i++) {
for (int j = 0; j < FIR_PHASES; j++) {
int mi = i * FIR_PHASES + j + 1;
float sincpos = mi - (((FIR_TAPS * FIR_PHASES) + 1.0f) / 2.0f);
float firlowpass = (sincpos == 0.0f) ? 1.0f : sinf(M_2PI * cutoff_frequency * sincpos / sample_rate) / (PI * sincpos);
float window = 0.54f - 0.46f * cosf(M_2PI * mi / (FIR_TAPS * FIR_PHASES)); // Hamming window
lp->low_pass_fir[j][i] = firlowpass * window;
}
}
memset(lp->sample_buffer, 0, sizeof(lp->sample_buffer));
lp->buffer_index = 0;
}
float apply_low_pass_filter(LowPassFilter *lp, float sample) {
// Update the sample buffer
lp->sample_buffer[lp->buffer_index] = sample;
lp->buffer_index = (lp->buffer_index + 1) % FIR_TAPS;
// Apply the filter
float result = 0.0f;
int index = lp->buffer_index;
for (int i = 0; i < FIR_TAPS; i++) {
result += lp->low_pass_fir[0][i] * lp->sample_buffer[index];
index = (index + 1) % FIR_TAPS;
}
return result*6;
}