Tymbal: sintetizador neural em um único chip
O Tymbal é um sintetizador polifônico em tempo real rodando em um único microcontrolador STM32N657 (Cortex-M55 + NPU Neural-ART). Ele usa uma rede neural TCN como refinador residual para adicionar caráter não linear a um esqueleto harmônico determinístico, tudo dentro de orçamentos de ciclo estritos e sem underruns. O projeto detalha otimização extensiva, desde transformações de grafo até gerenciamento de memória, alcançando o desempenho final em tempo real no dispositivo.
O Tymbal é um sintetizador polifônico em tempo real em uma única placa NUCLEO-N657X0-Q (STM32N657: Cortex-M55 a 800 MHz + NPU Neural-ART), controlado via teclado MIDI, com saída I2S-DAC. O áudio é calculado em blocos de 4 ms; a 800 MHz, isso equivale a 3,2 milhões de ciclos por bloco para tudo: vozes, síntese harmônica, rede neural, banco de filtros, detune, limitador, com zero underruns. A arquitetura usa um domínio de quatro sub-bandas PQMF (12 kHz cada) para reduzir o custo e dar à rede uma entrada compacta. O esqueleto harmônico é renderizado diretamente nas sub-bandas usando respostas de filtro complexas, com uma camada anti-chip-tune (auto-unison, bloom espectral, micro-drift). Uma TCN causal com 12 camadas, dilatações 1..32, C=88 canais, roda na NPU como um refinador residual, quantizada para int8 via PTQ. A percepção chave foi que uma rede treinada ingenuamente para previsão residual perde para um FIR linear de 520 coeficientes; a correção foi congelar a parte linear como uma 'camada zero' (pred = FIR(x) + net(x)), para que a rede aprenda apenas o residual não linear. Avaliação final: só o FIR dá +11,25 dB de supressão, FIR+net fp32 +17,16, int8 +16,89, com a rede contribuindo com +5,64 dB. Descobertas extensas durante o bring-up incluem conteúdo aleatório de ECC após reset, bancos AXISRAM desabilitados, problemas no caminho da NOR-flash, divisor de clock da NPU incorreto (400 em vez de 800 MHz) e um assert falso. A otimização de orçamento começou em 4,18M ciclos/bloco, finalmente alcançando 2,47M no pior caso de acorde, 0 underrun. As técnicas incluíram um loop de medição (QEMU vs ciclos da placa), perfilagem de épocas da NPU, pumping (chamadas NPU não bloqueantes intercaladas com renderização), mover tabelas quentes para DTCM e cópia de memória baseada em MVE para o anel de estado.
Fonte: Habr — хаб ML —
original
