MoonBit-native scientific signal processing toolkit with FFT, spectra, windows, convolution, FIR filters, and CLI analysis.
Dependencies
# Windows PowerShell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm https://cli.moonbitlang.com/install/powershell.ps1 | iex
git clone https://github.com/chgttyyr/MoonSpectrum.git
cd MoonSpectrum
moon update
moon check --target all
# For Windows native validation, install MSYS2 UCRT64 GCC and add
# C:\\msys64\\ucrt64\\bin to PATH before running the all-backend commands.# Linux or macOS
curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash
git clone https://github.com/chgttyyr/MoonSpectrum.git
cd MoonSpectrum
moon update
moon check --target allmoon test
moon run cmd/main -- demo
moon run cmd/main -- fft examples/sine.csv --sample-rate 8
moon run cmd/main -- analyze examples/sine.csv --sample-rate 8
moon run cmd/main -- window hann 4
moon run cmd/main -- convolve examples/sine.csv examples/kernel.csv{"samples":8,"sample_rate":8,"dominant_bin":2,"dominant_frequency":2,"magnitude":4}test {
let signal = sine_wave(length=8, sample_rate=8.0, frequency=2.0)
let spectrum = fft(real_signal(signal))
let peak = dominant_peak(spectrum, 8.0)
inspect(peak.index, content="2")
}moon info
python scripts/check_format.py
moon check --target all --warn-list +73
moon build --target all
moon test --target all
powershell -ExecutionPolicy Bypass -File scripts\verify_acceptance.ps1 -SkipPublishDryRunmoon run cmd/main -- stats examples/offset.csv
moon run cmd/main -- correlate examples/dual-tone.csv --max-lag 4
moon run cmd/main -- welch examples/sine.csv --sample-rate 8 --segment-length 8 --overlap 0.5 --window hann
moon run cmd/main -- peaks examples/dual-tone.csv --threshold 0.4 --min-distance 2fn Biquad::allpass(cutoff_hz : Double, sample_rate : Double, q? : Double) -> Biquad raise SpectrumErrorfn Biquad::bandpass(cutoff_hz : Double, sample_rate : Double, q? : Double) -> Biquad raise SpectrumErrorfn Biquad::highpass(cutoff_hz : Double, sample_rate : Double, q? : Double) -> Biquad raise SpectrumErrorfn Biquad::lowpass(cutoff_hz : Double, sample_rate : Double, q? : Double) -> Biquad raise SpectrumErrorfn Biquad::notch(cutoff_hz : Double, sample_rate : Double, q? : Double) -> Biquad raise SpectrumErrorfn apply_window(signal : ArrayView[Double], weights : ArrayView[Double]) -> Array[Double] raise SpectrumErrorfn bandpass_fir_taps(length~ : Int, low_cutoff_hz~ : Double, high_cutoff_hz~ : Double, sample_rate~ : Double) -> Array[Double] raise SpectrumErrorfn bandstop_fir_taps(length~ : Int, low_cutoff_hz~ : Double, high_cutoff_hz~ : Double, sample_rate~ : Double) -> Array[Double] raise SpectrumErrorfn biquad_frequency_response(filter : Biquad, sample_rate~ : Double, fft_length~ : Int) -> FrequencyResponse raise SpectrumErrorfn chirp(length~ : Int, sample_rate~ : Double, start_hz~ : Double, end_hz~ : Double, amplitude? : Double) -> Array[Double] raise SpectrumErrorfn circular_convolve(signal : ArrayView[Double], kernel : ArrayView[Double]) -> Array[Double] raise SpectrumErrorfn clip_signal(signal : ArrayView[Double], lower : Double, upper : Double) -> Array[Double] raise SpectrumErrorfn convolve(signal : ArrayView[Double], kernel : ArrayView[Double]) -> Array[Double] raise SpectrumErrorfn correlation_coefficient(left : ArrayView[Double], right : ArrayView[Double]) -> Double raise SpectrumErrorfn cross_correlation(signal : ArrayView[Double], other : ArrayView[Double], max_lag : Int) -> Array[Double] raise SpectrumErrorfn detect_outliers(signal : ArrayView[Double], z_threshold~ : Double) -> Array[Int] raise SpectrumErrorfn differentiate(signal : ArrayView[Double], sample_interval : Double) -> Array[Double] raise SpectrumErrorfn envelope_follow(signal : ArrayView[Double], attack~ : Double, release~ : Double) -> Array[Double] raise SpectrumErrorfn fft_convolve(signal : ArrayView[Double], kernel : ArrayView[Double]) -> Array[Double] raise SpectrumErrorfn find_peaks(signal : ArrayView[Double], threshold? : Double, min_distance? : Int) -> Array[SignalPeak] raise SpectrumErrorfn fir_filter(signal : ArrayView[Double], taps : ArrayView[Double]) -> Array[Double] raise SpectrumErrorfn fir_frequency_response(taps : ArrayView[Double], sample_rate~ : Double, fft_length~ : Int) -> FrequencyResponse raise SpectrumErrorfn fir_impulse_response(taps : ArrayView[Double], response_length : Int) -> Array[Double] raise SpectrumErrorfn frame_signal(signal : ArrayView[Double], frame_length~ : Int, hop_size~ : Int) -> Array[Array[Double]] raise SpectrumErrorfn full_cross_correlation(signal : ArrayView[Double], other : ArrayView[Double]) -> Array[Double] raise SpectrumErrorfn highpass_taps(length~ : Int, cutoff_hz~ : Double, sample_rate~ : Double) -> Array[Double] raise SpectrumErrorfn integrate_trapezoid(signal : ArrayView[Double], sample_interval : Double) -> Double raise SpectrumErrorfn lowpass_taps(length~ : Int, cutoff_hz~ : Double, sample_rate~ : Double) -> Array[Double] raise SpectrumErrorfn mean_absolute_error(reference : ArrayView[Double], estimate : ArrayView[Double]) -> Double raise SpectrumErrorfn normalize_range(signal : ArrayView[Double], lower : Double, upper : Double) -> Array[Double] raise SpectrumErrorfn normalized_correlation(signal : ArrayView[Double], max_lag : Int) -> Array[Double] raise SpectrumErrorfn overlap_add(frames : ArrayView[Array[Double]], hop_size~ : Int) -> Array[Double] raise SpectrumErrorfn periodogram(signal : ArrayView[Double], sample_rate : Double, window_kind? : WindowKind) -> Array[Double] raise SpectrumErrorfn pulse_train(length~ : Int, period~ : Int, amplitude? : Double) -> Array[Double] raise SpectrumErrorfn remove_baseline(signal : ArrayView[Double], baseline : Double) -> Array[Double] raise SpectrumErrorfn resample_linear(signal : ArrayView[Double], target_length : Int) -> Array[Double] raise SpectrumErrorfn resample_sinc(signal : ArrayView[Double], target_length : Int) -> Array[Double] raise SpectrumErrorfn root_mean_square_error(reference : ArrayView[Double], estimate : ArrayView[Double]) -> Double raise SpectrumErrorfn sawtooth_wave(length~ : Int, sample_rate~ : Double, frequency~ : Double, amplitude? : Double) -> Array[Double] raise SpectrumErrorfn scale_signal(signal : ArrayView[Double], input_min~ : Double, input_max~ : Double, output_min~ : Double, output_max~ : Double) -> Array[Double] raise SpectrumErrorfn signal_to_noise_db(reference : ArrayView[Double], estimate : ArrayView[Double]) -> Double raise SpectrumErrorfn sine_wave(length~ : Int, sample_rate~ : Double, frequency~ : Double, amplitude? : Double) -> Array[Double] raise SpectrumErrorfn spectral_band_energy(magnitudes : ArrayView[Double], sample_rate : Double, low_hz : Double, high_hz : Double) -> Double raise SpectrumErrorfn spectral_bandwidth(magnitudes : ArrayView[Double], sample_rate : Double) -> Double raise SpectrumErrorfn spectral_centroid(magnitudes : ArrayView[Double], sample_rate : Double) -> Double raise SpectrumErrorfn spectral_flux(previous : ArrayView[Double], current : ArrayView[Double]) -> Double raise SpectrumErrorfn spectral_rolloff(magnitudes : ArrayView[Double], sample_rate : Double, ratio? : Double) -> Double raise SpectrumErrorfn spectral_summary(spectrum : ArrayView[Complex], sample_rate : Double) -> SpectralSummary raise SpectrumErrorfn spectrogram(signal : ArrayView[Double], window_kind : WindowKind, window_length~ : Int, hop_size~ : Int, sample_rate~ : Double) -> SpectrogramResult raise SpectrumErrorfn square_wave(length~ : Int, sample_rate~ : Double, frequency~ : Double, amplitude? : Double) -> Array[Double] raise SpectrumErrorfn stft(signal : ArrayView[Double], window_kind : WindowKind, window_length : Int, hop_size : Int) -> Array[Array[Complex]] raise SpectrumErrorfn threshold_crossings(signal : ArrayView[Double], threshold : Double) -> Array[Int] raise SpectrumErrorfn triangle_wave(length~ : Int, sample_rate~ : Double, frequency~ : Double, amplitude? : Double) -> Array[Double] raise SpectrumErrorfn welch_psd(signal : ArrayView[Double], sample_rate~ : Double, segment_length~ : Int, overlap~ : Double, window_kind? : WindowKind) -> WelchResult raise SpectrumErrorfn white_noise(length~ : Int, seed~ : UInt, amplitude? : Double) -> Array[Double] raise SpectrumErrorMoonBit-native scientific signal processing toolkit with FFT, spectra, windows, convolution, FIR filters, and CLI analysis.
Dependencies