| 210 | } |
| 211 | |
| 212 | void Biquad::setHighShelfParams(double frequency, double dbGain) |
| 213 | { |
| 214 | // Clip frequencies to between 0 and 1, inclusive. |
| 215 | frequency = std::max(0.0, std::min(frequency, 1.0)); |
| 216 | |
| 217 | double A = pow(10.0, dbGain / 40); |
| 218 | |
| 219 | if (frequency == 1) |
| 220 | { |
| 221 | // The z-transform is 1. |
| 222 | setNormalizedCoefficients(1, 0, 0, |
| 223 | 1, 0, 0); |
| 224 | } |
| 225 | else if (frequency > 0) |
| 226 | { |
| 227 | double w0 = static_cast<double>(LAB_PI) * frequency; |
| 228 | double S = 1; // filter slope (1 is max value) |
| 229 | double alpha = 0.5 * sin(w0) * sqrt((A + 1 / A) * (1 / S - 1) + 2); |
| 230 | double k = cos(w0); |
| 231 | double k2 = 2 * sqrt(A) * alpha; |
| 232 | double aPlusOne = A + 1; |
| 233 | double aMinusOne = A - 1; |
| 234 | |
| 235 | double b0 = A * (aPlusOne + aMinusOne * k + k2); |
| 236 | double b1 = -2 * A * (aMinusOne + aPlusOne * k); |
| 237 | double b2 = A * (aPlusOne + aMinusOne * k - k2); |
| 238 | double a0 = aPlusOne - aMinusOne * k + k2; |
| 239 | double a1 = 2 * (aMinusOne - aPlusOne * k); |
| 240 | double a2 = aPlusOne - aMinusOne * k - k2; |
| 241 | |
| 242 | setNormalizedCoefficients(b0, b1, b2, a0, a1, a2); |
| 243 | } |
| 244 | else |
| 245 | { |
| 246 | // When frequency = 0, the filter is just a gain, A^2. |
| 247 | setNormalizedCoefficients(A * A, 0, 0, |
| 248 | 1, 0, 0); |
| 249 | } |
| 250 | } |
| 251 | |
| 252 | void Biquad::setPeakingParams(double frequency, double Q, double dbGain) |
| 253 | { |
no outgoing calls
no test coverage detected