use crate::Curve;
use ndarray::Array1;
use super::interpolate::*;
pub const NORMALIZE_LOW_FREQ: f64 = 1000.0;
pub const NORMALIZE_HIGH_FREQ: f64 = 2000.0;
fn normalize_response(input: &Curve, f_min: f64, f_max: f64) -> Array1<f64> {
let mut sum = 0.0;
let mut count = 0;
for i in 0..input.freq.len() {
if input.freq[i] >= f_min && input.freq[i] <= f_max {
sum += input.spl[i];
count += 1;
}
}
if count > 0 {
let mean = sum / count as f64;
input.spl.clone() - mean } else {
input.spl.clone() }
}
pub fn normalize_and_interpolate_response(
standard_freq: &ndarray::Array1<f64>,
curve: &Curve,
) -> Curve {
let spl_norm = normalize_response(curve, NORMALIZE_LOW_FREQ, NORMALIZE_HIGH_FREQ);
interpolate_log_space(
standard_freq,
&Curve {
freq: curve.freq.clone(),
spl: spl_norm,
phase: curve.phase.clone(),
},
)
}
pub fn interpolate_response(standard_freq: &ndarray::Array1<f64>, curve: &Curve) -> Curve {
interpolate_log_space(standard_freq, curve)
}
pub fn normalize_and_interpolate_response_with_range(
standard_freq: &ndarray::Array1<f64>,
curve: &Curve,
norm_freq_min: f64,
norm_freq_max: f64,
) -> Curve {
let spl_norm = normalize_response(curve, norm_freq_min, norm_freq_max);
interpolate_log_space(
standard_freq,
&Curve {
freq: curve.freq.clone(),
spl: spl_norm,
phase: curve.phase.clone(),
},
)
}