diff --git a/plugins/loudness_war_winner/src/filter.rs b/plugins/loudness_war_winner/src/filter.rs
new file mode 100644
index 00000000..92e510a6
--- /dev/null
+++ b/plugins/loudness_war_winner/src/filter.rs
@@ -0,0 +1,144 @@
+// Loudness War Winner: Because negative LUFS are boring
+// Copyright (C) 2022 Robbert van der Helm
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+use std::f32::consts;
+use std::ops::{Add, Mul, Sub};
+
+/// A simple biquad filter with functions for generating coefficients for second order low-pass and
+/// high-pass filters.
+///
+/// Based on .
+///
+/// The type parameter T should be either an `f32` or a SIMD type.
+#[derive(Clone, Copy, Debug)]
+pub struct Biquad {
+ pub coefficients: BiquadCoefficients,
+ s1: T,
+ s2: T,
+}
+
+/// The coefficients `[b0, b1, b2, a1, a2]` for [`Biquad`]. These coefficients are all
+/// prenormalized, i.e. they have been divided by `a0`.
+///
+/// The type parameter T should be either an `f32` or a SIMD type.
+#[derive(Clone, Copy, Debug)]
+pub struct BiquadCoefficients {
+ b0: T,
+ b1: T,
+ b2: T,
+ a1: T,
+ a2: T,
+}
+
+/// Either an `f32` or some SIMD vector type of `f32`s that can be used with our biquads.
+pub trait SimdType:
+ Mul