pub fn preemphasis(y: &[f64], coef: f64) -> Vec<f64> {
let n = y.len();
if n == 0 {
return Vec::new();
}
if n == 1 {
return vec![y[0]];
}
let mut result = Vec::with_capacity(n);
let zi = 2.0 * y[0] - y[1];
result.push(y[0] + zi);
for i in 1..n {
result.push(y[i] - coef * y[i - 1]);
}
result
}
pub fn deemphasis(y: &[f64], coef: f64) -> Vec<f64> {
let n = y.len();
if n == 0 {
return Vec::new();
}
if n == 1 {
return vec![y[0]];
}
let mut iir = Vec::with_capacity(n);
iir.push(y[0]);
for i in 1..n {
iir.push(y[i] + coef * iir[i - 1]);
}
let corr_base = ((2.0 - coef) * y[0] - y[1]) / (3.0 - coef);
let mut coef_pow = 1.0;
for i in 0..n {
iir[i] -= corr_base * coef_pow;
coef_pow *= coef;
}
iir
}