1use num_traits::{Float, FloatConst};
4use serde::{Deserialize, Serialize};
5
6pub struct State<T> {
8 pub lp: T,
10 pub hp: T,
12 pub bp: T,
14}
15
16impl<T: Float> State<T> {
17 pub fn br(&self) -> T {
19 self.hp + self.lp
20 }
21}
22
23#[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, PartialOrd)]
27pub struct Svf<T> {
28 f: T,
29 q: T,
30}
31
32impl<T: Float + FloatConst> Svf<T> {
33 pub fn set_frequency(&mut self, f0: T) {
37 self.f = (T::one() + T::one()) * (T::PI() * f0).sin();
38 }
39
40 pub fn set_q(&mut self, q: T) {
42 self.q = T::one() / q;
43 }
44
45 pub fn update(&self, s: &mut State<T>, x0: T) {
50 s.lp = s.bp * self.f + s.lp;
51 s.hp = x0 - s.lp - s.bp * self.q;
52 s.bp = s.hp * self.f + s.bp;
53 }
54}