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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions