use alloc::vec::Vec;
use core::f32::consts::PI;
pub fn hann_window(samples: &[f32]) -> Vec<f32> {
let mut windowed_samples = Vec::with_capacity(samples.len());
let samples_len_f32 = samples.len() as f32;
for i in 0..samples.len() {
let two_pi_i = 2.0 * PI * i as f32;
let idontknowthename = (two_pi_i / samples_len_f32).cos();
let multiplier = 0.5 * (1.0 - idontknowthename);
windowed_samples.push(multiplier * samples[i])
}
windowed_samples
}
pub fn hamming_window(samples: &[f32]) -> Vec<f32> {
let mut windowed_samples = Vec::with_capacity(samples.len());
let samples_len_f32 = samples.len() as f32;
for i in 0..samples.len() {
let multiplier = 0.54 - (0.46 * (2.0 * PI * i as f32 / (samples_len_f32 - 1.0).cos()));
windowed_samples.push(multiplier * samples[i])
}
windowed_samples
}
pub fn blackman_harris_4term(samples: &[f32]) -> Vec<f32> {
const ALPHA: [f32; 4] = [
0.35875,
-0.48829,
0.14128,
-0.01168
];
blackman_harris_xterm(samples, &ALPHA)
}
pub fn blackman_harris_7term(samples: &[f32]) -> Vec<f32> {
const ALPHA: [f32; 7] = [
0.27105140069342,
-0.43329793923448,
0.21812299954311,
-0.06592544638803,
0.01081174209837,
-0.00077658482522,
0.00001388721735
];
blackman_harris_xterm(samples, &ALPHA)
}
fn blackman_harris_xterm(samples: &[f32], alphas: &[f32]) -> Vec<f32> {
let mut windowed_samples = Vec::with_capacity(samples.len());
let samples_len_f32 = samples.len() as f32;
for i in 0..samples.len() {
let mut acc = 0.0;
for alpha_i in 0..alphas.len() {
let two_pi_iteration = 2.0 * alpha_i as f32 * PI;
let sample = samples[i];
let cos = ((two_pi_iteration * sample)/samples_len_f32).cos();
acc += alphas[alpha_i] * cos;
}
windowed_samples.push(acc)
}
windowed_samples
}