А что вы думаете по поводу уменьшения числа символов спектра, но при этом более равномерном в плане октав выводе по частотам?
Поясню, что я имею в виду.
Анализ Фурье в проекте делается из расчета 1024 точек (сэмплов) на частоте 20кГц. В результате получается 512 частотных полос на звуковой диапазон 10кГц, или около 20Гц на один "столбик".
Особенность преобразования Фурье в том, что этот ряд равномерный, что для человека не очень подходит. Частота 20 Гц отличается от частоты 40Гц вдвое (на октаву), а это всего лишь соседние столбики. И наоборот, такие же соседние столбики будут для частот 9960Гц и 9980Гц, но для человека услышать такую малую относительную разницу нереально.
Для некоторой минимизации этого эффекта в проекте эти 512 полос ужимаются до 128. Низкие частоты используются один к одному, а чем ближе к ВЧ, тем больше исходных полос формируют одну выходную. Получается, что низкочастотная часть спектра на экране немножко раздвигается правее, ужимая высокочастотную. В итоге спектр становится более "октавным" и зрительно более приятным для человека.
Но всё равно, 512 полос полноценных "октавных" 128 не получишь. Тут надо либо больше отсчётов брать, например, 4096, либо выходных полос меньше делать. Первое нереально из-за нехватки ОЗУ, а вот второе - вполне себе вариант.
Я сейчас разрабатываю для себя похожий девайс на OLED 3.12", 256x64, и применил в нем такой подход. Получилось для вывода 43 столбика шириной 4px и промежутком 2px, идеально выписавшихся в ширину экрана. И 512 полос, ужавшись до 43, дали визуально неплохой эффект, на мой взгляд. Спектр выглядит более равномерно.
Вот я и думаю, не применить ли тот же принцип и в этом, "родительском", проекте... Тем более, что и ОЗУ сэкономится (меньше хранить пиков сигнала и прочего нужного только для отрисовки спектра).
Обладатели 480x320 дисплеев могут посмотреть, как это может выглядить, взяв код
отсюда. Под другие разрешения дополнительно подкрутите шаг и ширину столбцов в canvas.c под себя:
Код: Выделить всё
const int16_t step = 11; // Step of columns
const int16_t colW = 7; // Column width
, с тем, чтобы в ширину дисплея укладывалось примерно 40..44 столбиков. В примере 11 * 44 = 484 - идеально для 480 ширины, т.к. недостающие 4 пиксела приходятся как раз на ненужный зазор (11 - 7)
Основная сложность - в том, что под каждый экран нужно чуть по-своему это делать - немного скучно это.