codec-support: add division support for FFTComplex
authorKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 16 Jun 2022 14:32:34 +0000 (16:32 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 16 Jun 2022 14:32:34 +0000 (16:32 +0200)
nihav-codec-support/src/dsp/fft.rs

index 4629f75df5a72dcbdffcc7c07b8d9aa6ada29719..9a80509efa7956f2b290cb54af4c5081ed1bb2c9 100644 (file)
@@ -1,6 +1,6 @@
 //! FFT and RDFT implementation.
 use std::f32::{self, consts};
-use std::ops::{Not, Neg, Add, AddAssign, Sub, SubAssign, Mul, MulAssign};
+use std::ops::{Not, Neg, Add, AddAssign, Sub, SubAssign, Mul, MulAssign, Div};
 use std::fmt;
 
 /// Complex number.
@@ -26,6 +26,14 @@ impl FFTComplex {
     pub fn scale(self, scale: f32) -> Self {
         FFTComplex { re: self.re * scale, im: self.im * scale }
     }
+    /// Returns squared modulus value of the complex number.
+    pub fn sq_modulus(self) -> f32 {
+        self.re * self.re + self.im * self.im
+    }
+    /// Returns reciprocal of the complex number.
+    pub fn reciprocal(self) -> Self {
+        !self.scale(self.sq_modulus())
+    }
 }
 
 impl Neg for FFTComplex {
@@ -87,6 +95,13 @@ impl MulAssign for FFTComplex {
     }
 }
 
+impl Div for FFTComplex {
+    type Output = FFTComplex;
+    fn div(self, other: Self) -> Self::Output {
+        self * other.reciprocal()
+    }
+}
+
 impl fmt::Display for FFTComplex {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "({}, {})", self.re, self.im)