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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.