use crate::math::consts::ConstPI;
use crate::math::mla;
use crate::math::sinc::Trigonometry;
use num_traits::{AsPrimitive, Float, MulAdd, Signed};
use std::ops::{Add, Div, Mul};
pub(crate) fn hann<
V: Copy + ConstPI + Mul<Output = V> + Div<Output = V> + Signed + Float + 'static + Trigonometry,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
{
let length = 2.0f32.as_();
let size = length * 2f32.as_();
let size_scale = 1f32.as_() / size;
if x.abs() > length {
return 0f32.as_();
}
let r = (x * size_scale).f_cospi();
let r = r * r;
r * size_scale
}
pub(crate) fn hamming<
V: Copy
+ ConstPI
+ Mul<Output = V>
+ Div<Output = V>
+ Signed
+ Float
+ Add<Output = V>
+ 'static
+ Trigonometry
+ MulAdd<V, Output = V>,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
{
let x = x.abs();
if x == 0f32.as_() {
1f32.as_()
} else if x >= 1f32.as_() {
0f32.as_()
} else {
mla(0.46f32.as_(), x.f_cospi(), 0.54f32.as_())
}
}
pub(crate) fn hanning<
V: Copy
+ ConstPI
+ Mul<Output = V>
+ Div<Output = V>
+ Signed
+ Float
+ Add<Output = V>
+ 'static
+ Trigonometry
+ MulAdd<V, Output = V>,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
{
let x = x.abs();
if x == 0.0f32.as_() {
1.0f32.as_()
} else if x >= 1.0f32.as_() {
0.0f32.as_()
} else {
mla(0.5f32.as_(), x.f_cospi(), 0.5f32.as_())
}
}