long sin, cos; int32_t b0, b1, a0, a1; /* s3.28 */ const long g = get_replaygain_int(A*5) << 4; /* 10^(db/40), s3.28 */ sin = fp_sincos(cutoff/2, &cos); if (low) { const int32_t sin_div_g = fp_div(sin, g, 25); const int32_t sin_g = FRACMUL(sin, g); cos >>= 3; b0 = sin_g + cos; /* 0.25 .. 4.10 */ b1 = sin_g - cos; /* -1 .. 3.98 */ a0 = sin_div_g + cos; /* 0.25 .. 4.10 */ a1 = sin_div_g - cos; /* -1 .. 3.98 */ } else { const int32_t cos_div_g = fp_div(cos, g, 25); const int32_t cos_g = FRACMUL(cos, g); sin >>= 3; b0 = sin + cos_g; /* 0.25 .. 4.10 */ b1 = sin - cos_g; /* -3.98 .. 1 */ a0 = sin + cos_div_g; /* 0.25 .. 4.10 */ a1 = sin - cos_div_g; /* -3.98 .. 1 */ } const int32_t rcp_a0 = fp_div(1, a0, 57); /* 0.24 .. 3.98, s2.29 */ *c++ = FRACMUL_SHL(b0, rcp_a0, 1); /* 0.063 .. 15.85 */ *c++ = FRACMUL_SHL(b1, rcp_a0, 1); /* -15.85 .. 15.85 */ *c++ = -FRACMUL_SHL(a1, rcp_a0, 1); /* -1 .. 1 */ } /**
int32_t sin, cos; int32_t b0, b1, a0, a1; /* s3.28 */ const long g = integerGain(TXSqrtApprox(A)) << 4; /* 10^(db/40), s3.28 */ sin = fsincos(cutoff/2, &cos); if (low) { const int32_t sin_div_g = DIV64(sin, g, 25); cos >>= 3; b0 = FRACMUL(sin, g) + cos; /* 0.25 .. 4.10 */ b1 = FRACMUL(sin, g) - cos; /* -1 .. 3.98 */ a0 = sin_div_g + cos; /* 0.25 .. 4.10 */ a1 = sin_div_g - cos; /* -1 .. 3.98 */ } else { const int32_t cos_div_g = DIV64(cos, g, 25); sin >>= 3; b0 = sin + FRACMUL(cos, g); /* 0.25 .. 4.10 */ b1 = sin - FRACMUL(cos, g); /* -3.98 .. 1 */ a0 = sin + cos_div_g; /* 0.25 .. 4.10 */ a1 = sin - cos_div_g; /* -3.98 .. 1 */ } const int32_t rcp_a0 = DIV64(1, a0, 57); /* 0.24 .. 3.98, s2.29 */ *c++ = FRACMUL_SHL(b0, rcp_a0, 1); /* 0.063 .. 15.85 */ *c++ = FRACMUL_SHL(b1, rcp_a0, 1); /* -15.85 .. 15.85 */ *c++ = -FRACMUL_SHL(a1, rcp_a0, 1); /* -1 .. 1 */ } TXBiquadFilter TXBiquadFilter::biShelfFilter (float sampleRate, float cutoffLow, float cutoffHigh,