Skip to content

Question: How do we use buffer from Arduino to process through specflux?  #400

@Piyussh01

Description

@Piyussh01

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
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions