static FAST_COS_TAB_LOG2_SIZE: usize = 9;
static FAST_COS_TAB_SIZE: usize = 1 << FAST_COS_TAB_LOG2_SIZE; static mut FAST_COS_TAB: [f32; 513] = [0.0; 513];
pub fn init_cos_tab() {
for i in 0..(FAST_COS_TAB_SIZE + 1) {
let phase: f32 = (i as f32) * ((std::f32::consts::TAU) / (FAST_COS_TAB_SIZE as f32));
unsafe {
FAST_COS_TAB[i] = phase.cos();
}
}
}
const PHASE_SCALE: f32 = 1.0_f32 / (std::f32::consts::TAU);
pub fn fast_cos(mut x: f32) -> f32 {
x = x.abs();
let phase = x * PHASE_SCALE;
let index = FAST_COS_TAB_SIZE as f32 * phase;
let fract = index.fract();
let index = index.floor() as usize;
unsafe {
let left = FAST_COS_TAB[index as usize];
let right = FAST_COS_TAB[index as usize + 1];
return left + (right - left) * fract;
}
}
pub fn fast_sin(x: f32) -> f32 {
fast_cos(x - (std::f32::consts::PI / 2.0))
}
pub fn square_135(phase: f32) -> f32 {
fast_sin(phase) + fast_sin(phase * 3.0) / 3.0 + fast_sin(phase * 5.0) / 5.0
}
pub fn square_35(phase: f32) -> f32 {
fast_sin(phase * 3.0) / 3.0 + fast_sin(phase * 5.0) / 5.0
}
pub fn quicker_tanh64(v: f64) -> f64 {
let square = v * v;
v / (1.0 + square / (3.0 + square / 5.0))
}
#[inline]
pub fn quicker_tanh(v: f32) -> f32 {
let square = v * v;
v / (1.0 + square / (3.0 + square / 5.0))
}
pub fn quick_tanh64(v: f64) -> f64 {
let abs_v = v.abs();
let square = v * v;
let num = v
* (2.45550750702956
+ 2.45550750702956 * abs_v
+ square * (0.893229853513558 + 0.821226666969744 * abs_v));
let den =
2.44506634652299 + (2.44506634652299 + square) * (v + 0.814642734961073 * v * abs_v).abs();
num / den
}
pub fn quick_tanh(v: f32) -> f32 {
let abs_v = v.abs();
let square = v * v;
let num = v
* (2.45550750702956
+ 2.45550750702956 * abs_v
+ square * (0.893229853513558 + 0.821226666969744 * abs_v));
let den =
2.44506634652299 + (2.44506634652299 + square) * (v + 0.814642734961073 * v * abs_v).abs();
num / den
}
pub fn tanh_approx_drive(v: f32, drive: f32) -> f32 {
let x = v * drive;
if x < -1.25 {
-1.0
} else if x < -0.75 {
1.0 - (x * (-2.5 - x) - 0.5625) - 1.0
} else if x > 1.25 {
1.0
} else if x > 0.75 {
x * (2.5 - x) - 0.5625
} else {
x
}
}