diff --git a/src/coefficients.rs b/src/coefficients.rs index 52c3d1f..c8e0c4b 100644 --- a/src/coefficients.rs +++ b/src/coefficients.rs @@ -40,8 +40,7 @@ use crate::{frequency::Hertz, Errors}; // For some reason this is not detected properly -#[allow(unused_imports)] -use libm::{F32Ext, F64Ext}; +use libm::{tan, sin, cos, pow, tanf, sinf, cosf, powf, sqrt, sqrtf}; /// Common Q value of the Butterworth low-pass filter pub const Q_BUTTERWORTH_F32: f32 = core::f32::consts::FRAC_1_SQRT_2; @@ -111,7 +110,7 @@ impl Coefficients { }) } Type::SinglePoleLowPass => { - let omega_t = (omega / 2.0).tan(); + let omega_t = tanf(omega / 2.0); let a0 = 1.0 + omega_t; Ok(Coefficients { @@ -126,8 +125,8 @@ impl Coefficients { // The code for omega_s/c and alpha is currently duplicated due to the single pole // low pass filter not needing it and when creating coefficients are commonly // assumed to be of low computational complexity. - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sinf(omega); + let omega_c = cosf(omega); let alpha = omega_s / (2.0 * q_value); let b0 = (1.0 - omega_c) * 0.5; @@ -146,8 +145,8 @@ impl Coefficients { }) } Type::HighPass => { - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sinf(omega); + let omega_c = cosf(omega); let alpha = omega_s / (2.0 * q_value); let b0 = (1.0 + omega_c) * 0.5; @@ -166,8 +165,8 @@ impl Coefficients { }) } Type::BandPass => { - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sinf(omega); + let omega_c = cosf(omega); let alpha = omega_s / (2.0 * q_value); let b0 = omega_s / 2.0; @@ -188,8 +187,8 @@ impl Coefficients { }) } Type::Notch => { - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sinf(omega); + let omega_c = cosf(omega); let alpha = omega_s / (2.0 * q_value); let b0 = 1.0; @@ -208,8 +207,8 @@ impl Coefficients { }) } Type::AllPass => { - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sinf(omega); + let omega_c = cosf(omega); let alpha = omega_s / (2.0 * q_value); let b0 = 1.0 - alpha; @@ -228,17 +227,17 @@ impl Coefficients { }) } Type::LowShelf(db_gain) => { - let a = 10.0f32.powf(db_gain / 40.0); - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let a = powf(10.0f32,db_gain / 40.0); + let omega_s = sinf(omega); + let omega_c = cosf(omega); let alpha = omega_s / (2.0 * q_value); - let b0 = a * ((a + 1.0) - (a - 1.0) * omega_c + 2.0 * alpha * a.sqrt()); + let b0 = a * ((a + 1.0) - (a - 1.0) * omega_c + 2.0 * alpha * sqrtf(a)); let b1 = 2.0 * a * ((a - 1.0) - (a + 1.0) * omega_c); - let b2 = a * ((a + 1.0) - (a - 1.0) * omega_c - 2.0 * alpha * a.sqrt()); - let a0 = (a + 1.0) + (a - 1.0) * omega_c + 2.0 * alpha * a.sqrt(); + let b2 = a * ((a + 1.0) - (a - 1.0) * omega_c - 2.0 * alpha * sqrtf(a)); + let a0 = (a + 1.0) + (a - 1.0) * omega_c + 2.0 * alpha * sqrtf(a); let a1 = -2.0 * ((a - 1.0) + (a + 1.0) * omega_c); - let a2 = (a + 1.0) + (a - 1.0) * omega_c - 2.0 * alpha * a.sqrt(); + let a2 = (a + 1.0) + (a - 1.0) * omega_c - 2.0 * alpha * sqrtf(a); Ok(Coefficients { a1: a1 / a0, @@ -249,17 +248,17 @@ impl Coefficients { }) } Type::HighShelf(db_gain) => { - let a = 10.0f32.powf(db_gain / 40.0); - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let a = powf(10.0f32,db_gain / 40.0); + let omega_s = sinf(omega); + let omega_c = cosf(omega); let alpha = omega_s / (2.0 * q_value); - let b0 = a * ((a + 1.0) + (a - 1.0) * omega_c + 2.0 * alpha * a.sqrt()); + let b0 = a * ((a + 1.0) + (a - 1.0) * omega_c + 2.0 * alpha * sqrtf(a)); let b1 = -2.0 * a * ((a - 1.0) + (a + 1.0) * omega_c); - let b2 = a * ((a + 1.0) + (a - 1.0) * omega_c - 2.0 * alpha * a.sqrt()); - let a0 = (a + 1.0) - (a - 1.0) * omega_c + 2.0 * alpha * a.sqrt(); + let b2 = a * ((a + 1.0) + (a - 1.0) * omega_c - 2.0 * alpha * sqrtf(a)); + let a0 = (a + 1.0) - (a - 1.0) * omega_c + 2.0 * alpha * sqrtf(a); let a1 = 2.0 * ((a - 1.0) - (a + 1.0) * omega_c); - let a2 = (a + 1.0) - (a - 1.0) * omega_c - 2.0 * alpha * a.sqrt(); + let a2 = (a + 1.0) - (a - 1.0) * omega_c - 2.0 * alpha * sqrtf(a); Ok(Coefficients { a1: a1 / a0, @@ -270,9 +269,9 @@ impl Coefficients { }) } Type::PeakingEQ(db_gain) => { - let a = 10.0f32.powf(db_gain / 40.0); - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let a = powf(10.0f32,db_gain / 40.0); + let omega_s = sinf(omega); + let omega_c = cosf(omega); let alpha = omega_s / (2.0 * q_value); let b0 = 1.0 + alpha * a; @@ -327,7 +326,7 @@ impl Coefficients { }) } Type::SinglePoleLowPass => { - let omega_t = (omega / 2.0).tan(); + let omega_t = tan(omega / 2.0); let a0 = 1.0 + omega_t; Ok(Coefficients { @@ -342,8 +341,8 @@ impl Coefficients { // The code for omega_s/c and alpha is currently duplicated due to the single pole // low pass filter not needing it and when creating coefficients are commonly // assumed to be of low computational complexity. - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sin(omega); + let omega_c = cos(omega); let alpha = omega_s / (2.0 * q_value); let b0 = (1.0 - omega_c) * 0.5; @@ -364,8 +363,8 @@ impl Coefficients { }) } Type::HighPass => { - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sin(omega); + let omega_c = cos(omega); let alpha = omega_s / (2.0 * q_value); let b0 = (1.0 + omega_c) * 0.5; @@ -386,8 +385,8 @@ impl Coefficients { }) } Type::Notch => { - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sin(omega); + let omega_c = cos(omega); let alpha = omega_s / (2.0 * q_value); let b0 = 1.0; @@ -408,8 +407,8 @@ impl Coefficients { }) } Type::BandPass => { - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sin(omega); + let omega_c = cos(omega); let alpha = omega_s / (2.0 * q_value); let b0 = omega_s / 2.0; @@ -430,8 +429,8 @@ impl Coefficients { }) } Type::AllPass => { - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let omega_s = sin(omega); + let omega_c = cos(omega); let alpha = omega_s / (2.0 * q_value); let b0 = 1.0 - alpha; @@ -450,17 +449,17 @@ impl Coefficients { }) } Type::LowShelf(db_gain) => { - let a = 10.0f64.powf(db_gain / 40.0); - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let a = pow(10.0f64,db_gain / 40.0); + let omega_s = sin(omega); + let omega_c = cos(omega); let alpha = omega_s / (2.0 * q_value); - let b0 = a * ((a + 1.0) - (a - 1.0) * omega_c + 2.0 * alpha * a.sqrt()); + let b0 = a * ((a + 1.0) - (a - 1.0) * omega_c + 2.0 * alpha * sqrt(a)); let b1 = 2.0 * a * ((a - 1.0) - (a + 1.0) * omega_c); - let b2 = a * ((a + 1.0) - (a - 1.0) * omega_c - 2.0 * alpha * a.sqrt()); - let a0 = (a + 1.0) + (a - 1.0) * omega_c + 2.0 * alpha * a.sqrt(); + let b2 = a * ((a + 1.0) - (a - 1.0) * omega_c - 2.0 * alpha * sqrt(a)); + let a0 = (a + 1.0) + (a - 1.0) * omega_c + 2.0 * alpha * sqrt(a); let a1 = -2.0 * ((a - 1.0) + (a + 1.0) * omega_c); - let a2 = (a + 1.0) + (a - 1.0) * omega_c - 2.0 * alpha * a.sqrt(); + let a2 = (a + 1.0) + (a - 1.0) * omega_c - 2.0 * alpha * sqrt(a); Ok(Coefficients { a1: a1 / a0, @@ -471,17 +470,17 @@ impl Coefficients { }) } Type::HighShelf(db_gain) => { - let a = 10.0f64.powf(db_gain / 40.0); - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let a = pow(10.0f64,db_gain / 40.0); + let omega_s = sin(omega); + let omega_c = cos(omega); let alpha = omega_s / (2.0 * q_value); - let b0 = a * ((a + 1.0) + (a - 1.0) * omega_c + 2.0 * alpha * a.sqrt()); + let b0 = a * ((a + 1.0) + (a - 1.0) * omega_c + 2.0 * alpha * sqrt(a)); let b1 = -2.0 * a * ((a - 1.0) + (a + 1.0) * omega_c); - let b2 = a * ((a + 1.0) + (a - 1.0) * omega_c - 2.0 * alpha * a.sqrt()); - let a0 = (a + 1.0) - (a - 1.0) * omega_c + 2.0 * alpha * a.sqrt(); + let b2 = a * ((a + 1.0) + (a - 1.0) * omega_c - 2.0 * alpha * sqrt(a)); + let a0 = (a + 1.0) - (a - 1.0) * omega_c + 2.0 * alpha * sqrt(a); let a1 = 2.0 * ((a - 1.0) - (a + 1.0) * omega_c); - let a2 = (a + 1.0) - (a - 1.0) * omega_c - 2.0 * alpha * a.sqrt(); + let a2 = (a + 1.0) - (a - 1.0) * omega_c - 2.0 * alpha * sqrt(a); Ok(Coefficients { a1: a1 / a0, @@ -492,9 +491,9 @@ impl Coefficients { }) } Type::PeakingEQ(db_gain) => { - let a = 10.0f64.powf(db_gain / 40.0); - let omega_s = omega.sin(); - let omega_c = omega.cos(); + let a = pow(10.0f64,db_gain / 40.0); + let omega_s = sin(omega); + let omega_c = cos(omega); let alpha = omega_s / (2.0 * q_value); let b0 = 1.0 + alpha * a;