crate::ix!();
#[cfg(test)]
mod chatgpt_generated_tests {
use super::*;
#[test]
fn test_coeff_hp_base() {
let mut filter = BiquadFilter::default();
filter.coeff_hp(0.5, 0.7);
assert_eq!(filter.process(0.0), 0.0);
}
#[test]
fn test_coeff_hp() {
let mut filter = BiquadFilter::default();
filter.coeff_hp(0.5, 0.5);
assert_eq!(filter.a0, 1.0526315789473684);
assert_eq!(filter.a1, -1.5789473684210527);
assert_eq!(filter.a2, 0.631578947368421);
assert_eq!(filter.b0, 0.5263157894736842);
assert_eq!(filter.b1, -1.0526315789473684);
assert_eq!(filter.b2, 0.5263157894736842);
let mut filter = BiquadFilter::default();
filter.coeff_hp(PI + 0.1, 0.5);
assert_eq!(filter.a0, 1.0);
assert_eq!(filter.a1, 0.0);
assert_eq!(filter.a2, 0.0);
assert_eq!(filter.b0, 0.0);
assert_eq!(filter.b1, 0.0);
assert_eq!(filter.b2, 0.0);
}
#[test]
fn test_coeff_hp_with_bw() {
let mut filter = BiquadFilter::default();
filter.coeff_hp_with_bw(0.5, 0.2);
assert_eq!(filter.a0, 1.4250976310728838);
assert_eq!(filter.a1, -1.9999999999999987);
assert_eq!(filter.a2, 0.5749023689271153);
assert_eq!(filter.b0, 0.7125488155364419);
assert_eq!(filter.b1, -1.4250976310728838);
assert_eq!(filter.b2, 0.7125488155364419);
}
#[test]
fn test_biquad_hp_filter_sine_wave() {
let mut filter = BiquadFilter::default();
let mut output: [f64; 4] = [0.0; 4];
filter.coeff_hp(2.0 * PI * 1000.0, 0.707);
let input: [f64; 4] = [0.0, 1.0, 0.0, -1.0];
filter.process(&input, &mut output);
assert!((output[1] - 0.707).abs() < 1e-6);
}
#[test]
fn test_biquad_hp_filter_frequency_response() {
let mut filter = BiquadFilter::default();
filter.coeff_hp(2.0 * PI * 1000.0, 0.707);
let num_points = 100;
let f_min = 10.0;
let f_max = 10000.0;
let df = (f_max - f_min) / (num_points as f64 - 1.0);
let mut f = f_min;
for _ in 0..num_points {
let omega = 2.0 * PI * f;
let mut expected_output = [0.0; 4];
let mut input = [0.0; 4];
let mut output = [0.0; 4];
let expected_mag = if f < 1000.0 {
0.0
} else {
let alpha = (omega.sin() / (2.0 * 0.707));
let numerator = alpha * alpha;
let denominator = 1.0 + alpha;
let mag = numerator / denominator;
mag.sqrt()
};
input[1] = 1.0;
filter.process(&input, &mut output);
let output_mag = output[1].abs();
assert!((output_mag - expected_mag).abs() < 0.1);
f += df;
}
}
}