use scirs2_core::ndarray::Array1;
fn main() {
let n = 50;
let mut signal_vec = Vec::with_capacity(n);
for i in 0..n {
let t = i as f64 / 10.0;
signal_vec.push(
(2.0 * std::f64::consts::PI * 0.1 * t).sin()
+ 0.5 * (2.0 * std::f64::consts::PI * 0.3 * t).cos()
+ 0.1 * (i as f64 / n as f64 - 0.5),
); }
let signal = Array1::from_vec(signal_vec);
let order = 4;
println!("Testing burg_method...");
if let Ok((ar_coeffs, _reflection_coeffs, variance)) =
scirs2_signal::parametric::burg_method(&signal, order)
{
println!(
"✓ burg_method works: {} coefficients, variance: {}",
ar_coeffs.len(),
variance
);
println!(
" AR coefficients: {:?}",
ar_coeffs.slice(scirs2_core::ndarray::s![0..3])
);
println!("Testing ar_spectrum...");
let freqs = Array1::from_vec(vec![0.1, 0.2, 0.3, 0.4, 0.5]);
let fs = 2.0;
match scirs2_signal::parametric::ar_spectrum(&ar_coeffs, variance, &freqs, fs) {
Ok(spectrum) => {
println!("✓ ar_spectrum works: {} spectrum points", spectrum.len());
}
Err(e) => {
println!("✗ ar_spectrum failed: {}", e);
println!(" Debug: first coefficient is {}", ar_coeffs[0]);
}
}
} else {
println!("✗ burg_method failed");
}
println!("Testing yule_walker...");
let yule_order = 2; match scirs2_signal::parametric::yule_walker(&signal, yule_order) {
Ok((_ar_coeffs, _reflection_coeffs, _variance)) => {
println!("✓ yule_walker works");
}
Err(e) => {
println!("First attempt failed: {}", e);
println!("Trying with simpler signal...");
let simple_signal = Array1::from_vec(vec![1.0, 2.0, 1.5, 3.0, 2.5, 4.0, 3.0, 2.0, 1.0]);
match scirs2_signal::parametric::yule_walker(&simple_signal, 1) {
Ok((_ar_coeffs, _reflection_coeffs, _variance)) => {
println!("✓ yule_walker works with simpler signal");
}
Err(e2) => {
println!("✗ yule_walker failed even with simpler signal: {}", e2);
}
}
}
}
println!("All parametric exports are working correctly!");
}