8-канальная светомузыка на STM32F030F4

Т.к. тема довольно популярна, выкладываю проект 8-канального контроллера.



Контроллер — 20-pin STM32F030F4 (16K Flash, 4K RAM).
Тактовая частота — 48МГц, частота выборок АЦП — 16кГц, выходы — 8 каналов 16-битного ШИМа (на таймерах 1/3).

Вх.сигнал захватывается 9м каналом АЦП (PB1), для удаления пост.смещения пропускается через ФВЧ (т.н. DC-blocking фильтр).

Захваченные в буфер 256 семплов умножаются на окно Хэмминга, вычисляется 16-битное БПФ (получаем спектр из 128 частот 62.5..8000Гц с шагом 62.5Гц), из комплексных значений вычисляются амплитуды.



Синус 1КГц, после накопления в буфере:


После умножения на окно:


Результат вычисления БПФ и амплитуд:


Вторая половина спектра (выше частоты Найквиста) — зеркальное отображение первой, не используется:


Для нормализации отображения спектра частоты разбиты на 8 групп по 1,1,2,4,8,16,32,64 частот.



Ритм-детектор (beat-detector)

Для выделения ритма сигнал обрабатывается простейшими фильтрами прямо в прерывании АЦП:

1. Входной сигнал:

2. Удаление смещения ( y[i] = x[i] — x[i-1] + 0.995 * y[i-1] ):

3. Выпрямление ( y[i] = abs( x[i] ) ):

4. Формирование огибающей с помощью ФНЧ ( y[i] = a * x[i] + (1 — a) * y[i-1], a = 0.0005 ):

5. Выделение фронтов с помощью ФВЧ ( y[i] = a * ( y[i-1] + x[i] — x[i-1] ), a = 0.2 ):

6. Выпрямитель + пиковый детектор:

7. Удаление смещения:

8. Расширение импульсов (пиковый детектор):

9. Удаление шума (обнуление всех точек, лежащих ниже заданного порога):




Заливка — через RS232, stm32flash (make flash).
В аттаче — проект с исходниками (ARM-GCC/Eclipse).

Также прошивка на 6 частотных каналов (2xRGB) + общий уровень + импульсный.

Возможное развитие:
  • пиковый детектор и AGC;
  • управление по DMX512;
  • детектор перехода 0 для управления сетевыми нагрузками;
  • управление св.диодными RGB лентами;
  • +4
  • 10 августа 2014, 19:32
  • reptile
  • 3
Файлы в топике: sl_32f030-01.zip, sch.png, sl_32f030-01-6channel.zip

Комментарии (39)

RSS свернуть / развернуть
А где видео работы?
0
  • avatar
  • Bonio
  • 10 августа 2014, 19:36
пока нечем снять. Мигает себе, ничего особенного.
0
Я бы почитал подробнее про алгоритм работы… Или я один ничего не понял?.. :)
+1
алгоритм простейший — АЦП захватывает 256 отсчетов, вычисляется спектр этого сигнала, выделяются 8 частотных полос, результат отображается ШИМами
0
а как вычисляется спектр этого сигнала? и в каком виде? в итоге получается просто число?
0
0
Как я понял с Вашего описания каждые 16мсек производится БПФ. Просто интересно поподробней как это происходит. Я пытался бегло найти в программе, но понял что без бутылки не разобраться. Погуглил про окно Хемминга и сразу возник вопрос — а почему не другими способами (я почитал тутОконное преобразование Фурье. )
0
обработка — в файле fft.c.
ожидает флаг заполнения буфера adc.ready, когда заполнен — буфер умножается на окно (fft256_win_16), БПФ (fft256_forw_16), вычисляются амплитуды (fft_amp_16), и ШИМы.
все функции находятся в ul_fft.c
+1
было бы интересно увидеть быдооформулы из матана и их реальное применение в коде
оказывается сферический интеграл на доске есть не более чем сумма измерений ацп, устредненная, из которой извлечен корень

когда в быдловузе проходили фурье, то меня уже там не было, так что вот до сих пор не осилил
0
ну так и БПФ — интегралы от свертки (умножения) функции на синусы/косинусы разных частот.
информации по теории в сети предостаточно www.dsplib.ru/content.html
0
Очень интересная тема на самом деле. Жажду увидеть видео работы устройства :) У вас всё это под операционнкой крутится как я понял?
0
операционка — громко сказано, простейший кооперативный планировщик на базе Protothreads. Помогает распараллелить задачи при мизерных накладных затратах.
0
Насколько я понял, протопотоки там просто так в проекте болтаются. Используются только в модуле fft.c, и в таком применении, где можно спокойно без них обойтись.
0
использовались при отладке, для вывода в RS232, чтобы не тормозить остальные части программы.
0
0
А почему не на ютубе? Алсо, в этой версии уже есть beat-детектор?
0
был простейший пиковый детектор (крайний справа).
но работал непредсказуемо.
0
Покажи видео с бит-тдетектором. И на ютубе (или хотя бы ргхосте, он умеет показывать превью).
0
yadi.sk/i/D2EXuk__a9eeB, там есть превью
канал beat — крайний справа.
проблема что не на всех композициях работает, нужны адаптивные алгоритмы
0
А почему частот 128? Насколько я помню, у ДПФ на выходе столько же коэффициентов, сколько и на входе.
Коэффициенты в частотных группах просто усредняются, или с весами (чтобы, например, дать приоритет частотам из середины диапазона — как у фильтра с колоколообразной АЧХ)?
P.S. Схема нарисована не слишком читабельно. Во первых, неплохо бы развернуть ее — вход слева, выход справа. Во вторых — не утаптывать так схему аналогового входа, если подтяжка к питанию — желательно, чтобы питание к резистору подключалось сверху. Так гораздо наглядней.
+2
  • avatar
  • Vga
  • 11 августа 2014, 01:41
А почему частот 128? Насколько я помню, у ДПФ на выходе столько же коэффициентов, сколько и на входе.

Половина от входных — часть слева от нуля, часть справа.
0
А почему частот 128? Насколько я помню, у ДПФ на выходе столько же коэффициентов, сколько и на входе.
выше частоты Найквиста — зеркальный спектр. Он не используется.
Коэффициенты в частотных группах просто усредняются, или с весами
пока усредняются. Выглядит все равно лучше линейного спектра.
0
добавил графики, для понятности
0
У меня вопрос немного в сторону:
В чем выигрыш от того, что функции вычисления crc инлайновые? Это у Вас ради скорости так сделано?
0
иногда нужно, напр. считать CRC в прерывании.
0
Понял
0
Вы я так понял использовали какие-то свои собственные библиотеки? Я правильно понял? А почему не использовали штатные от ARM? И если не секрет пробовали работать с ними?
0
  • avatar
  • kos
  • 11 августа 2014, 18:18
какие например? У 32F3/32F4 есть DSP инструкции, можно было бы их использовать, у 32F0 их нет.
скорости хватает с избытком, даже на 32кГц процессор занят максимум на 60%.
0
Я имею ввиду не иструкции, а библиотеки. Ихняя библиотка подерживает насклько я понял все процики. Используя там где можно нужные встренные инструкции. DSP_Lib называется ихняя библиотека В IAR она располежена в CMSIS.
0
нет, не пробовал
0
Интересная тема.
0
для удаления пост.смещения пропускается через ФВЧ (т.н. DC-blocking фильтр).
ИМХО, ФВЧ != DC-blocking.
0
Не совсем так.
0
формально наверно так и есть, но по эффекту — аналогично пропусканию сигнала через большую емкость.
0
Все верно. Просто это — ФНЧ.
0
Добавлен beat-detector.
0
А можно в коде бит-детектор тоже увидеть? В прикрепленных исходниках только DC-blocking и LPF
0
Для 8 каналов достаточно ДПФ на 8 полос. Почему верхняя частота только 8кГц?
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.