Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define SAMPLE_RATE 44100
- #define PI 3.14159
- double* low_pass_filter(double* data_ptr, uint32_t data_length, double cutoff_frequency, double resonance) {
- assert(data_ptr != NULL);
- assert(cutoff_frequency > 0 && cutoff_frequency < sample_rate / 2)
- assert(resonance < sqrt(2) && resonance > 0.1);
- double c = 1 / tan(PI * cutoff_frequency / SAMPLE_RATE);
- double a1 = 1 / (1 + resonance * c + c * c);
- double a2 = 2 * a1;
- double b1 = 2 * (1 - c * c) * a1;
- double b2 = (1 - resonance * c + c * c) * a1;
- double output[data_length];
- for(uint32_t i = 0; i < (data_length - 2); i++) {
- double in = *data_ptr;
- double in1 = 0.0;
- double in2 = 0.0;
- double out1 = 0.0;
- double out2 = 0.0;
- if(i > 0) {
- in1 = *(data_ptr - 1);
- out1 = output[i - 1];
- if(i > 1) {
- in2 = (data_ptr - 2);
- out2 = output[i - 2];
- }
- }
- output[i] = a1 * in + a2 * in1 + a3 * in2 - b1 * out1 - b2 * out2;
- }
- return output;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement