| 170 | } |
| 171 | |
| 172 | void Biquad::setLowShelfParams(double frequency, double dbGain) |
| 173 | { |
| 174 | // Clip frequencies to between 0 and 1, inclusive. |
| 175 | frequency = std::max(0.0, std::min(frequency, 1.0)); |
| 176 | |
| 177 | double A = pow(10.0, dbGain / 40); |
| 178 | |
| 179 | if (frequency == 1) |
| 180 | { |
| 181 | // The z-transform is a constant gain. |
| 182 | setNormalizedCoefficients(A * A, 0, 0, |
| 183 | 1, 0, 0); |
| 184 | } |
| 185 | else if (frequency > 0) |
| 186 | { |
| 187 | double w0 = static_cast<double>(LAB_PI) * frequency; |
| 188 | double S = 1; // filter slope (1 is max value) |
| 189 | double alpha = 0.5 * sin(w0) * sqrt((A + 1 / A) * (1 / S - 1) + 2); |
| 190 | double k = cos(w0); |
| 191 | double k2 = 2 * sqrt(A) * alpha; |
| 192 | double aPlusOne = A + 1; |
| 193 | double aMinusOne = A - 1; |
| 194 | |
| 195 | double b0 = A * (aPlusOne - aMinusOne * k + k2); |
| 196 | double b1 = 2 * A * (aMinusOne - aPlusOne * k); |
| 197 | double b2 = A * (aPlusOne - aMinusOne * k - k2); |
| 198 | double a0 = aPlusOne + aMinusOne * k + k2; |
| 199 | double a1 = -2 * (aMinusOne + aPlusOne * k); |
| 200 | double a2 = aPlusOne + aMinusOne * k - k2; |
| 201 | |
| 202 | setNormalizedCoefficients(b0, b1, b2, a0, a1, a2); |
| 203 | } |
| 204 | else |
| 205 | { |
| 206 | // When frequency is 0, the z-transform is 1. |
| 207 | setNormalizedCoefficients(1, 0, 0, |
| 208 | 1, 0, 0); |
| 209 | } |
| 210 | } |
| 211 | |
| 212 | void Biquad::setHighShelfParams(double frequency, double dbGain) |
| 213 | { |
no outgoing calls
no test coverage detected