Tymbal: Neuraler Synthesizer auf einem einzigen Chip
Tymbal ist ein Echtzeit-polyphoner Synthesizer, der auf einem einzigen STM32N657-Mikrocontroller (Cortex-M55 + Neural-ART NPU) läuft. Er verwendet ein TCN-neuronales Netz als residualen Verfeinerer, um einem deterministischen harmonischen Gerüst nichtlinearen Charakter zu verleihen, und das innerhalb strenger Zyklusbudgets und ohne Unterbrechungen. Das Projekt dokumentiert umfangreiche Optimierungen, von Graphtransformationen bis zum Speichermanagement, um die endgültige Echtzeitleistung auf dem Gerät zu erreichen.
Tymbal ist ein polyphoner Echtzeit-Synthesizer auf einem einzelnen NUCLEO-N657X0-Q-Board (STM32N657: Cortex-M55 bei 800 MHz + Neural-ART NPU), gesteuert über eine MIDI-Tastatur, mit I2S-DAC-Ausgang. Das Audio wird in 4-ms-Blöcken berechnet; bei 800 MHz sind das 3,2 Millionen Zyklen pro Hop für alles: Stimmen, harmonische Synthese, neuronales Netz, Filterbank, Detune, Limiter, mit null Unterläufen. Die Architektur verwendet eine PQMF-Vier-Teilband-Domäne (je 12 kHz), um die Kosten zu senken und dem Netzwerk eine kompakte Eingabe zu geben. Das harmonische Skelett wird direkt in Teilbänder mit komplexen Filterantworten gerendert, mit einer Anti-Chipmunk-Schicht (Auto-Unison, spektrale Blüte, Mikro-Drift). Ein kausales TCN mit 12 Schichten, Dilatationen 1..32, C=88 Kanälen läuft auf der NPU als residueller Verfeinerer, quantisiert auf int8 über PTQ. Die wichtigste Erkenntnis war, dass ein Netzwerk, das naiv auf Restvorhersage trainiert wurde, gegen ein lineares FIR mit 520 Koeffizienten verliert; die Lösung bestand darin, den linearen Teil als 'Null-Schicht' einzufrieren (pred = FIR(x) + net(x)), sodass das Netzwerk nur den nichtlinearen Rest lernt. Endgültige Auswertung: FIR allein ergibt +11,25 dB Unterdrückung, FIR+Netz fp32 +17,16, int8 +16,89, wobei das Netzwerk +5,64 dB beiträgt. Umfangreiche Erkenntnisse aus der Inbetriebnahme umfassen zufällige ECC-Inhalte nach dem Reset, deaktivierte AXISRAM-Bänke, Probleme mit dem NOR-Flash-Pfad, falschen NPU-Taktteiler (400 statt 800 MHz) und eine fehlerhafte Assertion. Die Budgetoptimierung startete bei 4,18 Millionen Zyklen pro Hop und erreichte schließlich 2,47 Millionen im schlechtesten Fall eines Akkords, mit null Unterläufen. Zu den Techniken gehörten eine Messschleife (QEMU gegen Board-Zyklen), NPU-Epochen-Profiling, Pumping (nicht blockierende NPU-Aufrufe im Wechsel mit dem Rendern), Verschieben heißer Tabellen in den DTCM und ein MVE-basierter Speicherkopiervorgang für den Zustandsring.
Quelle: Habr — хаб ML —
Original
