Pull to refresh

Цветомузыка на базе ПЛИС

DIY
Sandbox

Цветомузыка или разработка трехполосного спектроанализатора реального времени с применением вейвлет-анализа на базе ПЛИС.


Однажды папа показал мне созданную им аналоговую цветомузыку. Три прожектора весело мигали четко под музыку, каждый настроен на свой диапазон частот, и четвертый прожектор загорался только тогда, когда какой-либо из прожекторов погасал, чтобы в комнате не было темно в затишье. Потом что-то в ней сломалось, и лежала она пылилась добрый десяток лет на полке. Поскольку я очень люблю слушать музыку, и у меня остались яркие воспоминания о цветомузыке, мне очень хотелось ее воскресить и насладиться миганием прожекторов под любимые ритмы. Ну и, разумеется, использовать высокие технологии для реализации задуманного…




Так как я работаю в фирме занимающейся обработкой цифровых и аналоговых сигналов на базе ПЛИС, идея возникла сама собой. Я решил создать «числомолотилку», которая бы в реальном времени гоняла аудио сигнал по трем фильтрам, настроенным на три диапазона частот. Поискав в интернете какие диапазоны частот используют в создании цветомузыки (ибо тема эта довольно-таки старая), я нашел следующее:
НЧ: 40 – 110 Гц
СЧ: 1000 – 5000 Гц
ВЧ: 10000 – 18000 Гц
В качестве фильтров мной было изучено вейвлет-преобразование, которым занимается фирма, и я получил три набора коэффициентов, с которыми производил свертку данных с АЦП с частотой дискретизации 3 МГц. АЧХ фильтров показаны на рисунке:



Схема получившегося проекта следующая:



В качестве процессора я использовал Forth-процессор, созданный в этой же фирме, поэтому я прекрасно умею с ним работать. В аппаратной части были созданы блоки памяти с коэффициентами фильтров, блок чтения данных с АЦП, реализована свертка данных АЦП и коэффициентов фильтров, а так же блок с ШИМом для светодиодов. Все это дело было подключено к процессору, откомпилировано и зашито в Spartan-3 XC3S400.

Далее я начал писать программу для процессора, которая бы занималась необходимой мне целью – считавала результаты свертки (амплитуду сигнала на определенных частотах) и полученные значения подавала бы на ШИМ светодиодов. Результаты свертки получались правильными, но светодиоды почему-то постоянно горели и затухали только тогда, когда музыка почти стихала. Я начал разбираться и понял, что яркость свечения светодиода зависит от порога ШИМа не линейно, а логарифмически. То есть, если у меня 1024-разрядный ШИМ, то чтобы плавно изменить яркость светодиода от самого тусклого к самому яркому мне пришлось последовательно брать такие числа порога ШИМа: 0, 15, 31, 63, 127, 255, 511, 1023. Таким образом, я получил 8 разных степеней свечения светодиода, и этого мне вполне хватило. И после подгона результатов свертки под эти числа порога цветомузыка заработала так, как мне хотелось. Далее я написал логику работы пассивного канала. Примерная его работа такова, что когда какой-либо из каналов затухает, этот пассивный светодиод начинает набирать яркость. Таким образом, в комнате никогда не будет совсем темно. Я написал так же авторегулировку чувствительности – при изменении громкости музыки программа сама увеличивает или уменьшает коэффициент, который умножается на результат свертки с фильтров. Так же я написал программу на Delphi, которая общается с платой по COM-порту RS-232 и может в режиме реального времени строить графики по всем каналам, и так же изменять значения некоторых внутренних переменных в качестве тонкой настройки. Все эти настройки можно записать на флешку EEPROM 93C86, которая была припаяна на выданной мне плате. Внешний вид программы:



Когда это всё заработало, нужно было создавать силовую часть. В качестве перехода к силовой части я использовал оптотиристоры Т0125-12,5:



У этих элементов 4 вывода: 2 из них это обычный светодиод, а другие два являются силовым ключем. Можно догадаться, что когда светодиод горит, то два силовых вывода замыкаются, и наоборот. Я продублировал в аппаратной части своего проекта каналы ШИМа и подключил их к выводам оптотиристоров (правда пришлось инвертировать ШИМ для этих каналов из-за обратной логики работы оптотиристоров), развел небольшую платку для силовой части, чтобы подключить прожекторы.



Все заработало с первого раза, и работает до сих пор. В качестве прожекторов используются обычные лампочки 220В.



Впоследствии я решил еще добавить на панель цветомузыки два analog meter’а на два канала, сделал им красивую зеленую подсветку и в результате получилась такая вот коробочка:



Ну а внутри все это выглядит так:



Можете посмотреть видео работы цветомузыки, но учтите, что там все мигает гораздо реже, нежели на самом деле.



Файл прошивки для Spartan-3 XC3S400-4tq144 а так же программа на Delphi с исходниками тут. Печатные платы выложу чуть позже. Этого комплекта хватит тем, кто всерьез захочет собрать себе такую же систему. =)
Tags:цветомузыкаПЛИСспектроанализаторфильтр
Hubs: DIY
Total votes 43: ↑39 and ↓4 +35
Views11.3K
Data analyst
from 70,000 to 120,000 ₽ГдеМатериалRemote job
Разработчик программного обеспечения авионики
from 60,000 ₽Котлин-НоваторСанкт-Петербург
Маркетолог проектов (стажёр)
from 40,000 to 60,000 ₽DeneroСанкт-Петербург
Laravel backend
from 100,000 ₽MCITYRemote job