BIOS написал(а):Interestingly, the SDK seems to have a DAC_GET_ENERGY function, but the chip doesn't have a hardware FFT; it only appeared with the 695 series.
I tried various approaches, but software calculations put a significant load on the processor even at 240 MHz, which was noticeable by the system lag.
Clearly, I wrote crappy code there without any optimization... But I'm still curious how it works on the 692.
I figured it out on the 695 a long time ago.
Ого, очень плавно получилось! Для WS2812 и аппаратного FFT на 695 выглядит вообще отлично)) Я тоже немного поигрался со спектром на AC692.
Да, насколько я понимаю, в 692 аппаратного FFT нет. В моём варианте `DAC_GET_ENERGY` не используется: он был бы хорош для обычного VU-индикатора общей громкости, но не даёт отдельные полосы частот.
Я беру PCM уже после декодера, прямо перед отправкой в DAC. В аудиопотоке сохраняю только каждый 4-й 16-битный сэмпл в кольцевой буфер на 256 значений — это очень лёгкая часть. Сам FFT не выполняется в аудио-обработчике: он считается только при обновлении LCD, примерно 20 раз в секунду.
Дальше:
- 256-точечный radix-2 FFT на целых числах Q15, без float;
- окно Hann перед FFT, чтобы меньше было утечки между полосами;
- снимок PCM-буфера копируется быстро и атомарно, а тяжёлые расчёты идут уже вне critical section;
- для 10 столбиков берутся нужные FFT bins с учётом текущей частоты дискретизации;
- есть медленная нормализация/AGC для каждой полосы, отдельные display-gain для верхов и peak-hold на LCD.
То есть это не идеальный аудио-анализатор, а лёгкий визуальный spectrum для маленького 128x64 LCD. Точный профайлинг CPU я ещё не делал, поэтому не буду говорить, что нагрузка нулевая, но на моём 692 система и Bluetooth-музыка работают нормально. На 695 с аппаратным FFT, конечно, можно сделать заметно чище и ещё плавнее.
- Подпись автора
Türkiye