Correct goniometer transport and correlation meter
This commit is contained in:
+16
-7
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user