diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a283ef3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/biquad-0.4.2.crate diff --git a/biquad-fix-metadata.diff b/biquad-fix-metadata.diff new file mode 100644 index 0000000..09f9bad --- /dev/null +++ b/biquad-fix-metadata.diff @@ -0,0 +1,8 @@ +--- biquad-0.4.2/Cargo.toml 1970-01-01T00:00:01+00:00 ++++ biquad-0.4.2/Cargo.toml 2023-07-22T15:54:37.244965+00:00 +@@ -21,4 +21,4 @@ + license = "MIT OR Apache-2.0" + repository = "https://github.com/korken89/biquad-rs" + [dependencies.libm] +-version = "0.1.4" ++version = "0.2" diff --git a/biquad-libm0.2.patch b/biquad-libm0.2.patch new file mode 100644 index 0000000..f561941 --- /dev/null +++ b/biquad-libm0.2.patch @@ -0,0 +1,268 @@ +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; diff --git a/rust-biquad.spec b/rust-biquad.spec new file mode 100644 index 0000000..a845e69 --- /dev/null +++ b/rust-biquad.spec @@ -0,0 +1,76 @@ +# Generated by rust2rpm 24 +%bcond_without check +%global debug_package %{nil} + +%global crate biquad + +Name: rust-biquad +Version: 0.4.2 +Release: %autorelease +Summary: Library for digital second order IIR filtrers, also known as biquads + +License: MIT OR Apache-2.0 +URL: https://crates.io/crates/biquad +Source: %{crates_source} +# Manually created patch for downstream crate metadata changes +# * bump libm to 0.2 +Patch: biquad-fix-metadata.diff +# Update to support libm 0.2 +# https://github.com/melodyaheath/biquad-rs/commit/848d9392f081bf53c02b02c256cb3b60cbbf4afc +Patch: biquad-libm0.2.patch + +BuildRequires: rust-packaging >= 21 + +%global _description %{expand: +A library for digital second order IIR filtrers, also known as biquads.} + +%description %{_description} + +%package devel +Summary: %{summary} +BuildArch: noarch + +%description devel %{_description} + +This package contains library source intended for building other packages which +use the "%{crate}" crate. + +%files devel +%license %{crate_instdir}/LICENSE-APACHE +%license %{crate_instdir}/LICENSE-MIT +%doc %{crate_instdir}/CHANGELOG.md +%doc %{crate_instdir}/README.md +%{crate_instdir}/ + +%package -n %{name}+default-devel +Summary: %{summary} +BuildArch: noarch + +%description -n %{name}+default-devel %{_description} + +This package contains library source intended for building other packages which +use the "default" feature of the "%{crate}" crate. + +%files -n %{name}+default-devel +%ghost %{crate_instdir}/Cargo.toml + +%prep +%autosetup -n %{crate}-%{version_no_tilde} -p1 +%cargo_prep + +%generate_buildrequires +%cargo_generate_buildrequires + +%build +%cargo_build + +%install +%cargo_install + +%if %{with check} +%check +%cargo_test +%endif + +%changelog +%autochangelog diff --git a/sources b/sources new file mode 100644 index 0000000..b1d9402 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (biquad-0.4.2.crate) = 354b1c3c2693e522daca5a3a5ab0c0174f173cf69ad1e65297a0774be69bda049a59ce1492f2e107e64b8f0be892bd493b327a9db5ca5f1cfdb0c905ddc27881