Forum: Mikrocontroller und Digitale Elektronik ESP32 WAV-Player: Praxiswert der CPU-Geschwindigkeit gesucht


von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Moin.

Ich habe mal eine Frage zur Geschwindigkeit eines ESP32:

Wenn man mehrere Audio-Streams in eine Datei auf einer SD-Karte packen 
möchte, was schafft der ESP32 an Daten zu lesen, zu splitten und dadurch 
einen dieser Streams über sein I2S Audio-Interface auszugeben?

Angenommen, man nimmt zwei Streams mit 48kHz 16bit Stereo, dann kommt 
einer davon auf 48.000 x 2bytes (16bit) x 2 Kanäle = 192kbyte/s. Mal 
zwei Streams sind das schon 384kbyte/s. Wenn man die Streams in Frames 
zu sagen wir 25ms aufteilt, sind das 4,8kbyte Audio-Daten pro Stream 
(zwei Streams 9,6kbyte), aber man muss pro Sekunde 40 dieser Frames an 
das I2S-Interface schicken.

Bevor ich das nun ausprobiere und am Ende enttäuscht feststelle, daß es 
nicht geht, frage ich lieber mal nach: Ist der ESP32 schnell genug, 
40mal pro Sekunde 9,6kbyte aus einer Datei von einer SD-Karte zu lesen, 
daraus 4,8kbyte Daten zu extrahieren und diese an das I2S-Interface zu 
schicken? Es wäre schön, wenn jemand da Erfahrungswerte aus der Praxis 
hat.

Alle Bibliotheken, die ich dazu auf die Schnelle gefunden habe, benutzen 
irgendwelche Subroutinen, die das Lesen der Daten von der SD-Karte und 
die Ausgabe auf dem I2C-Interface alles alleine machen. Das ist 
natürlich super simpel, bietet aber nicht die Möglichkeit, eigene 
Datenformate zu nutzen und schleust alle Daten wenn man das so sagen 
möchte, an der CPU vorbei.

Ich würde das gerne mit der Arduino-Plattform probieren, gibts da 
entsprechende Funktionen, um die DMA-Fähigkeit des I2C-Interfaces zu 
nutzen bzw. einen Audio-Puffer unterbrechungsfrei aufzufüllen, so daß es 
zu keinen Störgeräuschen beim Audio kommt?

Etwas ähnliches hatte ich vor langer Zeit schon mit dem 486er bzw. 
Pentium und einer Soundblaster-Karte probiert, einen eigenen WAV-Player 
zu basteln. Da waren die Frames am Ende glaube ich 64kbyte lang und die 
Soundkarte hat sich die Daten per DMA geholt, aber der Rechner war trotz 
Assembler nicht schnell genug, am Ende eines DMA-Transfers neue Daten in 
den Puffer zu schreiben und einen neuen DMA-Transfer zu starten. Das 
führte zu Störgeräuschen durch die kurze Pause und man musste den 
DMA-Transfer so konfigurieren, daß er automatisch wiederholt wird und 
dann immer eine Hälfte des Puffers updaten während die andere abgespielt 
wurde. Keine Ahnung, ob der ESP32 was ähnliches kann, so daß die Daten 
unterbrechungsfrei zum I2S-Interface kommen, obwohl sie in Stücken in 
den Puffer kopiert werden.

von Richie (mikro123)


Lesenswert?

Grundsätzlich, also mit ESP-IDF, ist das gar kein Problem.
Mit Arduino kenne ich mich nicht aus, aber da muss man halt darauf 
achten, dass man keine der doch häufiger vorkommenden schlechten 
Bibliotheken benutzt.

Du hast aber nicht geschrieben, ob die Hardware bereits vorgegeben ist 
oder noch ausgewählt werden kannst. Da gibt es dann natürlich auch noch 
Stellschrauben:
- Ist der ursprüngliche ESP32 gemeint oder kann es auch ein ESP32-S3 
oder ESP32-P4 sein?
- Wird PSRAM als Puffer genutzt?
- Falls ja, mit welcher Taktfrequenz läuft der PSRAM (bei P4 bis zu 
200MHz)?
- Wie ist die SD-Karte angeschlossen (SPI, 1Bit, 4Bit)

Ich denke, selbst im ungünstigsten Fall sollte das reichen, aber wenn Du 
noch die Hardware auswählen kannst, dann musst Du Dir sowieso keine 
Gedanken machen.

von Harald K. (kirnbichler)


Lesenswert?

Der potentielle Flaschenhals dürfte die SD-Karte sein. Zwar versprechen 
deren Hersteller Wunderdinge in Sachen Geschwindigkeit, die harte 
Realität sieht aber meist sehr anders aus - und hier kommt die Anbindung 
der SD-Karte nochmal ganz deutlich zum Tragen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.