add comments to project rs
This commit is contained in:
parent
fba6ccacdb
commit
aac7065340
@ -16,6 +16,7 @@ use microbit::{
|
|||||||
gpio::{p0::P0_05, Floating, Input},
|
gpio::{p0::P0_05, Floating, Input},
|
||||||
saadc::SaadcConfig,
|
saadc::SaadcConfig,
|
||||||
timer::Timer,
|
timer::Timer,
|
||||||
|
timer::Timer,
|
||||||
Saadc,
|
Saadc,
|
||||||
},
|
},
|
||||||
pac::TIMER1,
|
pac::TIMER1,
|
||||||
@ -27,9 +28,8 @@ use ordered_float::NotNan;
|
|||||||
use panic_rtt_target as _;
|
use panic_rtt_target as _;
|
||||||
use rtt_target::{rprintln, rtt_init_print};
|
use rtt_target::{rprintln, rtt_init_print};
|
||||||
|
|
||||||
// Microbit-spectrum
|
// Microbit-spectrum ported constants
|
||||||
const FFT_WIDTH: usize = 64;
|
const FFT_WIDTH: usize = 64;
|
||||||
/// ADC is signed; it is configured for a sample precision of 10 bits. Must match below.
|
|
||||||
const ADC_MAX: usize = 512;
|
const ADC_MAX: usize = 512;
|
||||||
|
|
||||||
const NOTES: [&str; 12] = [
|
const NOTES: [&str; 12] = [
|
||||||
@ -96,6 +96,7 @@ const NOTE_IMAGE_BITMAPS: [[[u8; 5]; 5]; 7] = [
|
|||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Read FFT-WIDTH numer of samples from the saadc channel. Collect these sequentially and return the array
|
||||||
fn read_samples(saadc: &mut Saadc, mic_in: &mut P0_05<Input<Floating>>) -> [i16; FFT_WIDTH] {
|
fn read_samples(saadc: &mut Saadc, mic_in: &mut P0_05<Input<Floating>>) -> [i16; FFT_WIDTH] {
|
||||||
let mut result = [0; FFT_WIDTH];
|
let mut result = [0; FFT_WIDTH];
|
||||||
for r in &mut result {
|
for r in &mut result {
|
||||||
@ -104,7 +105,7 @@ fn read_samples(saadc: &mut Saadc, mic_in: &mut P0_05<Input<Floating>>) -> [i16;
|
|||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Microbit-spectrum - read function
|
// Adapted from Microbit-spectrum - `fn spectrum`
|
||||||
fn samples_to_freq(
|
fn samples_to_freq(
|
||||||
samples: [i16; FFT_WIDTH],
|
samples: [i16; FFT_WIDTH],
|
||||||
window: [f32; FFT_WIDTH],
|
window: [f32; FFT_WIDTH],
|
||||||
@ -133,11 +134,15 @@ fn samples_to_freq(
|
|||||||
*freqs
|
*freqs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When complete, getting the dominant frequency should be about as follows:
|
||||||
|
// 1) window the data in a sensible way
|
||||||
|
// 2) Take an FFT of the window
|
||||||
|
// 3) Identify the fft frequency with the largest magnitude in the window and return it
|
||||||
fn get_dominant_freq(_freqs: [Complex<f32>; FFT_WIDTH / 2]) -> f32 {
|
fn get_dominant_freq(_freqs: [Complex<f32>; FFT_WIDTH / 2]) -> f32 {
|
||||||
// todo!();
|
|
||||||
0.0
|
0.0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Simple frequencry to rounded note/octave value
|
||||||
fn get_note(freq: f32) -> (usize, f32) {
|
fn get_note(freq: f32) -> (usize, f32) {
|
||||||
if freq > 0.0 {
|
if freq > 0.0 {
|
||||||
let note_num = log2f(freq / 440.0) * 12.0;
|
let note_num = log2f(freq / 440.0) * 12.0;
|
||||||
@ -148,6 +153,7 @@ fn get_note(freq: f32) -> (usize, f32) {
|
|||||||
(0, 0.0)
|
(0, 0.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the pre-defined base image, which matches the offset of the node
|
||||||
fn get_image(noctive: (usize, f32)) -> [[u8; 5]; 5] {
|
fn get_image(noctive: (usize, f32)) -> [[u8; 5]; 5] {
|
||||||
let (note, _octive) = noctive; // TODO - Add octive and flat modifier to display
|
let (note, _octive) = noctive; // TODO - Add octive and flat modifier to display
|
||||||
if note > 0 {
|
if note > 0 {
|
||||||
@ -171,7 +177,7 @@ fn init() -> ! {
|
|||||||
|
|
||||||
let _ = mic_run.set_high();
|
let _ = mic_run.set_high();
|
||||||
|
|
||||||
let saadc_config: SaadcConfig = SaadcConfig::default();
|
let saadc_config: SaadcConfig = SaadcConfig::default(); // Testing may show that more explicit Saadc configuration is needed
|
||||||
let mut saadc: Saadc = Saadc::new(board.ADC, saadc_config);
|
let mut saadc: Saadc = Saadc::new(board.ADC, saadc_config);
|
||||||
|
|
||||||
|
|
||||||
@ -186,10 +192,10 @@ fn init() -> ! {
|
|||||||
let samples: [i16; FFT_WIDTH] = read_samples(&mut saadc, &mut mic_in);
|
let samples: [i16; FFT_WIDTH] = read_samples(&mut saadc, &mut mic_in);
|
||||||
let freqs: [Complex<f32>; FFT_WIDTH / 2] = samples_to_freq(samples, window);
|
let freqs: [Complex<f32>; FFT_WIDTH / 2] = samples_to_freq(samples, window);
|
||||||
let dominant_freq: f32 = get_dominant_freq(freqs);
|
let dominant_freq: f32 = get_dominant_freq(freqs);
|
||||||
let noctive: (usize, f32) = get_note(dominant_freq); //note + octive tuple
|
let noctive: (usize, f32) = get_note(dominant_freq); //noctive = note + octive tuple
|
||||||
let bitmap: [[u8; 5]; 5] = get_image(noctive);
|
let bitmap: [[u8; 5]; 5] = get_image(noctive);
|
||||||
DISPLAY.with_lock(|display: &mut Display<TIMER1>| {
|
DISPLAY.with_lock(|display: &mut Display<TIMER1>| {
|
||||||
display.show(&BitImage::new(&bitmap)); // XXX Not the most memory efficient - Improve
|
display.show(&BitImage::new(&bitmap)); // A better place can be found for the new constructor
|
||||||
});
|
});
|
||||||
rprintln!("{}", NOTES[noctive.0]);
|
rprintln!("{}", NOTES[noctive.0]);
|
||||||
timer.delay(400);
|
timer.delay(400);
|
||||||
|
Reference in New Issue
Block a user