#pitch #detection #sound #frequency

no-std pitch-detection

A collection of algorithms to determine the pitch of a sound sample

3 releases (breaking)

0.3.0 Jun 30, 2022
0.2.0 Nov 13, 2020
0.1.0 Mar 17, 2019

#400 in Audio

Download history 61/week @ 2024-08-26 93/week @ 2024-09-02 66/week @ 2024-09-09 85/week @ 2024-09-16 154/week @ 2024-09-23 73/week @ 2024-09-30 10/week @ 2024-10-07 52/week @ 2024-10-14 17/week @ 2024-10-21 24/week @ 2024-10-28 91/week @ 2024-11-04 19/week @ 2024-11-11 98/week @ 2024-11-18 76/week @ 2024-11-25 100/week @ 2024-12-02 157/week @ 2024-12-09

435 downloads per month

MIT/Apache

1MB
668 lines

workflow status crates.io

pitch_detection

Usage

use pitch_detection::detector::mcleod::McLeodDetector;
use pitch_detection::detector::PitchDetector;

fn main() {
    const SAMPLE_RATE: usize = 44100;
    const SIZE: usize = 1024;
    const PADDING: usize = SIZE / 2;
    const POWER_THRESHOLD: f64 = 5.0;
    const CLARITY_THRESHOLD: f64 = 0.7;

    // Signal coming from some source (microphone, generated, etc...)
    let dt = 1.0 / SAMPLE_RATE as f64;
    let freq = 300.0;
    let signal: Vec<f64> = (0..SIZE)
        .map(|x| (2.0 * std::f64::consts::PI * x as f64 * dt * freq).sin())
        .collect();

    let mut detector = McLeodDetector::new(SIZE, PADDING);

    let pitch = detector
        .get_pitch(&signal, SAMPLE_RATE, POWER_THRESHOLD, CLARITY_THRESHOLD)
        .unwrap();

    println!("Frequency: {}, Clarity: {}", pitch.frequency, pitch.clarity);
}

Live Demo

Demo Page Source

Documentation

LaTeX formulas can be used in documentation. This is enabled by a method outlined in rust-latex-doc-minimal-example. To build the docs, use

cargo doc --no-deps

The --no-deps flag is needed because special headers are included to auto-process the math in the documentation. This header is specified using a relative path and so an error is produced if cargo tries generate documentation for dependencies.

Dependencies

~3MB
~57K SLoC