#![allow(clippy::excessive_precision)]
use crate::Jinc;
use crate::math::consts::ConstPI;
use crate::math::sinc::{Sinc, Trigonometry};
use crate::sinc::sinc;
use num_traits::{AsPrimitive, Float};
use std::ops::Div;
#[inline]
pub fn lanczos_jinc<
V: Copy + PartialEq + Div<Output = V> + 'static + Float + ConstPI + AsPrimitive<f64> + Jinc<V>,
>(
x: V,
a: V,
) -> V
where
f32: AsPrimitive<V>,
f64: AsPrimitive<V>,
{
let scale_a: V = 1f32.as_() / a;
if x == 0f32.as_() || x > 16.247661874700962f32.as_() {
return 0f32.as_();
}
if x.abs() < a {
return V::jinc(x) * V::jinc(x * scale_a);
}
0f32.as_()
}
pub(crate) fn lanczos3_jinc<
V: Copy + PartialEq + Div<Output = V> + 'static + Float + ConstPI + AsPrimitive<f64> + Jinc<V>,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
f64: AsPrimitive<V>,
{
lanczos_jinc(x, 3f32.as_())
}
pub(crate) fn lanczos2_jinc<
V: Copy + PartialEq + Div<Output = V> + 'static + Float + ConstPI + AsPrimitive<f64> + Jinc<V>,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
f64: AsPrimitive<V>,
{
lanczos_jinc(x, 2f32.as_())
}
pub(crate) fn lanczos4_jinc<
V: Copy + PartialEq + Div<Output = V> + 'static + Float + ConstPI + AsPrimitive<f64> + Jinc<V>,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
f64: AsPrimitive<V>,
{
lanczos_jinc(x, 4f32.as_())
}
pub(crate) fn lanczos5_jinc<
V: Copy + PartialEq + Div<Output = V> + 'static + Float + ConstPI + AsPrimitive<f64> + Jinc<V>,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
f64: AsPrimitive<V>,
{
lanczos_jinc(x, 5f32.as_())
}
pub(crate) fn lanczos6_jinc<
V: Copy + PartialEq + Div<Output = V> + 'static + Float + ConstPI + AsPrimitive<f64> + Jinc<V>,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
f64: AsPrimitive<V>,
{
const A: f32 = 6f32;
lanczos_jinc(x, A.as_())
}
pub(crate) fn lanczos_sinc<
V: Copy + PartialEq + Div<Output = V> + 'static + Trigonometry + Float + ConstPI + Sinc,
>(
x: V,
a: V,
) -> V
where
f32: AsPrimitive<V>,
{
let scale_a: V = 1f32.as_() / a;
if x.abs() < a {
return sinc(x) * sinc(x * scale_a);
}
0f32.as_()
}
pub(crate) fn lanczos3<
V: Copy + PartialEq + Div<Output = V> + 'static + Float + Trigonometry + ConstPI + Sinc,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
f64: AsPrimitive<V>,
{
lanczos_sinc(x, 3f32.as_())
}
pub(crate) fn lanczos4<
V: Copy + PartialEq + Div<Output = V> + 'static + Trigonometry + Float + ConstPI + Sinc,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
{
lanczos_sinc(x, 4f32.as_())
}
pub(crate) fn lanczos5<
V: Copy + PartialEq + Div<Output = V> + 'static + Trigonometry + Float + ConstPI + Sinc,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
{
lanczos_sinc(x, 5f32.as_())
}
pub(crate) fn lanczos6<
V: Copy + PartialEq + Div<Output = V> + 'static + Trigonometry + Float + ConstPI + Sinc,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
{
lanczos_sinc(x, 6f32.as_())
}
pub(crate) fn lanczos2<
V: Copy + PartialEq + Div<Output = V> + 'static + Trigonometry + Float + ConstPI + Sinc,
>(
x: V,
) -> V
where
f32: AsPrimitive<V>,
{
lanczos_sinc(x, 2f32.as_())
}