-
Notifications
You must be signed in to change notification settings - Fork 412
Open
Description
I'm trying to use Aubio's specflux function to process real time audio using an Arduino Nano's inbuilt mic. I'm not sure where I'm going wrong below, I would appreciate any inputs!
#include <aubio.h>
#include <PDM.h>
//Nano's inbuilt mic -> The MP34DT05 microphone sensor.
//documentation on it - https://docs.arduino.cc/tutorials/nano-33-ble-sense/microphone-sensor/
//it works on PDM(Pulse-density modulation)
/* specs of mic:
Signal-to-noise ratio: 64dB
Sensitivity: -26dBFS ±3dB
Temperature range: -40 to 85°C
https://docs.arduino.cc/learn/built-in-libraries/pdm/
*/
#define SAMPLE_RATE 44100
#define FFT_SIZE 512
#define BUFFER_SIZE 128 // Adjust according to your needs aka hop size
short sampleBuffer[256];
volatile int samplesRead;
int adcPin = A0;
aubio_fft_t *fft_processor;
fvec_t *input_buffer;
cvec_t *fft_result;
aubio_specdesc_t *specdesc;
fvec_t *flux;
aubio_source_t *s;
uint_t hop_size ;
uint_t win_size;
uint_t samplerate;
void setup() {
Serial.begin(9600);
PDM.onReceive(onPDMdata);
if (!PDM.begin(1, 16000)) {
Serial.println("Failed to start PDM!");
while (1);
}
fft_processor = new_aubio_fft(FFT_SIZE);
input_buffer = new_fvec(FFT_SIZE);
fft_result = new_cvec(FFT_SIZE);
specdesc = new_aubio_specdesc("specflux", FFT_SIZE);
flux = new_fvec(1);
if (!fft_processor || !input_buffer || !fft_result || !specdesc || !flux) {
Serial.println("Failed to initialize FFT or spectral flux structures");
while (1); // Halt if initialization fails
}
}
void loop() {
int bytesAvailable = PDM.available();
PDM.read(sampleBuffer, bytesAvailable);
for (int i = 0; i < 256; i++) {
//buffer[i] = analogRead(adcPin) - 512; // Assuming 10-bit ADC, centering around 0
Serial.println(sampleBuffer[i]); //arduino's raw input print
}
if (samplesRead == FFT_SIZE) {
for (int i = 0; i < FFT_SIZE /2; i++) {
fvec_set_sample(input_buffer, (float)sampleBuffer[i] / 32768.0f, i);
}
}
aubio_fft_do(fft_processor, input_buffer, fft_result);
aubio_specdesc_do(specdesc, fft_result, flux);
Serial.print("Spectral Flux: ");
Serial.println(flux->data[0]);
samplesRead = 0; //this is to reset count after processing..
}
void onPDMdata() {
int bytesAvailable = PDM.available();
PDM.read(sampleBuffer, bytesAvailable); // read into the sample buffer
samplesRead = bytesAvailable / 2; // 16-bit, 2 bytes per sample
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels