AplicacionesHardware e Inferencia 🇷🇺 14.08.2026 14:04

Tymbal: sintetizador neuronal en un solo chip

Tymbal es un sintetizador polifónico en tiempo real que se ejecuta en un solo microcontrolador STM32N657 (Cortex-M55 + NPU Neural-ART). Utiliza una red neuronal TCN como refinador residual para agregar carácter no lineal a un esqueleto armónico determinista, todo dentro de estrictos ciclos de presupuesto y sin underruns. El proyecto detalla una extensa optimización, desde transformaciones de gráficos hasta gestión de memoria, logrando el rendimiento final en tiempo real en el dispositivo.
Tymbal es un sintetizador polifónico en tiempo real que funciona en una única placa NUCLEO-N657X0-Q (STM32N657: Cortex-M55 a 800 MHz + NPU Neural-ART), controlado mediante teclado MIDI, con salida DAC a través de I2S. El audio se calcula en bloques de 4 ms; a 800 MHz eso supone 3,2 millones de ciclos por bloque para todo: voces, síntesis armónica, red neuronal, banco de filtros, detune, limitador, sin underruns. La arquitectura utiliza un dominio de cuatro subbandas PQMF (12 kHz cada una) para reducir el coste y dar a la red una entrada compacta. El esqueleto armónico se renderiza directamente en subbandas utilizando respuestas de filtro complejas, con una capa anti-chiptune (auto-unison, bloom espectral, micro-drift). Una TCN causal con 12 capas, dilataciones de 1 a 32, C=88 canales, se ejecuta en la NPU como refinador residual, cuantizada a int8 mediante PTQ. La idea clave fue que una red entrenada ingenuamente para predicción residual pierde frente a un FIR lineal de 520 coeficientes; la solución fue congelar la parte lineal como una 'capa cero' (pred = FIR(x) + net(x)), de modo que la red solo aprende el residuo no lineal. Evaluación final: solo FIR da una supresión de +11,25 dB, FIR+red en fp32 +17,16, int8 +16,89, contribuyendo la red con +5,64 dB. Los hallazgos durante la puesta a punto incluyen contenido aleatorio de ECC tras el reset, bancos AXISRAM deshabilitados, problemas en la ruta de la NOR-flash, divisor de reloj de la NPU incorrecto (400 en lugar de 800 MHz) y un assert falso. La optimización del presupuesto comenzó en 4,18M ciclos por bloque, y finalmente se lograron 2,47M en el peor caso de acorde, sin underruns. Las técnicas incluyeron un bucle de medición (QEMU frente a ciclos de la placa), perfilado de épocas de la NPU, pumping (llamadas no bloqueantes a la NPU intercaladas con el renderizado), mover tablas calientes a DTCM y copia de memoria basada en MVE para el anillo de estado.
Fuente: Habr — хаб ML — original
Nuestros artículos anteriores sobre este tema ↓
Noticias frescas