// Copyright 2026 MoonBit DSP Authors
// Apache-2.0 License
///|
fn main {
println(
"=== MoonBit DSP: Industrial Machine Vibration Condition Monitoring Demo ===",
)
let fs = 1000.0
let n = 256
let accel = Array::make(n, 0.0)
// Normal rotation baseline + bearing fault impact spike train
for i = 0; i < n; i = i + 1 {
let t = i.to_double() / fs
let baseline = 0.5 * @cmath.sin(2.0 * @cmath.PI * 25.0 * t) // 25 Hz shaft rotation
let impact = if i % 40 == 0 { 8.5 } else { 0.0 } // 25 Hz * (1000/40) = bearing impact
accel[i] = baseline + impact
}
let indicators = @vibration_dsp.compute_vibration_indicators(accel)
println("Peak Acceleration: \{indicators.peak_value} m/s^2")
println("RMS Acceleration: \{indicators.rms_value} m/s^2")
println("Crest Factor: \{indicators.crest_factor}")
println("Kurtosis: \{indicators.kurtosis}")
let envelope_spec = @vibration_dsp.bearing_envelope_spectrum(accel)
println(
"Computed bearing envelope spectrum length: \{envelope_spec.length()}",
)
let analyzer = @streaming.FrameAnalyzer::new(
128,
64,
fs,
@window.WindowType::hann(),
)
let mut frame_count = 0
for i = 0; i < n; i = i + 1 {
match analyzer.push(accel[i]) {
Some(features) => {
frame_count = frame_count + 1
println(
"Frame \{frame_count}: dominant frequency \{features.dominant_frequency()} Hz, spectral centroid \{features.spectral_centroid()} Hz",
)
}
None => ()
}
}
}