#![allow(non_snake_case)]
use crate::DType;
use crate::signal::filter::types::SosFilter;
use numr::error::Result;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
pub trait FrequencyResponseAlgorithms<R: Runtime<DType = DType>> {
fn freqz(
&self,
b: &Tensor<R>,
a: &Tensor<R>,
worN: FreqzSpec<R>,
whole: bool,
device: &R::Device,
) -> Result<FreqzResult<R>>;
fn sosfreqz(
&self,
sos: &SosFilter<R>,
worN: FreqzSpec<R>,
whole: bool,
device: &R::Device,
) -> Result<FreqzResult<R>>;
fn group_delay(&self, b: &Tensor<R>, a: &Tensor<R>, w: &Tensor<R>) -> Result<Tensor<R>>;
}
#[derive(Debug, Clone)]
pub enum FreqzSpec<R: Runtime<DType = DType>> {
NumPoints(usize),
Frequencies(Tensor<R>),
}
impl<R: Runtime<DType = DType>> Default for FreqzSpec<R> {
fn default() -> Self {
FreqzSpec::NumPoints(512)
}
}
#[derive(Debug, Clone)]
pub struct FreqzResult<R: Runtime<DType = DType>> {
pub w: Tensor<R>,
pub h_real: Tensor<R>,
pub h_imag: Tensor<R>,
}
impl<R: Runtime<DType = DType>> FreqzResult<R> {
pub fn magnitude(&self) -> Result<Tensor<R>> {
let h_re: Vec<f64> = self.h_real.to_vec();
let h_im: Vec<f64> = self.h_imag.to_vec();
let n = h_re.len();
let mag: Vec<f64> = h_re
.iter()
.zip(h_im.iter())
.map(|(&re, &im)| (re * re + im * im).sqrt())
.collect();
let device = self.h_real.device();
Ok(Tensor::from_slice(&mag, &[n], device))
}
pub fn phase(&self) -> Result<Tensor<R>> {
let h_re: Vec<f64> = self.h_real.to_vec();
let h_im: Vec<f64> = self.h_imag.to_vec();
let n = h_re.len();
let phase: Vec<f64> = h_re
.iter()
.zip(h_im.iter())
.map(|(&re, &im)| im.atan2(re))
.collect();
let device = self.h_real.device();
Ok(Tensor::from_slice(&phase, &[n], device))
}
pub fn magnitude_db(&self) -> Result<Tensor<R>> {
let h_re: Vec<f64> = self.h_real.to_vec();
let h_im: Vec<f64> = self.h_imag.to_vec();
let n = h_re.len();
let mag_db: Vec<f64> = h_re
.iter()
.zip(h_im.iter())
.map(|(&re, &im)| {
let mag = (re * re + im * im).sqrt();
20.0 * mag.max(1e-300).log10()
})
.collect();
let device = self.h_real.device();
Ok(Tensor::from_slice(&mag_db, &[n], device))
}
}