stm32-pll-ssb/src/filters.rs

99 lines
4.2 KiB
Rust

use num::complex::Complex;
pub struct FirFilter<const LEN: usize> {
state: [Complex<f32>; LEN],
coeffs: [Complex<f32>; LEN],
pos: usize,
}
impl<const LEN: usize> FirFilter<LEN> {
pub fn new(coeffs: [Complex<f32>; LEN]) -> FirFilter<LEN> {
FirFilter {
state: [Complex::new(0.0, 0.0); LEN],
coeffs: coeffs,
pos: 0,
}
}
pub fn compute(&mut self, sample: Complex<f32>) -> Complex<f32> {
self.state[self.pos] = sample;
self.pos = (self.pos + 1) % LEN;
let mut result = Complex::<f32>::new(0.0, 0.0);
for i in 0..LEN {
result += self.state[(self.pos + i) % LEN] * self.coeffs[i];
}
result
}
}
pub fn usb_firfilter() -> FirFilter<63> {
FirFilter::new([
Complex::new(-7.76328407e-03, 0.00000000e+00),
Complex::new(-1.76283137e-04, -4.92678363e-04),
Complex::new(-6.25577634e-03, 5.13398296e-03),
Complex::new(-6.39279452e-03, -3.83169357e-03),
Complex::new(-5.03930054e-04, 2.53342746e-03),
Complex::new(-1.03144816e-02, 1.53000882e-03),
Complex::new(-2.84091140e-03, -5.31497140e-03),
Complex::new(-4.30880421e-03, 4.75403284e-03),
Complex::new(-1.12464745e-02, -4.65844227e-03),
Complex::new(1.60156679e-04, -3.26006409e-03),
Complex::new(-1.03362126e-02, 3.13545581e-03),
Complex::new(-7.69974139e-03, -1.03818994e-02),
Complex::new(-5.76821480e-04, 8.63274351e-04),
Complex::new(-1.50337277e-02, -3.76575276e-03),
Complex::new(-1.19695644e-03, -1.21529027e-02),
Complex::new(-6.42978800e-03, 3.04106324e-03),
Complex::new(-1.42967043e-02, -1.42967043e-02),
Complex::new(4.02680910e-03, -8.51397251e-03),
Complex::new(-1.52764230e-02, -1.50459634e-03),
Complex::new(-5.98961717e-03, -2.39118921e-02),
Complex::new(2.95727524e-03, -1.97598814e-03),
Complex::new(-2.14271696e-02, -1.58914720e-02),
Complex::new(8.26910313e-03, -2.72595798e-02),
Complex::new(-7.54577227e-03, 3.70700021e-04),
Complex::new(-1.67955192e-02, -4.05479701e-02),
Complex::new(2.33021328e-02, -2.11198221e-02),
Complex::new(-2.74472271e-02, -1.46708486e-02),
Complex::new(1.15826806e-02, -7.80840900e-02),
Complex::new(3.26800996e-02, -6.50047599e-03),
Complex::new(-6.05385232e-02, -1.01002424e-01),
Complex::new(1.84598172e-01, -2.24933523e-01),
Complex::new(3.45823071e-01, 1.23737473e-01),
Complex::new(-7.14505905e-17, 2.90983805e-01),
Complex::new(-1.10872171e-01, 3.96706970e-02),
Complex::new(2.11382003e-02, 2.57569716e-02),
Complex::new(-4.05824891e-02, 6.77077926e-02),
Complex::new(-3.05240813e-02, -6.07161727e-03),
Complex::new(4.61451895e-03, 3.11085599e-02),
Complex::new(-3.87064718e-02, 2.06890402e-02),
Complex::new(-5.59779124e-03, -5.07354224e-03),
Complex::new(-1.09011912e-02, 2.63178036e-02),
Complex::new(-2.66448692e-02, -1.30897849e-03),
Complex::new(1.03245107e-03, 3.40353504e-03),
Complex::new(-1.97995805e-02, 1.46843697e-02),
Complex::new(-1.27633405e-02, -8.52819147e-03),
Complex::new(-2.28844145e-03, 9.13597039e-03),
Complex::new(-2.01212351e-02, 1.98176868e-03),
Complex::new(-3.04106324e-03, -6.42978800e-03),
Complex::new(-8.63497967e-03, 8.63497967e-03),
Complex::new(-1.40101969e-02, -6.62632965e-03),
Complex::new(1.01766417e-04, -1.03325177e-03),
Complex::new(-1.25381879e-02, 3.14065256e-03),
Complex::new(-6.00088826e-03, -8.98096395e-03),
Complex::new(-1.94435998e-03, 2.62166594e-03),
Complex::new(-1.16489269e-02, -3.53366333e-03),
Complex::new(-3.14824186e-04, -6.40839353e-03),
Complex::new(5.56783637e-03, 2.30627334e-03),
Complex::new(-7.00257479e-03, -7.72615067e-03),
Complex::new(1.21764617e-03, -2.27805575e-03),
Complex::new(-7.37249766e-03, -1.09360672e-03),
Complex::new(-1.57881619e-03, -7.93724499e-03),
Complex::new(-4.48820552e-04, 2.69012686e-04),
Complex::new(-6.00109974e-03, -4.92497528e-03),
])
}