Correct goniometer transport and correlation meter

This commit is contained in:
Mikei386
2026-07-21 20:06:47 +02:00
parent 91aeccb938
commit 54f0f7a450
12 changed files with 297 additions and 80 deletions
+16 -7
View File
@@ -27,7 +27,7 @@ impl CorrelationMeter {
power_r: 0.0,
cross_power: 0.0,
value: 0.0,
negative_peak: 1.0,
negative_peak: 0.0,
reset_token,
};
meter.configure(sample_rate, response_seconds, reset_token);
@@ -40,12 +40,12 @@ impl CorrelationMeter {
if self.sample_rate != sample_rate || self.response_seconds != response_seconds {
self.sample_rate = sample_rate;
self.response_seconds = response_seconds;
self.alpha = 1.0
- (-1.0 / (f64::from(sample_rate) * f64::from(response_seconds))).exp();
self.alpha =
1.0 - (-1.0 / (f64::from(sample_rate) * f64::from(response_seconds))).exp();
}
if self.reset_token != reset_token {
self.reset_token = reset_token;
self.negative_peak = 1.0;
self.negative_peak = 0.0;
}
}
@@ -106,13 +106,21 @@ mod tests {
fn detects_positive_negative_and_quadrature_signals() {
let sample_rate = 48_000;
let phase_step = 2.0 * std::f32::consts::PI * 1_000.0 / sample_rate as f32;
for (phase, expected) in [(0.0, 1.0), (std::f32::consts::PI, -1.0), (std::f32::consts::FRAC_PI_2, 0.0)] {
for (phase, expected) in [
(0.0, 1.0),
(std::f32::consts::PI, -1.0),
(std::f32::consts::FRAC_PI_2, 0.0),
] {
let mut meter = CorrelationMeter::new(sample_rate, 1.0, 0);
run_signal(&mut meter, 5, |index| {
let angle = phase_step * index as f32;
(angle.sin(), (angle + phase).sin())
});
assert!((meter.value() - expected).abs() < 0.002, "phase {phase}: {}", meter.value());
assert!(
(meter.value() - expected).abs() < 0.002,
"phase {phase}: {}",
meter.value()
);
}
}
@@ -134,7 +142,7 @@ mod tests {
});
assert!(fast.negative_peak() < -0.7);
fast.configure(sample_rate, 1.0, 1);
assert_eq!(fast.negative_peak(), 1.0);
assert_eq!(fast.negative_peak(), 0.0);
}
#[test]
@@ -142,6 +150,7 @@ mod tests {
let mut meter = CorrelationMeter::new(48_000, 1.0, 0);
run_signal(&mut meter, 2, |_| (0.0, 0.0));
assert_eq!(meter.value(), 0.0);
assert_eq!(meter.negative_peak(), 0.0);
run_signal(&mut meter, 2, |index| {
let sample = if index & 1 == 0 { 0.5 } else { -0.5 };
(sample, 0.0)