MKRZero mit ArduinoSound FFT hängt sich auf

Hallo!

Ich habe ein MKRZero Board und ein Adafruit I2S Mikrofon mit SPH0645LM4H angeschlossen.
Dort lasse ich die FFT aus der ArduinoSound Lib laufen und gebe die Werte der Bins über Serial aus.

Mein Problem liegt darin, dass sich das Programm/Board aufhängt, anscheinend wenn der Lautstärkepegel zu hoch ist.
Mitlerweile habe ich habe ich nur noch das Warten auf die fertige FFT, das übertragen der Bins in das Array und eine Wartezeit von 50ms.
Wenn ich nun in das Mikrofon hineinpuste, hängt sich das Programm beim Warten auf die nächste FFT auf.

Die Samplerate beträgt 24000, aber das Problem trat auch schon bei sehr viel geringeren Sampleraten auf. Die FFT größe beträgt 64.

Wie sind eure Erfahrungen mit ArduinoSound FFT hab ihr auch das Problem oder ein paar Tipps wie man das Problem lösen kann.

~Jens

#include <ArduinoSound.h>

// sample rate for the input
const int sampleRate = 24000;

// size of the FFT to compute
const int fftSize = 64;
// size of the spectrum output, half of FFT size
const int spectrumSize = fftSize / 2;

// array to store spectrum output
int spectrum[spectrumSize];

// create an FFT analyzer to be used with the I2S input
FFTAnalyzer fftAnalyzer(fftSize);

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);
  // setup the I2S audio input for the sample rate with 32-bits per sample
  if (!AudioInI2S.begin(sampleRate, 32)) {
    while (1); // do nothing
  }
  // configure the I2S input as the input for the FFT analyzer
  if (!fftAnalyzer.input(AudioInI2S)) {
    while (1); // do nothing
  }
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  // check if a new analysis is available
  if (fftAnalyzer.available()) { 
    // read the new spectrum
    digitalWrite(LED_BUILTIN, LOW);
    fftAnalyzer.read(spectrum, spectrumSize);

    delay(50);
    }
  }

Zum einen ist die ArduinoSound-Bibliothek immer noch als experimentell gekennzeichnet, was normalerweise heisst, dass es zu Instabilitäten kommen kann.
Zum anderen scheinst Du auch noch eine veraltete Version davon einzusetzen, denn die Konfigurations-Methode des FFTAnalyzers heisst in der aktuellen Version "configure" und nicht "input".

Ausserdem frage ich mich, wie Du merkst, dass sich das Programm aufhängt, wenn der FFTAnalyzer nämlich keine neuen Daten liefert, macht Deine Programm überhaupt nichts. Vielleicht solltest Du mal soviel Debugging einbauen, dass Du siehst, ob Dein Sketch überhaupt noch im loop() dreht.

Danke für den Tipp das die Lib nur experimentell ist, das war mir nicht bewusst.
Ich hatte sie nicht über die Bibliotheken-Verwaltung hinzugefügt.

Ich glaube aber nicht das es eine neuere Version gibt.
Sonst poste mir bitte den Link!!!
Über die Verwaltung bekomme ich auch nur die 0.1.0 .

Die Konfigurations-Methode ist "input", das steht auch offiziell in der Reference.
"configure" funktionier nicht.

Sie steht auch in meiner FFTAnalyzer.h als
protected:
virtual int configure(AudioIn* input);

aber durch C++ Vererbung Gedöns wird wohl iwie die aus der Mutterklasse AudioAnalyser.h

public:
int input(AudioIn& input);

genommen, oder wie auch immer. Irgendjemand weiß garantiert warum.

Ich habe zum weiteren Debuggen einen Pin als Output konfiguriert und setzte ihn vor der if-Schleife und rücksetzte ihn danach, so das wenn die loop() noch dreht, er getoggelt wird.

Wenn sich das Programm aufhängt leuchtet immer die BuiltinLED und der PortPin ist high.

Wenn sich die loop() noch drehen würde, stellt sich mir aber die Frage warum die FFT keine Daten mehr liefert. Ob vielleicht die Hardware des Mikrofon versagt oder sonstiges.

Des weiteren verstehe ich auch nicht ganz, warum der Sketch min 83% Programmspeicher belegt bei doch immerhin satten 256KB (-Bootloader) die zu Verfügung stehe.

Die Konfigurations-Methode ist "input", das steht auch offiziell in der Reference.
"configure" funktionier nicht.

Stimmt, mein Fehler. Die configure-Methode wird indirekt aufgerufen.

Wenn sich das Programm aufhängt leuchtet immer die BuiltinLED und der PortPin ist high.

Dann scheint er sich in der available()-Methode auszuruhen, was schlecht möglich ist, da diese nur eine Variable zurückgibt. Verwendest Du wirklich obigen Sketch und die Version 0.1.0 von ArduinoSound?
Ist das reproduzierbar so? Es könnte sein, dass sich die Interrupts vom I2S überschneiden (der nächste kommt an, bevor der aktuelle verarbeitet werden konnte). Welche Sampleraten hast Du denn schon versucht?

Was soll eigentlich das delay(50) bewirken?