A zero-dependency, pure-MoonBit digital signal processing library: FFT, convolution, FIR/IIR filters, windowing, waveform generation and statistics.
import {
"2227057182/moonbit-dsp",
}fn main {
// 生成 8000 Hz 采样率、频率 100 Hz、时长 0.25 s 的正弦波
let x = @moonbit-dsp.sine_wave(2000, 100.0, 8000.0)
// 加 Hann 窗抑制频谱泄漏
let w = @moonbit-dsp.apply_window(x, @moonbit-dsp.WindowType::Hann)
// 计算幅值谱,找到主导频率
let (freq, mag) = @moonbit-dsp.dominant_frequency(w, 8000.0)
println("dominant frequency: \{freq.to_string()} Hz, magnitude: \{mag.to_string()}")
}moon test# 正弦波频谱分析(打印前 3 个谱峰 + 主导频率 + 统计量)
moon run cmd/main -- --wave sine --freq 50 --stats
# 白噪声频谱(确定性 LCG,种子固定)
moon run cmd/main -- --wave noise --seed 42 --peaks 2
# 锯齿波经过 FIR 低通(归一化截止 0.1)+ Hann 窗后的频谱
moon run cmd/main -- --wave sawtooth --freq 100 --lowpass 0.1 --window hann --peaks 3| 模块 | 文件 | 提供的功能 |
|---|---|---|
| Complex | complex.mbt | 复数运算(加/减/乘/除、共轭、模、相位) |
| FFT | fft.mbt | 迭代 radix-2 FFT、O(N²) DFT 参考实现、2 的幂对齐、FFT 与 DFT 一致性 |
| Conv | conv.mbt | 线性卷积、互相关、自相关 |
| Window | window.mbt | 矩形/Hann/Hamming/Blackman 窗、加窗 |
| Filter | filter.mbt | 窗函数法 FIR 低通设计、一阶 IIR 低通、二阶 Butterworth IIR 低通(双线性变换) |
| Waveform | waveform.mbt | 正弦/方波/三角波/锯齿波/确定性白噪声(LCG 64) |
| Spectrum | spectrum.mbt | 幅值谱/功率谱(半谱 + 幅值补偿)、主导频率、峰值查找、Top-K |
| Stats | stats.mbt | 均值、方差、标准差、RMS、能量、最大绝对值、归一化 |
Complex::new(re : Double, im : Double) -> Complex
Complex::zero() / Complex::one()
add / sub / mul / div / conj / abs / phase / scalepub(all) enum WindowType { Rectangular, Hann, Hamming, Blackman }
window(WindowType, Int) -> Array[Double] // 生成窗系数
apply_window(Array[Double], WindowType) -> Array[Double]
hann_window(Int) / hamming_window(Int) / blackman_window(Int) / rectangular_window(Int)fft(Array[Double]) -> Array[Complex] // 迭代 radix-2,长度须为 2 的幂
dft(Array[Double]) -> Array[Complex] // O(N²) 参考实现
is_power_of_two(Int) -> Bool
next_power_of_two(Int) -> Int // 对非 2 幂输入自动补零对齐convolve(Array[Double], Array[Double]) -> Array[Double] // 线性卷积
correlate(Array[Double], Array[Double]) -> Array[Double] // 互相关
autocorrelate(Array[Double]) -> Array[Double]fir_lowpass_coeffs(cutoff : Double, taps : Int, window : WindowType) -> Array[Double] // 窗口法,DC 增益归一
fir_filter(Array[Double], Array[Double]) -> Array[Double] // 直接卷积滤波
iir_lowpass_1(Array[Double], alpha : Double) -> Array[Double] // 一阶 IIR
butterworth_lowpass_2(cutoff : Double) -> IirCoeffs2 // 二阶 Butterworth(双线性变换)
iir_filter_2(Array[Double], IirCoeffs2) -> Array[Double] // 直接 II 型实现sine_wave(n : Int, freq : Double, sample_rate : Double, phase~ : Double) -> Array[Double]
square_wave(n : Int, freq : Double, sample_rate : Double, duty~ : Double) -> Array[Double]
triangle_wave / sawtooth_wave(签名同上)
white_noise(n : Int, seed : UInt64) -> Array[Double] // 64 位 LCG,确定性可复现;seed = 0 映射为 1magnitude_spectrum(Array[Double]) -> Array[Double] // 半谱;非 DC/Nyquist bin 幅值 ×2
power_spectrum(Array[Double]) -> Array[Double]
dominant_frequency(Array[Double], sample_rate : Double) -> (Double, Double)
find_peaks(Array[Double], min_height : Double, min_distance : Int) -> Array[(Int, Double)]
top_k(Array[Double], k : Int) -> Array[(Int, Double)]mean / variance(x, sample~ : Bool) / stddev / rms / energy / max_abs / normalizemoonbit-dsp/
├── moon.mod # 包配置(Apache-2.0, preferred_target = wasm)
├── moon.pkg # 库包声明
├── complex.mbt # 复数
├── fft.mbt # FFT / DFT
├── conv.mbt # 卷积与相关
├── window.mbt # 窗函数
├── filter.mbt # FIR / IIR 滤波器
├── waveform.mbt # 波形生成
├── spectrum.mbt # 频谱分析
├── stats.mbt # 统计
├── moonbit-dsp_test.mbt # 39 项单元测试
└── cmd/main/ # CLI 演示(moon run cmd/main -- ...)pub struct Complex {
re : Double
im : Double
}pub struct IirCoeffs2 {
b0 : Double
b1 : Double
b2 : Double
a1 : Double
a2 : Double
}pub(all) enum WindowType {
Rectangular
Hann
Hamming
Blackman
}fn alpha_from_cutoff(cutoff_norm : Double) -> Doublefn is_power_of_two(n : Int) -> Boolfn next_power_of_two(n : Int) -> IntInstall
Download zipA zero-dependency, pure-MoonBit digital signal processing library: FFT, convolution, FIR/IIR filters, windowing, waveform generation and statistics.