rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
biquad.cpp
Go to the documentation of this file.
1/*
2 * @file biquad.cpp
3 *
4 * @date Sep 10, 2016
5 * @author Andrey Belomutskiy, (c) 2012-2020
6 */
7
8#include "pch.h"
9
10#include "biquad.h"
11
13// Default to passthru
14 a0 = 1;
15 a1 = a2 = b1 = b2 = 0;
16
17 reset();
18}
19
21 z1 = z2 = 0;
22}
23
24static float getK(float samplingFrequency, float cutoff) {
25 return tanf_taylor(CONST_PI * cutoff / samplingFrequency);
26}
27
28static float getNorm(float K, float Q) {
29 return 1 / (1 + K / Q + K * K);
30}
31
32void Biquad::configureBandpass(float samplingFrequency, float centerFrequency, float Q) {
33 if (samplingFrequency < 2.5f * centerFrequency) {
34 criticalError("Invalid biquad parameters samplingFrequency=%f centerFrequency=%f", samplingFrequency, centerFrequency);
35 return;
36 }
37
38 float K = getK(samplingFrequency, centerFrequency);
39 float norm = getNorm(K, Q);
40
41 a0 = K / Q * norm;
42 a1 = 0;
43 a2 = -a0;
44 b1 = 2 * (K * K - 1) * norm;
45 b2 = (1 - K / Q + K * K) * norm;
46}
47
48void Biquad::configureLowpass(float samplingFrequency, float cutoffFrequency, float Q) {
49 criticalAssertVoid(samplingFrequency >= 2.5f * cutoffFrequency, "Invalid biquad parameters");
50
51 float K = getK(samplingFrequency, cutoffFrequency);
52 float norm = getNorm(K, Q);
53
54 a0 = K * K * norm;
55 a1 = 2 * a0;
56 a2 = a0;
57 b1 = 2 * (K * K - 1) * norm;
58 b2 = (1 - K / Q + K * K) * norm;
59}
60
61void Biquad::configureHighpass(float samplingFrequency, float cutoffFrequency, float Q) {
62 criticalAssertVoid(samplingFrequency >= 2.5f * cutoffFrequency, "Invalid biquad parameters");
63
64 float K = getK(samplingFrequency, cutoffFrequency);
65 float norm = getNorm(K, Q);
66
67 a0 = 1 * norm;
68 a1 = -2 * a0;
69 a2 = a0;
70 b1 = 2 * (K * K - 1) * norm;
71 b2 = (1 - K / Q + K * K) * norm;
72}
73
74float Biquad::filter(float input) {
75 float result = input * a0 + z1;
77 efiPrintf("input %f, a0 %f, z1 %f, result %f", input, a0, z1, result);
78 }
79 z1 = input * a1 + z2 - b1 * result;
80 z2 = input * a2 - b2 * result;
81 return result;
82}
83
84void Biquad::cookSteadyState(float steadyStateInput) {
85 float Y = steadyStateInput * (a0 + a1 + a2) / (1 + b1 + b2);
86
87 float steady_z2 = steadyStateInput * a2 - Y * b2;
88 float steady_z1 = steady_z2 + steadyStateInput * a1 - Y * b1;
89
90 this->z1 = steady_z1;
91 this->z2 = steady_z2;
92}
static float getK(float samplingFrequency, float cutoff)
Definition biquad.cpp:24
static float getNorm(float K, float Q)
Definition biquad.cpp:28
float filter(float input)
Definition biquad.cpp:74
float a0
Definition biquad.h:26
float b1
Definition biquad.h:26
float z1
Definition biquad.h:27
float z2
Definition biquad.h:27
void configureBandpass(float samplingFrequency, float centerFrequency, float Q)
Definition biquad.cpp:32
float b2
Definition biquad.h:26
Biquad()
Definition biquad.cpp:12
float a1
Definition biquad.h:26
void configureHighpass(float samplingFrequency, float cutoffFrequency, float Q=0.54f)
Definition biquad.cpp:61
void cookSteadyState(float steadyStateInput)
Definition biquad.cpp:84
void configureLowpass(float samplingFrequency, float cutoffFrequency, float Q=0.54f)
Definition biquad.cpp:48
void reset()
Definition biquad.cpp:20
float a2
Definition biquad.h:26
static constexpr engine_configuration_s * engineConfiguration