qdft 0.1.0

Constant-Q Sliding DFT
Documentation
use qdft::QDFT;

use ndarray::Array1 as Vector;
use ndarray::Array2 as Matrix;
use ndarray_npy::write_npy;

#[allow(non_camel_case_types)]
type c64 = num::complex::Complex<f64>;

fn phase(t: &Vector<f64>, f: &Vector<f64>) -> Vector<f64>
{
    let pi = std::f64::consts::PI;
    let mut cs = Vector::<f64>::zeros(t.len());

    for i in 1 .. t.len() {
        let dt = t[i] - t[i - 1];
        let dp = 2.0 * pi * f[i] * dt;
        cs[i] = dp + cs[i - 1];
    }

  return cs;
}

fn main() {
    let samplerate = 44100.0;
    let bandwidth = (50.0, samplerate / 2.0);
    let resolution = 24.0;
    let latency = 0.0;
    let window = Some((0.5, -0.5));

    let mut qdft = QDFT::new(
        samplerate,
        bandwidth,
        resolution,
        latency,
        window);

    let n = 1 * samplerate as usize;
    let m = qdft.size();

    let t = Vector::<f64>::range(0.0, n as f64, 1.0) / samplerate;
    let f = Vector::<f64>::ones(n) * 1000.0;

    let x = phase(&t, &f).mapv_into(|v|v.sin());
    let mut y = Matrix::<c64>::zeros((n, m));

    qdft.qdft(x.as_slice().unwrap(), y.as_slice_mut().unwrap());

    let npy = std::path::Path::new("examples").join("analysis.npy");
    let error = format!("Unable to create {}!", npy.to_str().unwrap());

    write_npy(npy, &y).expect(error.as_str());
}