use num::complex::{
Complex,
ComplexFloat
};
use std::ops::{Add, Neg, Sub, Mul, Div, Index, IndexMut};
use more_asserts::assert_gt;
#[derive(Debug, Clone)]
pub struct FrequencySeries {
f_max: f64,
data: Vec<Complex<f64>>,
}
impl FrequencySeries {
pub fn from_vector(f_max: f64, input_data: Vec<Complex<f64>>) -> Self {
FrequencySeries {
f_max,
data: input_data
}
}
pub fn get_size(&self) -> usize {
self.data.len()
}
pub fn get_f_max(&self) -> f64 {
self.f_max
}
pub fn get_data(&self) -> Vec<Complex<f64>> {
self.data.clone()
}
pub fn real(mut self) -> FrequencySeries {
for i in 0..self.data.len() {
self.data[i] = Complex{re: self.data[i].re, im: 0.0};
}
self
}
pub fn imag(mut self) -> FrequencySeries {
for i in 0..self.data.len() {
self.data[i] = Complex{re: self.data[i].im, im: 0.0};
}
self
}
pub fn abs(mut self) -> FrequencySeries {
for i in 0..self.data.len() {
self.data[i] = Complex{re: self.data[i].norm(), im: 0.0};
}
self
}
pub fn abs2(mut self) -> FrequencySeries {
for i in 0..self.data.len() {
self.data[i] = self.data[i] * self.data[i].conj();
}
self
}
pub fn arg(mut self) -> FrequencySeries {
for i in 0..self.data.len() {
self.data[i] = Complex{re: self.data[i].arg(), im: 0.0};
}
self
}
pub fn conj(mut self) -> FrequencySeries {
for i in 0..self.data.len() {
self.data[i] = self.data[i].conj();
}
self
}
pub fn sqrt(mut self) -> FrequencySeries {
for i in 0..self.data.len() {
self.data[i] = self.data[i].sqrt();
}
self
}
pub fn inv(&mut self) -> &mut FrequencySeries {
for i in 0..self.data.len() {
self.data[i] = self.data[i].inv();
}
self
}
pub fn max_abs(&self) -> f64 {
let mut maximum: f64 = 0f64;
for i in 0..self.get_size() {
if maximum < self[i].abs() {
maximum = self[i].abs();
}
}
maximum
}
pub fn min_abs(&self) -> f64 {
let mut minimum: f64 = f64::INFINITY;
for i in 0..self.get_size() {
if minimum > self[i].abs() {
minimum = self[i].abs();
}
}
minimum
}
pub fn set_to_zero(&mut self) {
for val in self.data.iter_mut() {
*val = Complex{re: 0f64, im: 0f64};
}
}
}
impl<'a> Add<&FrequencySeries> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn add(self, other: &FrequencySeries) -> &'a mut FrequencySeries {
assert_eq!(self.data.len(), other.data.len());
for i in 0..self.data.len() {
self.data[i] += other.data[i];
}
self
}
}
impl<'a> Add<Complex<f64>> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn add(self, other: Complex<f64>) -> &'a mut FrequencySeries {
for i in 0..self.data.len() {
self.data[i] += other;
}
self
}
}
impl<'a> Add<&'a mut FrequencySeries> for Complex<f64> {
type Output = &'a mut FrequencySeries;
fn add(self, other: &'a mut FrequencySeries) -> &'a mut FrequencySeries {
other.add(self)
}
}
impl<'a> Neg for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn neg(self) -> &'a mut FrequencySeries {
self.mul(Complex{re: -1., im: 0.})
}
}
impl<'a> Sub<&FrequencySeries> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn sub(self, other: &FrequencySeries) -> &'a mut FrequencySeries {
assert_eq!(self.data.len(), other.data.len());
for i in 0..self.data.len() {
self.data[i] -= other.data[i];
}
self
}
}
impl<'a> Sub<Complex<f64>> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn sub(self, other: Complex<f64>) -> &'a mut FrequencySeries {
self.add(-other)
}
}
impl<'a> Sub<&'a mut FrequencySeries> for Complex<f64> {
type Output = &'a mut FrequencySeries;
fn sub(self, other: &'a mut FrequencySeries) -> &'a mut FrequencySeries {
other.neg().add(self)
}
}
impl<'a> Mul<&FrequencySeries> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn mul(self, other: &FrequencySeries) -> &'a mut FrequencySeries {
assert_eq!(self.data.len(), other.data.len());
for i in 0..self.data.len() {
self.data[i] *= other.data[i];
}
self
}
}
impl<'a> Mul<Complex<f64>> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn mul(self, other: Complex<f64>) -> &'a mut FrequencySeries {
for i in 0..self.data.len() {
self.data[i] *= other;
}
self
}
}
impl<'a> Mul<&'a mut FrequencySeries> for Complex<f64> {
type Output = &'a mut FrequencySeries;
fn mul(self, other: &'a mut FrequencySeries) -> &'a mut FrequencySeries {
other.mul(self)
}
}
impl<'a> Mul<f64> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn mul(self, other: f64) -> &'a mut FrequencySeries {
self.mul(Complex{re: other, im: 0.})
}
}
impl<'a> Mul<&'a mut FrequencySeries> for f64 {
type Output = &'a mut FrequencySeries;
fn mul(self, other: &'a mut FrequencySeries) -> &'a mut FrequencySeries {
other.mul(self)
}
}
impl<'a> Div<&FrequencySeries> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn div(self, other: &FrequencySeries) -> &'a mut FrequencySeries {
assert_eq!(self.data.len(), other.data.len());
for i in 0..self.data.len() {
self.data[i] /= other.data[i];
}
self
}
}
impl<'a> Div<Complex<f64>> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn div(self, other: Complex<f64>) -> &'a mut FrequencySeries {
self.mul(1. / other)
}
}
impl<'a> Div<&'a mut FrequencySeries> for Complex<f64> {
type Output = &'a mut FrequencySeries;
fn div(self, other: &'a mut FrequencySeries) -> &'a mut FrequencySeries {
other.inv().mul(self)
}
}
impl<'a> Div<f64> for &'a mut FrequencySeries {
type Output = &'a mut FrequencySeries;
fn div(self, other: f64) -> &'a mut FrequencySeries {
self.mul(1. / other)
}
}
impl<'a> Div<&'a mut FrequencySeries> for f64 {
type Output = &'a mut FrequencySeries;
fn div(self, other: &'a mut FrequencySeries) -> &'a mut FrequencySeries {
other.inv().mul(self)
}
}
impl Index<usize> for FrequencySeries {
type Output = Complex<f64>;
fn index(&self, i: usize) -> &Complex<f64> {
assert_gt!(self.data.len(), i);
&self.data[i]
}
}
impl IndexMut<usize> for FrequencySeries {
fn index_mut(&mut self, i: usize) -> &mut Complex<f64> {
assert_gt!(self.data.len(), i);
&mut self.data[i]
}
}