use num::complex::{
Complex,
ComplexFloat
};
use std::ops::{Add, Neg, Sub, Mul, Div, Index, IndexMut};
#[derive(Debug, Clone)]
pub struct Spectrogram {
f_max: f64,
t0: f64,
dt: f64,
data: Vec<Vec<Complex<f64>>>,
}
impl Spectrogram {
pub fn from_vector(f_max: f64, t0: f64, dt: f64, input_data: Vec<Vec<Complex<f64>>>) -> Self {
Spectrogram {
f_max,
t0,
dt,
data: input_data
}
}
pub fn get_size(&self) -> (usize, usize) {
(self.data.len(), self.data[0].len())
}
pub fn get_f_max(&self) -> f64 {
self.f_max
}
pub fn get_t0(&self) -> f64 {
self.t0
}
pub fn get_dt(&self) -> f64 {
self.dt
}
pub fn get_data(&self) -> Vec<Vec<Complex<f64>>> {
self.data.clone()
}
}
impl Spectrogram {
pub fn real(mut self) -> Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val = Complex{re: it_val.re, im: 0f64};
}
}
self
}
pub fn imag(mut self) -> Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val = Complex{re: it_val.im, im: 0f64};
}
}
self
}
pub fn abs(mut self) -> Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val = Complex{re: it_val.norm(), im: 0f64};
}
}
self
}
pub fn abs2(mut self) -> Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val = *it_val * it_val.conj();
}
}
self
}
pub fn arg(mut self) -> Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val = Complex{re: it_val.arg(), im: 0f64};
}
}
self
}
pub fn conj(mut self) -> Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val = it_val.conj();
}
}
self
}
pub fn sqrt(mut self) -> Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val = it_val.sqrt();
}
}
self
}
pub fn inv(&mut self) -> &mut Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val = it_val.inv();
}
}
self
}
}
impl<'a> Add<&Spectrogram> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn add(self, other: &Spectrogram) -> &'a mut Spectrogram {
for it_vec in other.data.iter().zip(self.data.iter_mut()) {
let (vec1, vec2) = it_vec;
assert_eq!(vec1.len(), vec2.len());
for it_val in vec1.iter().zip(vec2.iter_mut()) {
let (val1, val2) = it_val;
*val2 += *val1;
}
}
self
}
}
impl<'a> Add<Complex<f64>> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn add(self, other: Complex<f64>) -> &'a mut Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val += other;
}
}
self
}
}
impl<'a> Add<&'a mut Spectrogram> for Complex<f64> {
type Output = &'a mut Spectrogram;
fn add(self, other: &'a mut Spectrogram) -> &'a mut Spectrogram {
other.add(self)
}
}
impl<'a> Neg for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn neg(self) -> &'a mut Spectrogram {
self.mul(Complex{re: -1., im: 0.})
}
}
impl<'a> Sub<&Spectrogram> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn sub(self, other: &Spectrogram) -> &'a mut Spectrogram {
for it_vec in other.data.iter().zip(self.data.iter_mut()) {
let (vec1, vec2) = it_vec;
assert_eq!(vec1.len(), vec2.len());
for it_val in vec1.iter().zip(vec2.iter_mut()) {
let (val1, val2) = it_val;
*val2 -= *val1;
}
}
self
}
}
impl<'a> Sub<Complex<f64>> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn sub(self, other: Complex<f64>) -> &'a mut Spectrogram {
self.add(-other)
}
}
impl<'a> Sub<&'a mut Spectrogram> for Complex<f64> {
type Output = &'a mut Spectrogram;
fn sub(self, other: &'a mut Spectrogram) -> &'a mut Spectrogram {
other.neg().add(self)
}
}
impl<'a> Mul<&Spectrogram> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn mul(self, other: &Spectrogram) -> &'a mut Spectrogram {
for it_vec in other.data.iter().zip(self.data.iter_mut()) {
let (vec1, vec2) = it_vec;
assert_eq!(vec1.len(), vec2.len());
for it_val in vec1.iter().zip(vec2.iter_mut()) {
let (val1, val2) = it_val;
*val2 *= *val1;
}
}
self
}
}
impl<'a> Mul<Complex<f64>> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn mul(self, other: Complex<f64>) -> &'a mut Spectrogram {
for it_vec in self.data.iter_mut() {
for it_val in it_vec.iter_mut() {
*it_val *= other;
}
}
self
}
}
impl<'a> Mul<&'a mut Spectrogram> for Complex<f64> {
type Output = &'a mut Spectrogram;
fn mul(self, other: &'a mut Spectrogram) -> &'a mut Spectrogram {
other.mul(self)
}
}
impl<'a> Mul<f64> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn mul(self, other: f64) -> &'a mut Spectrogram {
self.mul(Complex{re: other, im: 0.})
}
}
impl<'a> Mul<&'a mut Spectrogram> for f64 {
type Output = &'a mut Spectrogram;
fn mul(self, other: &'a mut Spectrogram) -> &'a mut Spectrogram {
other.mul(self)
}
}
impl<'a> Div<&Spectrogram> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn div(self, other: &Spectrogram) -> &'a mut Spectrogram {
for it_vec in other.data.iter().zip(self.data.iter_mut()) {
let (vec1, vec2) = it_vec;
assert_eq!(vec1.len(), vec2.len());
for it_val in vec1.iter().zip(vec2.iter_mut()) {
let (val1, val2) = it_val;
*val2 /= *val1;
}
}
self
}
}
impl<'a> Div<Complex<f64>> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn div(self, other: Complex<f64>) -> &'a mut Spectrogram {
self.mul(1. / other)
}
}
impl<'a> Div<&'a mut Spectrogram> for Complex<f64> {
type Output = &'a mut Spectrogram;
fn div(self, other: &'a mut Spectrogram) -> &'a mut Spectrogram {
other.inv().mul(self)
}
}
impl<'a> Div<f64> for &'a mut Spectrogram {
type Output = &'a mut Spectrogram;
fn div(self, other: f64) -> &'a mut Spectrogram {
self.mul(1. / other)
}
}
impl<'a> Div<&'a mut Spectrogram> for f64 {
type Output = &'a mut Spectrogram;
fn div(self, other: &'a mut Spectrogram) -> &'a mut Spectrogram {
other.inv().mul(self)
}
}
impl Index<usize> for Spectrogram {
type Output = Vec<Complex<f64>>;
fn index(&self, i: usize) -> &Vec<Complex<f64>> {
assert!(self.data.len() > i);
&self.data[i]
}
}
impl IndexMut<usize> for Spectrogram {
fn index_mut(&mut self, i: usize) -> &mut Vec<Complex<f64>> {
assert!(self.data.len() > i);
&mut self.data[i]
}
}