#pitch #note #frequency #detection #detect

pitch-detector

用Rust编写的频率和音符检测库

3个不稳定版本

0.3.1 2022年6月3日
0.3.0 2022年4月18日
0.1.0 2022年3月25日

#388 in 音频

MIT许可

60KB
1.5K SLoC

pitch-detector

Build status docs.rs codecov Crates.io GitHub

用Rust编写的频率和音符检测库。

使用方法

最常见的使用情况是检测信号的基频。

use pitch_detector::{
    pitch::{hanned_fft::HannedFftDetector, PitchDetector},
};

let sample_rate = 44100.
let signal: Vec<f64> = ...;

let mut detector = HannedFftDetector::default();
let freq: f64 = detector.detect_pitch(&signal, sample_rate)?;

另一种常见使用情况是检测信号的基音。这种情况与第一种类似,但信号的基音映射到一个包含失真频率的频率范围。这种情况在调音应用中很常见,用户仍然想知道正在演奏哪个音符,即使它不在调上。`detect_note`的返回类型包括从音符名称偏移的音分、调音频率和其他有用信息。

use pitch_detector::{
    pitch::{hanned_fft::HannedFftDetector, PitchDetector},
    note::{detect_note},
};

let sample_rate = 44100.
let signal: Vec<f64> = ...;

let mut detector = HannedFftDetector::default();
let note = detect_note(
        &signal,
        &mut detector,
        sample_rate,
    )?;
assert_eq!(note.note_name, NoteName::A);

最后一种使用情况是带有提示的音符检测。到目前为止,前面的使用情况都是关于检测基频或音符。在这种情况下,我们向检测器提供提示,以便它可以检测到一个可能不是基音的频率。当信号中有多个频率(这很常见)时,这很有用,但你又想知道信号中是否包含特定的音符,以及这个特定音符的调准程度。

let sample_rate = 44100.
let mixed_signal: Vec<f64> = ... // mixed_signal contains multiple overlapping frequencies

let note = detector
        .detect_note_with_hint(
            NoteName::A,
            &mixed_signal,
            sample_rate,
        )?;
assert_eq!(note.note_name, NoteName::A);

请查看示例目录以获取更多信息。

测试

运行cargo pitch来运行所有功能的测试,并使用cargo benchmark别名以运行带有正确设置的功能的基准测试。

许可

MIT许可下授权。

依赖

~5–9MB
~145K SLoC