Мы можем анализировать и синтезировать звук в реальном времени, используя БПФ (быстрое преобразование Фурье).
Реализация БПФ на 64 точки (ассемблерная оптимизация):
assembly
.global fft64
; Быстрое преобразование Фурье на 64 точки
; Вход: массив R16:R17 (в SRAM)
; Выход: массив в SRAM
fft64:
PUSH R0
PUSH R1
; ... реализация алгоритма Кули-Тьюки
; Используем бит-реверсивное упорядочивание
; Вычисляем бабочки на каждом этапе
POP R1
POP R0
RET
Использование в C++ для визуализации звука:
extern "C" {
void fft64(int16_t* data);
}
int16_t audio_buffer[64];
void setup() {
// Настройка ADC для сэмплирования звука
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
}
void loop() {
// Заполняем буфер
for (int i = 0; i < 64; i++) {
audio_buffer[i] = analogRead(A0) - 512; // Центрируем
delayMicroseconds(100);
}
// Выполняем БПФ (на ассемблере!)
fft64(audio_buffer);
// Выводим результат (например, на дисплей)
for (int i = 0; i < 32; i++) {
display.drawLine(i, 32, i, 32 - audio_buffer[i] / 16);
}
}