mirror of
https://github.com/radio95-rnt/fm95.git
synced 2026-07-31 16:59:16 +02:00
idk
This commit is contained in:
+19
-21
@@ -15,34 +15,32 @@ float hard_clip(float sample, float threshold) {
|
||||
return fmaxf(-threshold, fminf(threshold, sample));
|
||||
}
|
||||
|
||||
void init_lpf(Biquad* filter, float sample_rate, float cutoff_freq) {
|
||||
void init_lpf(Biquad* filter, float sample_rate, float cutoff_freq, float Q) {
|
||||
float omega = 2.0f * M_PI * cutoff_freq / sample_rate;
|
||||
float alpha = sinf(omega) / (2.0f * 0.707f);
|
||||
float alpha = sinf(omega) / (2.0f * Q);
|
||||
float cos_omega = cosf(omega);
|
||||
|
||||
float norm = 1.0f / (1.0f + alpha);
|
||||
filter->b0 = (1.0f - cos_omega) * 0.5f * norm;
|
||||
filter->b1 = (1.0f - cos_omega) * norm;
|
||||
filter->b2 = filter->b0;
|
||||
filter->a1 = -2.0f * cos_omega * norm;
|
||||
filter->a2 = (1.0f - alpha) * norm;
|
||||
float norm = 1.0f / (1.0f + alpha);
|
||||
filter->b0 = (1.0f - cos_omega) * 0.5f * norm;
|
||||
filter->b1 = (1.0f - cos_omega) * norm;
|
||||
filter->b2 = filter->b0;
|
||||
filter->a1 = -2.0f * cos_omega * norm;
|
||||
filter->a2 = (1.0f - alpha) * norm;
|
||||
|
||||
filter->x1 = filter->x2 = 0.0f;
|
||||
filter->y1 = filter->y2 = 0.0f;
|
||||
}
|
||||
|
||||
float biquad(Biquad *filter, float input) {
|
||||
float output = filter->b0 * input
|
||||
+ filter->b1 * filter->x1
|
||||
+ filter->b2 * filter->x2
|
||||
- filter->a1 * filter->y1
|
||||
- filter->a2 * filter->y2;
|
||||
|
||||
filter->x2 = filter->x1;
|
||||
filter->x1 = input;
|
||||
|
||||
filter->y2 = filter->y1;
|
||||
filter->y1 = output;
|
||||
|
||||
void init_lpf4(LPF4* filter, float sample_rate, float cutoff_freq) {
|
||||
float Q1 = 1.0f / (2.0f * cosf(M_PI / 8.0f));
|
||||
init_lpf(&filter->section1, sample_rate, cutoff_freq, Q1);
|
||||
|
||||
float Q2 = 1.0f / (2.0f * cosf(3.0f * M_PI / 8.0f));
|
||||
init_lpf(&filter->section2, sample_rate, cutoff_freq, Q2);
|
||||
}
|
||||
|
||||
float apply_lpf4(LPF4* filter, float input) {
|
||||
float output = biquad(&filter->section1, input);
|
||||
output = biquad(&filter->section2, output);
|
||||
return output;
|
||||
}
|
||||
Reference in New Issue
Block a user