Предлагаю к сборке вариант автономной цветомузыки. Этот вариант цветомузыки, в отличие от варианта цветомузыки на Arduino, не требует для работы персонального компьютера. Всю обработку аудио потока выполняет микроконтроллер STM32F103C8T6.
Переключение музыкальных и динамических программ осуществляется кнопочками или по Bluetooth со смартфона.
или буферный усилитель для подключения к линейному выходу (собрал из того что было под рукой)
Можно использовать обе схемы. Вы можете выбрать контакт аналогового(аудио) входа A0 или A1 на модуле STM32 подключением вывода A15 к общему ( G ) выводу или оставив A15 не подключённым. После изменения входа требуется перезагрузка микроконтроллера.
Программа для микроконтроллера STM32 доступна для скачивания c google диска. Выберите прошивку MC_**led.HEX c номером совпадающим с количеством светодиодов в вашей ленте: 30,60,72,90,120,144,150,180,210,216,240
Программирование STM32 выполняется через переходник USB-UART с помощью программы Flash loader demonstrator. В интернете есть несколько описаний процесса программирования STM32. Вы можете выбрать описание которое вам покажется более понятным.
Если позднее у вас изменится количество светодиодов в ленте вы сможете настроить их количество с помощью кнопки подключённой к выводу B8. Нажмите и удерживайте кнопку пока все светодиоды не будут задействованы. Сохраните режим после установки количества светодиодов в ленте !!!
Сохранение установленного режима производится кнопкой подключённой к выводу B9. Сохранённый режим будет устанавливаться при включении устройства. Для выполнения сохранения нажмите и удерживайте кнопку 3-4 секунды.
Назначение кнопок:
Кнопка(контакт) B9 – Сохранение установленного режима как режима при включении питания;
Кнопка(контакт) B8 – Установка количества активных светодиодов в ленте;
Кнопка(контакт) B7 – Выбор динамической программы;
Кнопка(контакт) B6 – Выбор музыкальной программы;
Кнопка(контакт) B5 – Включение/выключение режима перебора динамических программ;
Кнопка(контакт) B4 – Установка яркости ленты.
Кнопка(контакт) B3 – Установка темпа переключения.
Управление возможно и/или c кнопок или из приложения под Android.
Программа "Цветомузыка" под Android доступна для скачивания на Google Play.
Для подключения к контроллеру с модулем bluetooth просто коснитесь значка
При первом подключении, если устройство не обнаруживается, то выполните сопряжение c модулем в настройках bluetooth телефона!!!
«Так, а что значит заметка „в отличии от Ардуино не требует ПК“. На Ардуино так же можно собрать цветомузыку на адресной ленте с разных источников (микрофон, аудиовыход любого устройства) с управлением по IR, кнопкам или любому другому беспроводному соединению которое захочешь прикрутить. И при всем при этом не будет требовать пк. Не понимаю смысла в данном заявлении)»
Да нет там никакого Фурье. Исключительно по уровню громкости. Это по первому примеру видно. На малых громкостях хоть как-то к вступлению привязано. А основная часть композиции — отвлечённые мерцания, бо уровень звука одинаково громкий.
Вот вырезка из моего БПФ, если интересно (хочу собрать анализатор спектра на СТМ32), все писал сам на С++, библиотек не использую:
Дополнительная информация
for (int i = 0; i < FFT_SIZE; ++i)
{
int index = __RBIT (i) >> (31 - FFT_SIZE_BITS);
int value = (source [index] - 2010) << (CMPLX_FRACTION_BITS - 11);
//value = value*g_fftWindow [index] >> CMPLX_FRACTION_BITS;
g_fftData [i] = CCmplx (value, 0);
}
// How far the second element is located from the first one.
// Initially they are located one after another, so it is 1.
// Also, how many member pairs each FFT has. The first one
// has two members or one pair.
int stride = 1;
// How many different FFTs we must compute. Since the first
// FFT consists of only two elements, we must initially compute
// FFT_SIZE/2 functions.
for (int nFuncs = FFT_SIZE_D2; nFuncs; nFuncs >>= 1)
{
// Compute all FFTs
int pos1 = 0;
for (int nFunc = 0; nFunc < nFuncs; ++nFunc)
{
int nRoot = 0;
for (int nMember = 0; nMember < stride; ++nMember)
{
int pos2 = pos1 + stride;
CCmplx secondElem = g_fftData [pos2]*g_unityRoots [nRoot];
g_fftData [pos2] = g_fftData [pos1] - secondElem;
g_fftData [pos1] = g_fftData [pos1] + secondElem;
nRoot += nFuncs;
++pos1;
}
pos1 += stride;
}
stride <<= 1;
}
}
Оцифровываю входной сигнал на частоте 32 КГц, стерео, длина БПФ — 1024 сэмпла (гармоники 31.25 Гц — 16000 Гц), одно преобразование вместе с нормализацией результата (вычисление квадратного корня) занимает на STM32F103C8T6 (которая по факту оказалась 128 Кб) около 6 мс (т.е. два канала — чуть больше трети процессорного времени). Компилирую IAR (отлично оптимизирует).
Использую 32-битные вычисления в формате S15.16 (т.е. знак, 15 бит целая часть, 16 — дробная), код требует 8 Кб ОЗУ для вычисления БПФ и 4 Кб ПЗУ (512*4*2) под таблицу корней из единицы (от w^0 до w^511, вторая половина не нужна). За счет применения арифметики 32 бит можно не делить на 2 результат вычисления каждой «бабочки», а поделить один раз на 1024 в конце преобразования. Еще 8 Кб требуется для буфера АЦП (два канала по 2048 сэмплов по 16 бит). В принципе, можно сократить буфер почти в 2 раза (1024 сэмпла на каждый канал + небольшой буфер для АЦП, откуда копировать данные), но пока в 20 Кб ОЗУ укладываюсь.
Написал свой класс CCmplx для работы с комплексными числами, разместил в заголовке (это важно, чтобы компилятор мог инлайнить), в нем ничего особенного — простая арифметика, но так код выглядит красивей. Также следует отметить, что IAR прекрасно соптимизировал умножение двух 32-разрядных чисел, приведенных к 64-битному типу в одну команду SMULL.
Пробовал на РС реализовывать Фурье с 16-разрядной арифметикой — с делением на два на каждом этапе получается более-менее приемлемая точность, но явно хуже, чем 32 бита. Скорость на СТМ такого алгоритма не смотрел, т.к. 32-битный выполняется вполне быстро.
Труд, наверное хороший! Но потратив целый рабочий день на поиск быстрого преобразования фурье, оказалось, что
библиотека stm_fft целиком на ASM (скорость на порядок быстрее), уже давно лежит в комплекте ARDUINO у Roger Clark.
PS. У автора этого проекта две проблемы — 1. схема аудио входа заметно усложнена. Видел несколько вариантов, везде гораздо проще! 2. Отсутствие исходников прошивки, хотя автор использует чужой код который подразумевает публикацию исходников!
от формата расчетов (типа чисел) зависит скорость.
Там на ASM не используются дробные числа (иначе таких сложностей и заморочек я не понимаю) — все в целых. Думаю, что даже два порядка можно выиграть по сравнению с компилятором, который подставляет подпрограммы вычисления вещественных чисел. Тем более по сравнению с кодом, который опубликован выше.
Так компилятор-то тут при чем? Если написать на Си целочисленную математику, аналогичную ассемблеровскому варианту, то и результат по скорости работы будет сопоставим с ассемблерным :)
Так бы и написали — библиотека с целочисленным БПФ (скорость на порядок быстрее), тогда бы и вопросов не было :)
Не забивайте себе голову тонкостями. Компилятор как раз скрывает ту огромную пропасть между вычислениями с плавающей точкой и целочисленными на ASM. Вам было лень глянуть по ссылке, лишь бы прицепиться.
Глядите код FFT, кто хочет разрабатывать гирлянды. Мне вот пока некогда удивлять разработками, а окно с гирляндой на НГ требует звания «самого красивого и неповторимого» в доме.
Так что ждем разработок с открытым кодом! Кстати, в VK автор честно говорил, что надергал эффектов из файла эффектов, собранного А. Гайвером, который ему там выложили.
Не забивайте себе голову тонкостями. Компилятор как раз скрывает ту огромную пропасть между вычислениями с плавающей точкой и целочисленными на ASM.
Простите, но это у Вас голова забита непонятно чем. Вы приводите один алгоритм с меньшей вычислительной мощностью и менее точным результатом и пытаетесь сравнить его с другим алгоритмом, который больше вычисляет и дает более точный результат. При этом разницу в скорости работы списываете только на ASM :)
И даже в этом случае заявления о «скорость на порядок быстрее» — совершенно голословно и не обосновано. Такую разницу можно получить только если в компиляторе отключить всякую оптимизацию, а в ассемблере тщательно вылизать код до последнего байта.
/*
Скетч создан на основе FASTSPI2 EFFECTS EXAMPLES автора teldredge (www.funkboxing.com)
А также вот этой статьи https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#cylon
Доработан, переведён и разбит на файлы 2017 AlexGyver
Отправляем в монитор порта номер режима, он активируется
*/
Идея использования чисел с плавающей точкой отпала после первой же попытки — достаточно было глянуть код, который генерирует компилятор для их поддержки, чтобы понять, что МК не успеет.
Тем более по сравнению с кодом, который опубликован выше.
Посмотрите внимательнее, там используются целые числа, представляющие дробные с помощью фиксированного масштаба. Поэтому «тем более» в данном случае абсолютно неприменимо.
Вышеприведенный код (совместно с вычислением 511-ти абсолютных величин результата) занимает треть процессорного времени на 72 МГц стм32 при независимой обработке двух каналов с частотой дискретизации 32 КГц. Для моей задачи нет смысла пытаться делать быстрее.
Хотя пути для оптимизации есть:
1. Использование Radix-4 FFT вместо Radix-2. Позволяет выполнять на 20 или 25% (не помню точно) меньше умножений. Минус — алгоритм сложнее.
2. Использования 16-битной арифметики, чтобы результат умножения умещался в 32-битный регистр. Позволит использовать более быстрые команды умножения и упростит последующий сдвиг (хотя IAR оказался весьма хорош и для 32-битного варианта). Минус — падает точность, плюс надо делить результат умножения каждой бабочки на 2, это дополнительные команды сдвига.
В итоге, думаю, качественный код на асме для Radix-4 FFT будет раза в полтора быстрее того, что опубликован выше. Бесспорно, иногда это необходимо, но для моей задачи не надо точно. Если захотите сравнить, у меня вычисление блока FFT длиной 1024 сэмпла совместно с оконной функцией занимает около 5 мс. Сами ST заявляют около 3 мс для этого же МК, вот как раз и есть 1.5 раза.
И да, не надо недооценивать компиляторы — тот же IAR обеспечивает очень хорошую оптимизацию выходного кода.
тот же IAR обеспечивает очень хорошую оптимизацию выходного кода.
По-моему еще лет 5 или 6 назад на электрониксе поднималась тема качества кода от разных компиляторов на примере нескольких алгоритмов. IAR был на одном из первых мест. Самая тщательная ручная оптимизация выдаваемого им ассемблерного листинга давала выигрыш по скорости не больше 10%, а по объему кода — вообще до 5% :)
С тех пор, я думаю, компиляторы не стали хуже :)
Это видимо когда код вида int a = 5 + 2; такая разница.
а вот когда ASM код продумано использует команды и возможность доступа к данным через режимы адресации процессора, двойной выигрыш запросто.
Вы, видимо, не знакомы с кодом, который генерируют современные компиляторы. Возьмите IAR, попробуйте, поймете сами.
Я начинал программирование как на Z-80, так и на x86 именно с ассемблера. На Z-80 не было альтернатив, на х86 на асме иногда и сейчас пишу код, который обгоняет компилятор студии в два раза (но компилятор у студии в этом плане так себе, надо сказать, да и бывают алгоритмы, которые упираются в производительность памяти, поэтому тут хоть оптимизируй, хоть нет, скорость не растет). Также пишу для AVR исключительно на асме. Поэтому первым делом, когда начал изучать стм32, я ознакомился с его системой команд. И лично осознал ранее неоднократно виденный посыл — писать на асме под RISC — дело неблагодарное. Но тем не менее, я всегда смотрю, что генерит мне IAR в интересных местах. И, надо сказать, результат приятно удивляет.
Это видимо когда код вида int a = 5 + 2; такая разница.
Там нормально разбирающиеся люди проводили разбор и Ваш пример (на который вообще не генерируется свой код, кстати) там бы не проканал :)
а вот когда ASM код продумано использует команды
Вы, наверное, не смотрели листинги после компилятора, иначе бы знали, что компиляторы очень продуманно используют и код и даже многие трюки для ускорения или облегчения программы :)
Выложите пример. Только не кусок мифического кода, а полный.
1. Заполнение массива SINусом,
2. 100000 раз вычисление FFT вашей чудо функцией
3. 100000 раз вычислением функцией из библиотеки
4. Ну и разницу в часах :) времени работы.
Но вы, похоже, не умеете читать. Я вам выше писал результат. Повторю еще ровно один раз:
1. Моя функция вычисляет FFT совместно с оконной функцией (если не знаете, что это, то она требует еще 1024 умножения) за примерно 5 мс. Точных значений не запоминал, т.к. мне достаточно такого порядка точности.
2. Исходные данные на время выполнения не влияют. Можно заполнить массив нулями, можно — данными с АЦП, результат одинаковый, погрешность — десятки тактов (на частоте 72 МГц).
3. Библиотека по вашей ссылке от ST (вы сами-то хоть открывали исходник?). Результат работы библиотеки от ST без вычисления оконной функции на данном МК я приводил ранее — 3 мс.
4. Итого, моя функция + 1024 умножения = 5 мс. Функция от ST = 3 мс. Разница около полутора раз (3*1.5 = 4.5, что весьма близко, если убрать 1024 умножения).
5. Обратите внимание на разрядность — ST использует 16-битную арифметику, я — 32.
6. ST оптимизировали первый проход, где по факту умножений делать не надо (там умножения всегда на 1), я этого не делал (делаю умножения на 1).
Вывод: основной прирост за счет разных алгоритмов, а не за счет ручного написания на асме.
Давайте я сам по приложенной методике потестирую? А то цифры Ваши у меня сомнения вызывают :) Но, как говорится — нет кода, каждый останется при своем мнении.
Про Z80 я пассаж оценил :) я там пару игр написал на чистом ASM. А знаете, я еще на КР580ВМ80А писал копировщик, который на вход принимал данные с магнитофона, и тут же этот бит выдавал на выход. Так мы «защищенные» от копирования игры на БК-0010, полученные на кассетах из ногинск-7 копировали :)
Ваш копировщик можно было заменить компаратором, далеко не все «файлы», скопированные таким образом потом читались даже на первой копии (на спектруме проверяли такое).
Давайте я сам по приложенной методике потестирую?
Тестируйте. Ниже сгенерированный IAR'ом код. Необходимы только две таблицы — оконная функция (1024 32-битный числа, все могут быть 65536, вам она не нужна) и таблица корней из единицы (512 корней, каждый состоит из двух 32-битных чисел, значения в интервале от -65536 до 65536, первый — {65536, 0}, второй — {65534, 402} и т.д., чтобы было понятно). В принципе, если скорость не зависит от исходных данных, скорее всего и от корней зависеть не будет, можно взять любые данные, может можно от ST адаптировать.
Компараторы в СССР были в дефиците. Осциллографы для настройки этого чудо-узла тоже.
Позже, глючный компаратор 554CA3 на входе с мафона меняли, кстати, на 564ЛН2. Работало надежнее.
Ну отказ от прямого сравнения двух процедур в равных условиях говорит о двух вещах:
1. «У меня ВСЕ есть. Все работает круто. Там… Где-то… внутри… может», Я вообще гений, пока, впрочем, непризнанный" — я оцениваю такой расклад в 0%.
2. ASM код от ST как и было изначально мной оценено НА ПОРЯДОК уделывает Ваши студенческие изыски в этом направлении — я оцениваю такой расклад в 100%. И я понимаю, что потратить кучу нервов и сил, вникая в алгоритмы FFT (Вы ведь вникали, а не содрали код, изменили названия переменных) и тут первой же ссылкой тебя, крутого программера, с облаков опускают на грешную землю.
PS. Простите, я и так много тут написал, но я такое уже видел BolgenOS :):):):):):):):):)
Вы адекватный человек? Или может вы употребляете запрещенные вещества? Иначе мне просто непонятен уровень вашего (уж простите) идиотизма. Выше вам несколько раз было сказано, за какое время отрабатывает функция. И эти результаты были измерены как программно, так и аппаратно. «Там… Где-то… внутри… может» — очень похоже, что вы так проектируете свои устройства, у меня подход другой.
Вам был предоставлен кусок кода. Вы провели тестирование? Где результаты? Конкретные числа. Я свои предоставил.
И я понимаю, что потратить кучу нервов и сил, вникая в алгоритмы FFT (Вы ведь вникали, а не содрали код, изменили названия переменных) и тут первой же ссылкой тебя, крутого программера, с облаков опускают на грешную землю.
Похоже, вы забыли принять лекарства. Мой алгоритм работает ровно так, как надо мне, за время, которое меня полностью устраивает, даже, в принципе, быстрее. И я очень рад, что потратил время и разобрался в преобразовании Фурье лично, а не содрал алгоритм — это одно из фундаментальных преобразований, используемых в математике и вычислительной технике, считаю его понимание важным.
На этом предлагаю вам остановить поток сознания и вернуться к вашим гирляндам и красивым окнам, ибо беспредметных разговоров вести желания не имею.
Нда, когда у людей кончаются аргументы, начинаются жалобы администрации… раз пошли посты стирать — на сем дискуссию завершаю. (Смысл тут что-то писать, если просто выносят, не разбираясь ?), не ищите у людей тех препаратов, что лежат в вашей аптечке. Давайте считать, что у меня для Вас просто бисер кончился.
Это же Вы писали «Давайте я сам по приложенной методике потестирую?». Потестировали? Результаты есть? Покажите. Не потестировали и результатов нет? Тогда молчите, потому что у Вас нет никаких оснований делать какие-то выводы с «порядками» :)
Лицензия на библиотеку stm_fft не подразумевает открытие исходного кода.
Микрофонный усилитель используется готовый и подключается 3 проводниками. Проще некуда.
Да ладно (Вы хоть свой VK.com читаете, что там пишите? — вам дали файл алекса гайвера, вы оттуда 4 спецэффекта себе перетащили, три недели назад и уже забыли — я вам скриншотом напомню), а вот что делать с использованием SPI для работы со светодиодами. Это ведь стержень — быстрая выдача информации? Я про этот код говорил. У Вас же за «общение» с WS8212B используется тот же конкретный порт (а он жестко определенный спецификой железа).
Я этот код видел под GNU GPL. И даже на автора могу ссылку дать.
Спорим, что Вы порт для выдачи данных с А7 на соседний порт (A5 например) не сможете перенести? — у Вас вся логика программы слетит :). SPI DMA там ведь не прокатит.
PS. В этом проекте Вашего труда чуть (аналоговая схема — да, такого я не встречал, но излишне сложна, считаю бесполезна. Другие делают проще. Плата микрофона, случайно, такая же как у Алекса Гайвера. Код для захвата (оцифровки) AUDIO — думаю, что код заимствован GNU GPL, FFT — не свое от STM, WS2812b DMA SPI — тоже GNU GPL). Если бы так же меркантильно думал Roger Clark, с надеждой продавать STM32 arduino, то Вы бы с помощью delay() делали бы задержки :) Но нет, там огромный труд, позволяющий легко и просто работать со сложным ARM железом в привычной среде. И все открыто и, более того, автор еще и активно все это развивает на общественных началах.
/*
Скетч создан на основе FASTSPI2 EFFECTS EXAMPLES автора teldredge (www.funkboxing.com)
А также вот этой статьи https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#cylon
Доработан, переведён и разбит на файлы 2017 AlexGyver
Отправляем в монитор порта номер режима, он активируется
*/
Не понял. При чем тут гайвер? там процессор другой.
В вашей программе для STM32 основная фишка — использование DMA и SPI интерфейса для выдачи данных на ленту в фоновом режиме. Этот код в коммерческих проектах Вы не можете использовать и обязаны публиковать любые разработки, в которых данный код заимствуется. Связываться с закрытым кодом не хочу.
использование DMA и SPI интерфейса для выдачи данных на ленту в фоновом режиме. Этот код в коммерческих проектах Вы не можете использовать и обязаны публиковать любые разработки, в которых данный код заимствуется
А в моих разработках тоже изпользуются и DMA и SPI для выдачи на WS2812 :) Я тоже не могу использовать этот код в коммерческих целях и кому-то там чего-то обязан? :)
Код — это функция, у которой имеются входные параметры, понятия «исходный код» и «машинный код» несколько разные вещи, не находите? Я должен возиться с его (это не про juraspb) скомпилированным кодом, пытаясь повторно причесать и скомпилировать его? ЧТО бы загрузить в платку? — это мне зачем? Я и так знаю, что математики в STM сделавшие FFT на ASM гораздо талантливее подобных «горе мастеров».
Я ссылку на тестирование FFT дал (ее тут стерли) www.stm32duino.com/viewtopic.php?t=1145 — вот есть тестовый пример, что мешает тому, кто жалобы строчит, по аналогичной общепринятой методике свой «великий код» протестировать? Заодно и правильность результатов проверить?
это мне зачем? Я и так знаю, что математики в STM сделавшие FFT на ASM гораздо талантливее подобных «горе мастеров»
Ну то есть настаиваете на позиции «не читал, но осуждаю».
Я ссылку на тестирование FFT дал (ее тут стерли)
Тогда давайте ссылку на конкретный пост с тестированием, где вычисление FFT для массива на 1024 значения занимает меньше 0.5 миллисекунды. Мне не улыбается лопатить все страницы темы по ссылке.
А по поводу, AndyBig, Ваших разработок — toster.ru/q/374189
Вы не ответили на вопрос. Или это Ваш вопрос по ссылке и Вам 17 лет? Тогда это многое объясняет.
Там читать нечего его машинный листинг пусть процессор читает. Текст на СИ он предоставить отказался, в связи с гениальностью написанного — или это Ваш второй ник?
(Я сразу говорил, что полностью согласен с этим мнением: After testing various C FFT routines, including FHT, real-FFT, CMSIS libraries, and finding them all to be too slow to run real-time 38khz audio FFTs with a size of 1024 on the STM32F103C,I finally figured out how to make the Arduino environment accept assembly functions.)
Тогда давайте ссылку на конкретный пост с тестированием, где вычисление FFT для массива на 1024 значения занимает меньше 0.5 миллисекунды. Мне не улыбается лопатить все страницы темы по ссылке.
Вы, видимо, не понимаете английский (тогда что Вам в этой профессии делать ?). По приведенной ссылке www.stm32duino.com/viewtopic.php?f=3&t=1145
в первом же посте все есть — сама FFT библиотека + header, а так же проект, который ее тестирует — cr4_fft_1024_stm32.s + cr4_fft_1024_stm32.h + arduino sketch). Скетч, выводит результат преобразования на экранчик ILI9341 только что бы любой желающий смог визуально оценить результаты вычисления FFT). Тестирование идет именно по описанной мой методике — формируется «синус» определенной частотой во входном буфере и рассчитывается выходной. Еще результат на экран выводится, что уже не так важно.
Вы не ответили на вопрос. Или это Ваш вопрос по ссылке и Вам 17 лет?
Лицензия требует предоставления исходного кода продукта, основанного на коде GPL («В общем случае распространитель программы, полученной на условиях GPL, либо программы, основанной на таковой, обязан предоставить получателю возможность получить соответствующий исходный код» )? — заметьте, кусочек GNU GPL кода Вы включили, а выложить должны весь проект — в этом и суть свободного ПО, каждый вносит посильный вклад, а польза всем :)
в отличие от варианта цветомузыки на Arduino, не требует для работы персонального компьютера.
А кто сказал, что ардуине для работы требуется наличие ПК?
Ардуина, также, как и STM — вполне автономный микроконтроллер. Ардуина не хуже и не лучше STM умеет управлять лентой WS2812.
Или имеется в виду, что у вас STM запрограммировался сам по себе, без наличия ПК, исключительно силой мысли?
Словом, странный тезис, не имеющий под собой никакого смысла.
Тут не столько в управлении лентой, сколько в обработке сигнала, разбивки его на частотный спектр. ARM на 70 МГц и с более объемной оперативкой с этим все же более успешно справится, чем AVR на 16 МГц :)
К сожалению, бумага в ответ на DTMF-сигнал не пошлет управляющие сигналы исполнительному устройству. :) А так то, да можно было бы. Даже знание ассемблера было бы не нужно.
ДПФ для декодирования DTMF был реализован и на 4 МГц Z80 в АОНах «Русь». Изучал тогда его код (там сигнал размером 1 бит, поэтому вместо умножения применялся AND, что и позволило все сделать в реальном времени), но только спустя годы понял, что это и было преобразование Фурье…
Тут не те частоты, чтобы DMA давал сильное преимущество, но в целом — да :) Один раз запустил АЦП по ПДП в кольцевой буфер и потом только время от времени достаешь готовый набор результатов :)
У меня до этой на mysku были три статьи цветомузыка на Arduino. Обработку сигнала там выполнял ПК.
И исходники на тот проект выложены. И для Arduino и для ПК.
У меня до этой на mysku были три статьи цветомузыка на Arduino. Обработку сигнала там выполнял ПК.
Так ведь этого из текста статьи совсем не видно, попробуйте прочесть текст отвечённо. Вы так и напишите, а то ведь всё читается, что, мол, ардуине для работы нужен ПК.
На AVR две проблемы для реализации БПФ:
1. Мало быстродействия (ну тут еще вопрос, может один канал 32 КГц и реально, если все оптимизировать).
2. Мало ОЗУ
Видел на ютубе проект БПФ на AVR длиной 128 сэмплов, но для полноценного спектра звука надо 1024.
А вот тут не соглашусь. Делал на AVR вывод на 600 диодов 50 раз в секунду с жесткой палитрой 256 цветов примерно за 50% процессорного времени с использованием инвертированного на транзисторе выхода USART на прерываниях (т.е. можно использовать любые другие прерывания, главное в начале обработчика сразу же разрешить их). Если взять 300 диодов и 25 «кадров» в секунду, понадобится всего 12% времени. Это допустимо.
А синхронность этих эффектов вообще кому-то важна?)
На тех дискотеках, где бывал юношей в 70-х — 80-х, как-то совершенно не отложилась в памяти особая прелесть попадания цвета в такт музыке.
То-ли потому, что преимущественно уже хорошо под газом туда попадал, то-ли кроме девчонок ничего там не интересовало, а может и вовсе дискотечная попса того времени просто абсолютно в душе не резонировала...)
Я думаю, что автор не так про ардуино хотел выразиться. Обзор интересный, времени и сил было потрачено, молодец.
Не нужно сразу набрасываться, человек все таки старался…
Нет, работа проведена большая. Спору нет, обзор заслуживает плюса уже даже за то, что автор не бросает свою идею, развивает её. Такая увлечённость всегда подкупает. Но, вот почему-то, глядя на видео, не наблюдаю я сильной привязки к музыке. В 80-х конструкции из «Радио» были лучше привязаны, особенно более поздние, с «пилой» для пропорционального управления моментом включения тиристоров, с компрессорами и т.д.
Эх…
К чему я.
Люди, кто-нибудь, дайте рабочий алгоритм выявления BPM или хотя бы сильных долей музыки на микроконтроллере, а?
То, что любой пятилетний ребёнок делает без труда на утреннике, притопывая в такт музыке, на микроконтроллерах в реалтайме, насколько я могу судить, до сих пор ещё не реализовано…
Да читал я всё это. Чувак выделяет НЧ, предполагая, что в той части спектра может быть только бочка. Это популярная, и, увы, тупиковая идея; отфильтовывание — это совсем не выделение ритма.
НЧ составляющая в фонограмме присутствует и от других инструментов, поэтому ритм из нижних частот выделять — это утопия.
Бóльшая часть роковых композиций, к примеру, во вступлении вообще не имеет бочки или барабанов. Например, только одни гитарные рифы. Или только хет и тарелки. Или только гитарный перебор. Однако уже со вступления песни мы легко можем начать притопывать ногой или прихлопывать рукой в такт музыке. Безо всяких НЧ-составляющих.
Чё-то вы как-то глубоко копаете :)
Я ж говорю не об искусственном интеллекте для сочинения музыкальных партитур. Творчество — да, продукт исключительно интеллекта.
Но я-то всего лишь о выделении такта из ритмичной музыки, это куда более простая вычислительная задача, причём на PC реализованная во множестве исполнений :)
Ребёнок выделит такт в любой композиции, а программа не всегда. Хорошо если в половине. И демки в интернете с классными цветомузыками не на всех композициях работают хорошо. Выкладывают конечно самые лучшие. Мне и моим коллегам моя цветомузыка нравится. Она тоже не идеальна, но вариант. Чем больше вариантов тем лучше.
не годом, а летом
до потопа не было зимы и весь календарный период назывался летом
а педевикия твоя врет, там не сотворение мира как человечества, а мир в плане перемирия после войны с китайцами
мир имеет 5 значений и раньше записывался через 5 разных букв и, пока в 17м году не провели реформу и не выкинули лишние 3 штуки
а. автокорреляционная функция над входным буфером — получили огибающую (одну)
б. автокорреляционная функция над огибающими — получили ритм
Как видите, никакой привязке к частотам. ))… и ритм может восстанавливать.
Можно и аппаратно, если лениво писать довольно простой код — 564ГГ1 по огибающей (выпрямленному). Но придется подавлять «ритм» в отсутствии музыки.
Ой. А поподробнее можете расписать?
Вот именно, как раз, с АКФ и проблема. Знаний матухи не хватает. И про Хинчина с Колмогоровым я почти ничего не знаю :)
Вы сумеете изобразить это в действующем скетчике?
Автореляция — это удивительно просто. Берете ваш массив данных и начинаете его накладывать самого на себя. Я делаю вычитание, а положено умножение (поэлементно), потом модуль и сложить все числа. Вот вы и получили F(0).
Сдвиг на 0 — полное совпадение. Сдвиг на 1 { F(1) } — получили меньше, еще… и т.д.
Вначале результат будет уменьшаться, затем повышаться, потом снова уменьшаться и снова подниматься. Так вот — самый первый горб (кроме 0) — это и есть период повтора функции (ритм). А его высота — мера интенсивности этого ритма. Ничего сложного.
По похожему алгоритму работал русский АОН, а там ой-ой какой гадкий и шумный сигнал.
Так что — почаще оцифровывайте, будет четче результат. И на ARMе конечно.
1. Ритм может быть такой что МК просто памяти не хватит.
2. Даже если его выделить, сложнее решить что с этим ритмом делать. Что зажигать и на сколько, и что делать с остальной информацией. И главный вопрос будет ли это красиво на большинстве музыкальных композиции.
Я в проекте с проекте с Ардуинкой приглашал писать свои варианты обработки. Никто не откликнулся.
Кому нужны исходники может посмотреть проект на Arduino + FFT для STM на диске вместе с прошивками. Я по просьбе своих коллег положил два проекта в одну STM и добавил управление со смартфона.
Ну, вообще-то, человек под «ритмом» понимает вполне конкретный диапазон частот. Тот самый, с которым можно топать. )) Если ритм выходит из этих рамок, то ФАПЧ разрывается.
Памяти хватит, просто возьмите не_AVR и ограничте частоту сверху — ритм на 10кГц не возможен (т.к. издевательство над человеком).
Из того, что делал — определение сигнала «занято» — вводными были диапазон тона 300-1500Гц (вместо халявных 425) и ритм занято а-бы-какой с непонятной скважностью и стабильностью параметров. И это на фоне разговора. Оно работало.
/disconnect
Ардуино, микропроцессоры… И как без всего этого обходились лет 30 назад — только тиристоры КУ202 и ещё небольшая кучка деталей. Ещё фотосветильники с переделанными светофильтрами. Тепло, аналогово. Моя ЦМП до сих пор на даче лежит, жалко выкинуть. Может даже и заработает если включить. За обзор респект, интересно почитать о новом уровне старой идеи.
Ну как обходились.., да, обходились, конечно.
Я сам, собравший не одну ЦМП разной сложности, и, как и большинство радиолюбителей той поры, прочитывающий «Радио», могу сказать, что те «аналоговые» и «тёплые» тоже не были панацеей. Прежде всего, потому, что утомляли зрителя довольно быстро. Именно поэтому тот же «Радио» не гнушался публикациями цветомузыкальных оргáнов и цветомузыкальных клавиатур — все понимали, что в световом сопровождении музыки альтернативы человеку пока нет.
Я сам в конце восьмидесятых ушёл от голого аналога в ЦМУ к дискретным элементам: генератор на логических элементах+счётчик+ПЗУ и выход на тиристоры. Даже такая конструкция в визуальном смысле тогда смотрелась куда выигрышнее, чем голый аналог после трёх-четырёх фильтров, поскольку в ПЗУ вшивались уже всякие «бегущие огни», «рассыпания», мигания и прочее.
Сегодняшние светодиодные технологии — да, позволяют ещё более разнообразить цветовую картину: ведь тогда, со всеми светофильтрами, цапонами и пастой от шариковых ручек, мы даже близко не могли достичь такой цветовой палитры. Так что зря вы так уж сильно ностальгируете по «тёплому аналоговому», WS2812 куда более вариативна и выразительна, чем N-канальные ЦМУ с лампами накаливания. Но проблема осталась там же и практически не сдвинулась за все эти годы — полностью автоматизировать процесс светового визуального сопровождения музыки всё равно удачно не получается. На любой концертной площадке работает DMX-светотехника, которую программируют люди.
+1!
Я, вероятно, в авангарде этих самых утомляемых зрителей до сих пор)
Ещё до расцвета диктуемой журналом «Радио» моды на ЦУ, собирал в старших классах тиристорную.
Однако балдеть под мигающие в такт музыке три цветные лампочки дома почему-то ни разу не довелось) Как-то наоборот, своей искусственной примитивностью убивали тогда весь кайф от прослушивания излюбленного арт-рока)
те «аналоговые» и «тёплые» тоже не были панацеей. Прежде всего, потому, что утомляли зрителя довольно быстро.
Решалось применением дополнительного, фонового канала засветки, яркость которого уменьшалась с ростом сигнала, что позволяло компенсировать неприятное мерцание переливом цветовой гаммы. Например, так было реализовано в ряде промышленных ЦМУ тех лет.
Решалось применением дополнительного, фонового канала засветки, яркость которого уменьшалась с ростом сигнала
Спасибо большое за открывание мне сокровенных редких знаний.
Встречный вопрос.
Вытекающий из контекста комментариев к этому обзору.
Мои реплики:
«пилой» для пропорционального управления моментом включения тиристоров
с компрессорами
ПЗУ и выход на тиристоры
Я сам, собравший не одну ЦМП разной сложности
и, как и большинство радиолюбителей той поры, прочитывающий «Радио», могу сказать
Я сам в конце восьмидесятых ушёл от голого аналога в ЦМУ к дискретным элементам
N-канальные ЦМУ
DMX-светотехника
— вот это всё, в общем и целом, не натолкнуло вас на мысль, что я «немножечко в теме»?
Т.е. написав свою реплику, вы всерьёз полагали, что про существование фонового канала в ЦМУ я вот за эти несколько десятилетий ни разу не слышал?
И только вы сейчас, в конце второго десятилетия 21-го века, мне вдруг открыли эти сокровенные знания? :)
Ну, спасибо, чо :)
я когда был тупым школьником, то тоже делал на тиристорах
спасли только стеклянные колпаки от промышленной сду (походу это были колпаки как на ментовских мигалках) + снег на подоконнике, который служил рассеивающим экраном
с улицы нереально круто смотрелось, цвета сочнейшие, светодиоды не тянут такой динамический диапазон по цвету, хоть тоже он и насыщен
Работа проделана большая. Но музыкальные эффекты ни очем. Увеличте кол-во музыкальных эффектов и будет бомба. Очень нравятся эффекты с проекта цветомузыка чип и дип. Которую они клонировали с забугорного проекта. У меня 300 диодов 5 метров. А чип и дип проект максимум 180. А Ваш судя по описанию максимум 240 диодов? Если реализуете 300 диодов + эффекты с чип и дипа готов Вам перевести 20$ за труды.
Схему подправил.
Буфер желающие могут подобрать сами из имеющегося в наличии хлама. В китайском контроллере SP105E (на STM32) в качестве буфера стоит 74HC245. Этот буфер по входу точно такой же как и WS2812B — 4.5*0.7=4.15
Уважаемый juraspb, давно интересуюсь Вашим проектом, сделал на ПК- все ОК, сейчас на STM32- у меня проблема с установкой количества диодов, а именно кн8, залил с последнего архива в котором файл только на 30 диодов, помогите пожалуйста. А лучше выложить видео по настройке. Еще вопрос- есть ли в программе функция АРУ и Компрессора(еще бы с регулировкой). Спасибо, проект обалденный, многие делал и смотрел- Ваш более «Цветомузыкальный».
АРУ и компрессора пока нет.
Прошу прощения в описании перепутал B8 и B9.
B9 — замкните на G для изменения количества светодиодов и удерживайте до выполнения изменения.
B8 — замкните на G для сохранения установленного режима.
или чуть подождите исправлю прошивку под описание и добавлю прошивки на разное количество светодиодов.
Вечером обновлю программу под Android.
Меня попросили кое что добавить и я временно удалил прошивки.
Видео изменения количества светодиодов положил в папку с прошивками.
Здравствуйте! Спасибо за конструкцию! Собрал устройство. Никак не пойму как меняется яркость при настройке. Она должна плавно меняться от тусклого к яркому и обратно при удержании замкнутой кнопки? Мне кажется что у меня дошло до яркого, а назад не хочет. И не убирайте пожалуйста прошивку на 180 светодиодов. Или можно из любой прошивки получить 180? Какой шаг изменения количества светодиодов? Я сейчас тестирую на 30-ти светодиодной ленте.Пожелание — побольше бы динамических эффектов.
Добрый день.
Нажимаете и держите кнопку — яркость увеличивается. Для уменьшения отпустите кнопку и снова нажмите и держите — яркость уменьшается. Каждый раз при отпускании кнопки меняется направление изменения.
Шаг изменения количества светодиодов (кнопка на контакте B8): 30,60,72,90,120,144,150,180,210,216,240,300.
Эффекты добавлю. (Только ремонт в детской доделаю). Пока предлагайте варианты, лучше на сайте цветомузыка.
Сайт размещён на сервере у меня дома и не всегда включён (по ночам выключаю).
Если есть желание могу сделать группу в Facebook.
Уважаемый juraspb, (1).есть проблема с USB управлением-(пишет «error comand. enter: AT+H.....») скрин не получилось загрузить,(2). иногда (в разное время включения) зависает контроллер на программе «ШКАЛА».
Добрый день
Это отвечает контроллер таким образом связь есть.
На все команды так отвечает?
В терминалке после команды поставьте коды $0D$0A (возврата и перевода строки). AT+H$0D$0A.
Как на картинке.
Последние четыре музыкальные программы доработаю. Написал их на скорую руку (что бы были задействованы все кнопки), к новому году переделаю.
Не получается отослать команды по usb. Использую указанный вами терминал. Какую бы команду не отсылал, терминал выдаёт сообщение что неправильная команда. Вы не могли бы описать конкретнее(пошагово) или видео не большое приложить как работает прошитая STM32 с терминалом? При добавлении кода, так же ошибки.
Разобрался, программа «Терминал» должна быть версией 1.9, а не 1.93. Окно с портами должно быть как у Jurasb на скрине.
В файле «readme» все команды «АТ», или еще что нибудь можно менять?
Еще бы добавить «Плавность» регулируемую, как в музыкальные так и в динамические.
!!!
Добавил на google диск тестовую прошивку MCmic.HEX — в данной прошивке при работе в динамическом режиме реализована функция включения/выключения ленты по хлопку.
Данная функция работает(должна работать) при не очень высоком уровне шума в помещении.
Прошивка тестовая и лента может не всегда корректно включаться и выключаться.
Жду откликов на корректность работы данной функции.
Подтверждаю, версия точно такая же как у автора заработала с платой. По умолчанию будут воспроизводиться на ленте все динамические программы, которые есть в прошивке?
В новой версии нет.
Добавляйте динамические программы в список воспроизведения из терминалки или с помощью новой кнопочки ADD в приложении (начиная с версии 1.5 от 03.10.18). В терминалке можно просмотреть список, добавить в конец списка или в конкретную позицию, удалить из списка. Перед выключением питания не забудьте сохранить список, команда AT+W в терминалке или кнопочка SAVE в приложении, иначе изменения будут потеряны.
При нажатии кнопки ADD в конец списка добавляется текущая динамическая программа.
Так вы сможете выбрать для воспроизведения именно те программы которые вам нравятся и в том порядке в котором вы их вводите.
Список может содержать до 256 программ.
Не могли бы вы написать что надо ввести в терминале что бы воспроизводились все динамические программы? И пример удаления какой либо программы из списка. Это было бы не плохим примером для понимания процесса настройки прошивки.
Можно вводить так (всегда меняем одну цифру)
AT+A0,0$0D$0A enter
AT+A1,0$0D$0A enter
AT+A2,0$0D$0A enter
AT+A3,0$0D$0A enter
…
AT+A20,0$0D$0A enter
AT+A0,1$0D$0A enter
AT+A1,1$0D$0A enter
AT+A2,1$0D$0A enter
если вводить в таком порядке то будут чередоваться именно программы, так как вторая цифра(0..7) изменяет цветовое решение программы.
Порядок удаления программы
Если вам не нравится какая либо программа, установите её c помощью «крутилок», запомните её двузначный номер например: 19,4
Выведите список программ командой
AT+P$0D$0A
0,0,1
1,1,1
2,8,3
3,3,2
4,11,1
5,19,4 — программа которую мы хотим удалить 19,4 пятая (5) в списке
6,…
…
AT+D5$0D$0A удалится 5 программа из списка
Из программы под android добавить в список очень просто, «крутилками» устанавливаем программу и нажимаем кнопочку ADD. Программа добавится в конц списка воспроизведения.
Список может включать до 256 программ.
!!!
Добавил на google диск тестовую прошивку MCmic.HEX — в данной прошивке при работе в динамическом режиме реализована функция включения/выключения ленты по хлопку.
Данная функция работает(должна работать) при не очень высоком уровне шума в помещении.
Прошивка тестовая и лента может не всегда корректно включаться и выключаться.
Жду откликов на корректность работы данной функции.
Автор где исходники на этот проект, не надо всех посылать за исходниками, в другую тему. У меня часть эффектов будет меняться (может все, пока не знаю), поэтому и приложение под android будет другое, мне нужен код отвечающий за bluetooth (и на android то же), не хочешь выкладывать весь код, выложи хотя бы часть кода.
p.s. да можно поднять документацию и написать самому, но это займет больше времени, а его не так уж много.
В группе vk я был, там нет исходников (там Руководство пользователя, Руководство по загрузке прошивки, история изменений и MC.hex), на гугл-диске тоже нет, мне интересно взглянуть на код отвечающий за обработку bluetooth-команд, а автор выкладывает ссылки на предыдущие проекты, которые работают без bluetooth, к тому же не я один прошу выложить исходники на этот проект.
www.youtube.com/watch?v=nu31By9Phdc
www.youtube.com/watch?v=sFQip-zjMoY
www.youtube.com/watch?v=5vanh8qdEC8 — итог: отзывы о Гайвере
www.youtube.com/watch?v=DBuPlFtg0Nw
Использую 32-битные вычисления в формате S15.16 (т.е. знак, 15 бит целая часть, 16 — дробная), код требует 8 Кб ОЗУ для вычисления БПФ и 4 Кб ПЗУ (512*4*2) под таблицу корней из единицы (от w^0 до w^511, вторая половина не нужна). За счет применения арифметики 32 бит можно не делить на 2 результат вычисления каждой «бабочки», а поделить один раз на 1024 в конце преобразования. Еще 8 Кб требуется для буфера АЦП (два канала по 2048 сэмплов по 16 бит). В принципе, можно сократить буфер почти в 2 раза (1024 сэмпла на каждый канал + небольшой буфер для АЦП, откуда копировать данные), но пока в 20 Кб ОЗУ укладываюсь.
Написал свой класс CCmplx для работы с комплексными числами, разместил в заголовке (это важно, чтобы компилятор мог инлайнить), в нем ничего особенного — простая арифметика, но так код выглядит красивей. Также следует отметить, что IAR прекрасно соптимизировал умножение двух 32-разрядных чисел, приведенных к 64-битному типу в одну команду SMULL.
Пробовал на РС реализовывать Фурье с 16-разрядной арифметикой — с делением на два на каждом этапе получается более-менее приемлемая точность, но явно хуже, чем 32 бита. Скорость на СТМ такого алгоритма не смотрел, т.к. 32-битный выполняется вполне быстро.
библиотека stm_fft целиком на ASM (скорость на порядок быстрее), уже давно лежит в комплекте ARDUINO у Roger Clark.
Кому итог важнее — прямая ссылка
github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F1/libraries/stm_fft
PS. У автора этого проекта две проблемы — 1. схема аудио входа заметно усложнена. Видел несколько вариантов, везде гораздо проще! 2. Отсутствие исходников прошивки, хотя автор использует чужой код который подразумевает публикацию исходников!
Там на ASM не используются дробные числа (иначе таких сложностей и заморочек я не понимаю) — все в целых. Думаю, что даже два порядка можно выиграть по сравнению с компилятором, который подставляет подпрограммы вычисления вещественных чисел. Тем более по сравнению с кодом, который опубликован выше.
Так бы и написали — библиотека с целочисленным БПФ (скорость на порядок быстрее), тогда бы и вопросов не было :)
Глядите код FFT, кто хочет разрабатывать гирлянды. Мне вот пока некогда удивлять разработками, а окно с гирляндой на НГ требует звания «самого красивого и неповторимого» в доме.
Так что ждем разработок с открытым кодом! Кстати, в VK автор честно говорил, что надергал эффектов из файла эффектов, собранного А. Гайвером, который ему там выложили.
И даже в этом случае заявления о «скорость на порядок быстрее» — совершенно голословно и не обосновано. Такую разницу можно получить только если в компиляторе отключить всякую оптимизацию, а в ассемблере тщательно вылизать код до последнего байта.
Вот эти видео: www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#cylon
Посмотрите внимательнее, там используются целые числа, представляющие дробные с помощью фиксированного масштаба. Поэтому «тем более» в данном случае абсолютно неприменимо.
Вышеприведенный код (совместно с вычислением 511-ти абсолютных величин результата) занимает треть процессорного времени на 72 МГц стм32 при независимой обработке двух каналов с частотой дискретизации 32 КГц. Для моей задачи нет смысла пытаться делать быстрее.
Хотя пути для оптимизации есть:
1. Использование Radix-4 FFT вместо Radix-2. Позволяет выполнять на 20 или 25% (не помню точно) меньше умножений. Минус — алгоритм сложнее.
2. Использования 16-битной арифметики, чтобы результат умножения умещался в 32-битный регистр. Позволит использовать более быстрые команды умножения и упростит последующий сдвиг (хотя IAR оказался весьма хорош и для 32-битного варианта). Минус — падает точность, плюс надо делить результат умножения каждой бабочки на 2, это дополнительные команды сдвига.
В итоге, думаю, качественный код на асме для Radix-4 FFT будет раза в полтора быстрее того, что опубликован выше. Бесспорно, иногда это необходимо, но для моей задачи не надо точно. Если захотите сравнить, у меня вычисление блока FFT длиной 1024 сэмпла совместно с оконной функцией занимает около 5 мс. Сами ST заявляют около 3 мс для этого же МК, вот как раз и есть 1.5 раза.
И да, не надо недооценивать компиляторы — тот же IAR обеспечивает очень хорошую оптимизацию выходного кода.
С тех пор, я думаю, компиляторы не стали хуже :)
а вот когда ASM код продумано использует команды и возможность доступа к данным через режимы адресации процессора, двойной выигрыш запросто.
Я начинал программирование как на Z-80, так и на x86 именно с ассемблера. На Z-80 не было альтернатив, на х86 на асме иногда и сейчас пишу код, который обгоняет компилятор студии в два раза (но компилятор у студии в этом плане так себе, надо сказать, да и бывают алгоритмы, которые упираются в производительность памяти, поэтому тут хоть оптимизируй, хоть нет, скорость не растет). Также пишу для AVR исключительно на асме. Поэтому первым делом, когда начал изучать стм32, я ознакомился с его системой команд. И лично осознал ранее неоднократно виденный посыл — писать на асме под RISC — дело неблагодарное. Но тем не менее, я всегда смотрю, что генерит мне IAR в интересных местах. И, надо сказать, результат приятно удивляет.
Вы, наверное, не смотрели листинги после компилятора, иначе бы знали, что компиляторы очень продуманно используют и код и даже многие трюки для ускорения или облегчения программы :)
1. Заполнение массива SINусом,
2. 100000 раз вычисление FFT вашей чудо функцией
3. 100000 раз вычислением функцией из библиотеки
4. Ну и разницу в часах :) времени работы.
а так рассказывать сказки и я могу.
1. Моя функция вычисляет FFT совместно с оконной функцией (если не знаете, что это, то она требует еще 1024 умножения) за примерно 5 мс. Точных значений не запоминал, т.к. мне достаточно такого порядка точности.
2. Исходные данные на время выполнения не влияют. Можно заполнить массив нулями, можно — данными с АЦП, результат одинаковый, погрешность — десятки тактов (на частоте 72 МГц).
3. Библиотека по вашей ссылке от ST (вы сами-то хоть открывали исходник?). Результат работы библиотеки от ST без вычисления оконной функции на данном МК я приводил ранее — 3 мс.
4. Итого, моя функция + 1024 умножения = 5 мс. Функция от ST = 3 мс. Разница около полутора раз (3*1.5 = 4.5, что весьма близко, если убрать 1024 умножения).
5. Обратите внимание на разрядность — ST использует 16-битную арифметику, я — 32.
6. ST оптимизировали первый проход, где по факту умножений делать не надо (там умножения всегда на 1), я этого не делал (делаю умножения на 1).
Вывод: основной прирост за счет разных алгоритмов, а не за счет ручного написания на асме.
Про Z80 я пассаж оценил :) я там пару игр написал на чистом ASM. А знаете, я еще на КР580ВМ80А писал копировщик, который на вход принимал данные с магнитофона, и тут же этот бит выдавал на выход. Так мы «защищенные» от копирования игры на БК-0010, полученные на кассетах из ногинск-7 копировали :)
Тестируйте. Ниже сгенерированный IAR'ом код. Необходимы только две таблицы — оконная функция (1024 32-битный числа, все могут быть 65536, вам она не нужна) и таблица корней из единицы (512 корней, каждый состоит из двух 32-битных чисел, значения в интервале от -65536 до 65536, первый — {65536, 0}, второй — {65534, 402} и т.д., чтобы было понятно). В принципе, если скорость не зависит от исходных данных, скорее всего и от корней зависеть не будет, можно взять любые данные, может можно от ST адаптировать.
У меня есть работающий макет, выводящий данные на дисплей 40х8 точек, время выполнения замерял как программно, так и осциллографом.
Можете начать с замера скорости работы вашей библиотеки.
Позже, глючный компаратор 554CA3 на входе с мафона меняли, кстати, на 564ЛН2. Работало надежнее.
1. «У меня ВСЕ есть. Все работает круто. Там… Где-то… внутри… может», Я вообще гений, пока, впрочем, непризнанный" — я оцениваю такой расклад в 0%.
2. ASM код от ST как и было изначально мной оценено НА ПОРЯДОК уделывает Ваши студенческие изыски в этом направлении — я оцениваю такой расклад в 100%. И я понимаю, что потратить кучу нервов и сил, вникая в алгоритмы FFT (Вы ведь вникали, а не содрали код, изменили названия переменных) и тут первой же ссылкой тебя, крутого программера, с облаков опускают на грешную землю.
PS. Простите, я и так много тут написал, но я такое уже видел BolgenOS :):):):):):):):):)
Вам был предоставлен кусок кода. Вы провели тестирование? Где результаты? Конкретные числа. Я свои предоставил.
Похоже, вы забыли принять лекарства. Мой алгоритм работает ровно так, как надо мне, за время, которое меня полностью устраивает, даже, в принципе, быстрее. И я очень рад, что потратил время и разобрался в преобразовании Фурье лично, а не содрал алгоритм — это одно из фундаментальных преобразований, используемых в математике и вычислительной технике, считаю его понимание важным.
На этом предлагаю вам остановить поток сознания и вернуться к вашим гирляндам и красивым окнам, ибо беспредметных разговоров вести желания не имею.
Микрофонный усилитель используется готовый и подключается 3 проводниками. Проще некуда.
Я этот код видел под GNU GPL. И даже на автора могу ссылку дать.
Спорим, что Вы порт для выдачи данных с А7 на соседний порт (A5 например) не сможете перенести? — у Вас вся логика программы слетит :). SPI DMA там ведь не прокатит.
PS. В этом проекте Вашего труда чуть (аналоговая схема — да, такого я не встречал, но излишне сложна, считаю бесполезна. Другие делают проще. Плата микрофона, случайно, такая же как у Алекса Гайвера. Код для захвата (оцифровки) AUDIO — думаю, что код заимствован GNU GPL, FFT — не свое от STM, WS2812b DMA SPI — тоже GNU GPL). Если бы так же меркантильно думал Roger Clark, с надеждой продавать STM32 arduino, то Вы бы с помощью delay() делали бы задержки :) Но нет, там огромный труд, позволяющий легко и просто работать со сложным ARM железом в привычной среде. И все открыто и, более того, автор еще и активно все это развивает на общественных началах.
Вот эти видео: www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#cylon
У меня есть открытый проект на Github.
Этот проект сборка указанного проекта в одну STM32. Смотрите.
Если вам принципиален открытый проект возьмите его и переложите на любой процессор сами.
Информация по лицензии DSP LIB
В вашей программе для STM32 основная фишка — использование DMA и SPI интерфейса для выдачи данных на ленту в фоновом режиме. Этот код в коммерческих проектах Вы не можете использовать и обязаны публиковать любые разработки, в которых данный код заимствуется. Связываться с закрытым кодом не хочу.
Главное чтобы проектов было больше и у каждого был выбор.
Я ссылку на тестирование FFT дал (ее тут стерли) www.stm32duino.com/viewtopic.php?t=1145 — вот есть тестовый пример, что мешает тому, кто жалобы строчит, по аналогичной общепринятой методике свой «великий код» протестировать? Заодно и правильность результатов проверить?
А по поводу, AndyBig, Ваших разработок — toster.ru/q/374189
Тогда давайте ссылку на конкретный пост с тестированием, где вычисление FFT для массива на 1024 значения занимает меньше 0.5 миллисекунды. Мне не улыбается лопатить все страницы темы по ссылке.
Вы не ответили на вопрос. Или это Ваш вопрос по ссылке и Вам 17 лет? Тогда это многое объясняет.
(Я сразу говорил, что полностью согласен с этим мнением: After testing various C FFT routines, including FHT, real-FFT, CMSIS libraries, and finding them all to be too slow to run real-time 38khz audio FFTs with a size of 1024 on the STM32F103C,I finally figured out how to make the Arduino environment accept assembly functions.)
Вы, видимо, не понимаете английский (тогда что Вам в этой профессии делать ?). По приведенной ссылке
www.stm32duino.com/viewtopic.php?f=3&t=1145
в первом же посте все есть — сама FFT библиотека + header, а так же проект, который ее тестирует — cr4_fft_1024_stm32.s + cr4_fft_1024_stm32.h + arduino sketch). Скетч, выводит результат преобразования на экранчик ILI9341 только что бы любой желающий смог визуально оценить результаты вычисления FFT). Тестирование идет именно по описанной мой методике — формируется «синус» определенной частотой во входном буфере и рассчитывается выходной. Еще результат на экран выводится, что уже не так важно.
Лицензия требует предоставления исходного кода продукта, основанного на коде GPL («В общем случае распространитель программы, полученной на условиях GPL, либо программы, основанной на таковой, обязан предоставить получателю возможность получить соответствующий исходный код» )? — заметьте, кусочек GNU GPL кода Вы включили, а выложить должны весь проект — в этом и суть свободного ПО, каждый вносит посильный вклад, а польза всем :)
И там же указано время выполнения — 2 мс, что никак не на порядок быстрее 5 мс. К тому же отличие в разрядности вычислений существенное.
Я вроде задал простой вопрос, а Вы уже второй пост рассказываете мне что такое GNU GPL.
Ардуина, также, как и STM — вполне автономный микроконтроллер. Ардуина не хуже и не лучше STM умеет управлять лентой WS2812.
Или имеется в виду, что у вас STM запрограммировался сам по себе, без наличия ПК, исключительно силой мысли?
Словом, странный тезис, не имеющий под собой никакого смысла.
Ну и DTMF вроде другим, более эффективным алгоритмом обрабатывались :)
И исходники на тот проект выложены. И для Arduino и для ПК.
1. Мало быстродействия (ну тут еще вопрос, может один канал 32 КГц и реально, если все оптимизировать).
2. Мало ОЗУ
Видел на ютубе проект БПФ на AVR длиной 128 сэмплов, но для полноценного спектра звука надо 1024.
alexgyver.ru/colormusic/
Сделал себе один в один — красотища!!!
На тех дискотеках, где бывал юношей в 70-х — 80-х, как-то совершенно не отложилась в памяти особая прелесть попадания цвета в такт музыке.
То-ли потому, что преимущественно уже хорошо под газом туда попадал, то-ли кроме девчонок ничего там не интересовало, а может и вовсе дискотечная попса того времени просто абсолютно в душе не резонировала...)
Не нужно сразу набрасываться, человек все таки старался…
Кнопки не паял. Пользуюсь приложением.
Эх…
К чему я.
Люди, кто-нибудь, дайте рабочий алгоритм выявления BPM или хотя бы сильных долей музыки на микроконтроллере, а?
То, что любой пятилетний ребёнок делает без труда на утреннике, притопывая в такт музыке, на микроконтроллерах в реалтайме, насколько я могу судить, до сих пор ещё не реализовано…
НЧ составляющая в фонограмме присутствует и от других инструментов, поэтому ритм из нижних частот выделять — это утопия.
Бóльшая часть роковых композиций, к примеру, во вступлении вообще не имеет бочки или барабанов. Например, только одни гитарные рифы. Или только хет и тарелки. Или только гитарный перебор. Однако уже со вступления песни мы легко можем начать притопывать ногой или прихлопывать рукой в такт музыке. Безо всяких НЧ-составляющих.
Я ж говорю не об искусственном интеллекте для сочинения музыкальных партитур. Творчество — да, продукт исключительно интеллекта.
Но я-то всего лишь о выделении такта из ритмичной музыки, это куда более простая вычислительная задача, причём на PC реализованная во множестве исполнений :)
до потопа не было зимы и весь календарный период назывался летом
а педевикия твоя врет, там не сотворение мира как человечества, а мир в плане перемирия после войны с китайцами
мир имеет 5 значений и раньше записывался через 5 разных букв и, пока в 17м году не провели реформу и не выкинули лишние 3 штуки
б. автокорреляционная функция над огибающими — получили ритм
Как видите, никакой привязке к частотам. ))… и ритм может восстанавливать.
Можно и аппаратно, если лениво писать довольно простой код — 564ГГ1 по огибающей (выпрямленному). Но придется подавлять «ритм» в отсутствии музыки.
Вот именно, как раз, с АКФ и проблема. Знаний матухи не хватает. И про Хинчина с Колмогоровым я почти ничего не знаю :)
Вы сумеете изобразить это в действующем скетчике?
Сдвиг на 0 — полное совпадение. Сдвиг на 1 { F(1) } — получили меньше, еще… и т.д.
Вначале результат будет уменьшаться, затем повышаться, потом снова уменьшаться и снова подниматься. Так вот — самый первый горб (кроме 0) — это и есть период повтора функции (ритм). А его высота — мера интенсивности этого ритма. Ничего сложного.
По похожему алгоритму работал русский АОН, а там ой-ой какой гадкий и шумный сигнал.
Так что — почаще оцифровывайте, будет четче результат. И на ARMе конечно.
2. Даже если его выделить, сложнее решить что с этим ритмом делать. Что зажигать и на сколько, и что делать с остальной информацией. И главный вопрос будет ли это красиво на большинстве музыкальных композиции.
Я в проекте с проекте с Ардуинкой приглашал писать свои варианты обработки. Никто не откликнулся.
Кому нужны исходники может посмотреть проект на Arduino + FFT для STM на диске вместе с прошивками. Я по просьбе своих коллег положил два проекта в одну STM и добавил управление со смартфона.
Памяти хватит, просто возьмите не_AVR и ограничте частоту сверху — ритм на 10кГц не возможен (т.к. издевательство над человеком).
Из того, что делал — определение сигнала «занято» — вводными были диапазон тона 300-1500Гц (вместо халявных 425) и ритм занято а-бы-какой с непонятной скважностью и стабильностью параметров. И это на фоне разговора. Оно работало.
/disconnect
попробовал представить себе, как можно притоптывать в такт гитаре или саксофону
подкинь что ли примеров
Я сам, собравший не одну ЦМП разной сложности, и, как и большинство радиолюбителей той поры, прочитывающий «Радио», могу сказать, что те «аналоговые» и «тёплые» тоже не были панацеей. Прежде всего, потому, что утомляли зрителя довольно быстро. Именно поэтому тот же «Радио» не гнушался публикациями цветомузыкальных оргáнов и цветомузыкальных клавиатур — все понимали, что в световом сопровождении музыки альтернативы человеку пока нет.
Я сам в конце восьмидесятых ушёл от голого аналога в ЦМУ к дискретным элементам: генератор на логических элементах+счётчик+ПЗУ и выход на тиристоры. Даже такая конструкция в визуальном смысле тогда смотрелась куда выигрышнее, чем голый аналог после трёх-четырёх фильтров, поскольку в ПЗУ вшивались уже всякие «бегущие огни», «рассыпания», мигания и прочее.
Сегодняшние светодиодные технологии — да, позволяют ещё более разнообразить цветовую картину: ведь тогда, со всеми светофильтрами, цапонами и пастой от шариковых ручек, мы даже близко не могли достичь такой цветовой палитры. Так что зря вы так уж сильно ностальгируете по «тёплому аналоговому», WS2812 куда более вариативна и выразительна, чем N-канальные ЦМУ с лампами накаливания. Но проблема осталась там же и практически не сдвинулась за все эти годы — полностью автоматизировать процесс светового визуального сопровождения музыки всё равно удачно не получается. На любой концертной площадке работает DMX-светотехника, которую программируют люди.
Я, вероятно, в авангарде этих самых утомляемых зрителей до сих пор)
Ещё до расцвета диктуемой журналом «Радио» моды на ЦУ, собирал в старших классах тиристорную.
Однако балдеть под мигающие в такт музыке три цветные лампочки дома почему-то ни разу не довелось) Как-то наоборот, своей искусственной примитивностью убивали тогда весь кайф от прослушивания излюбленного арт-рока)
лохотрон, гомеопатия, астрология, телекинез, левитация!)))Встречный вопрос.
Вытекающий из контекста комментариев к этому обзору.
Мои реплики:
— вот это всё, в общем и целом, не натолкнуло вас на мысль, что я «немножечко в теме»?
Т.е. написав свою реплику, вы всерьёз полагали, что про существование фонового канала в ЦМУ я вот за эти несколько десятилетий ни разу не слышал?
И только вы сейчас, в конце второго десятилетия 21-го века, мне вдруг открыли эти сокровенные знания? :)
Ну, спасибо, чо :)
я когда был тупым школьником, то тоже делал на тиристорах
спасли только стеклянные колпаки от промышленной сду (походу это были колпаки как на ментовских мигалках) + снег на подоконнике, который служил рассеивающим экраном
с улицы нереально круто смотрелось, цвета сочнейшие, светодиоды не тянут такой динамический диапазон по цвету, хоть тоже он и насыщен
Чтобы mqtt понимало через esp-шку или по блутусу интерфейс какой-нить?
Буфер желающие могут подобрать сами из имеющегося в наличии хлама. В китайском контроллере SP105E (на STM32) в качестве буфера стоит 74HC245. Этот буфер по входу точно такой же как и WS2812B — 4.5*0.7=4.15
Меньше не больше и мы не калибры собираем.
Вроде дешевле уже некуда.
И+, и спасибо, и молодец!
Пока делаю доработки по просьбам пользователей.
В планах сделать поинтересней последние 4 программы.
Прошу прощения в описании перепутал B8 и B9.
B9 — замкните на G для изменения количества светодиодов и удерживайте до выполнения изменения.
B8 — замкните на G для сохранения установленного режима.
или чуть подождите исправлю прошивку под описание и добавлю прошивки на разное количество светодиодов.
Вечером обновлю программу под Android.
Меня попросили кое что добавить и я временно удалил прошивки.
Видео изменения количества светодиодов положил в папку с прошивками.
Нажимаете и держите кнопку — яркость увеличивается. Для уменьшения отпустите кнопку и снова нажмите и держите — яркость уменьшается. Каждый раз при отпускании кнопки меняется направление изменения.
Шаг изменения количества светодиодов (кнопка на контакте B8): 30,60,72,90,120,144,150,180,210,216,240,300.
Эффекты добавлю. (Только ремонт в детской доделаю). Пока предлагайте варианты, лучше на сайте цветомузыка.
Сайт размещён на сервере у меня дома и не всегда включён (по ночам выключаю).
Если есть желание могу сделать группу в Facebook.
Это отвечает контроллер таким образом связь есть.
На все команды так отвечает?
В терминалке после команды поставьте коды $0D$0A (возврата и перевода строки). AT+H$0D$0A.
Как на картинке.
Последние четыре музыкальные программы доработаю. Написал их на скорую руку (что бы были задействованы все кнопки), к новому году переделаю.
Может что то надо на STM32 переключить?
AT,H-английские символы?
!!!!!Все символы вводить только на Английском.!!!
С работы приду, сниму видео.
В файле «readme» все команды «АТ», или еще что нибудь можно менять?
Еще бы добавить «Плавность» регулируемую, как в музыкальные так и в динамические.
2. В динамической есть темп. Или вы что то другое имеете ввиду?
Добавил на google диск тестовую прошивку MCmic.HEX — в данной прошивке при работе в динамическом режиме реализована функция включения/выключения ленты по хлопку.
Данная функция работает(должна работать) при не очень высоком уровне шума в помещении.
Прошивка тестовая и лента может не всегда корректно включаться и выключаться.
Жду откликов на корректность работы данной функции.
vk.com/club171670176
Удобнее вопросы задавать.
Добавляйте динамические программы в список воспроизведения из терминалки или с помощью новой кнопочки ADD в приложении (начиная с версии 1.5 от 03.10.18). В терминалке можно просмотреть список, добавить в конец списка или в конкретную позицию, удалить из списка. Перед выключением питания не забудьте сохранить список, команда AT+W в терминалке или кнопочка SAVE в приложении, иначе изменения будут потеряны.
При нажатии кнопки ADD в конец списка добавляется текущая динамическая программа.
Так вы сможете выбрать для воспроизведения именно те программы которые вам нравятся и в том порядке в котором вы их вводите.
Список может содержать до 256 программ.
Можно вводить так (всегда меняем одну цифру)
AT+A0,0$0D$0A enter
AT+A1,0$0D$0A enter
AT+A2,0$0D$0A enter
AT+A3,0$0D$0A enter
…
AT+A20,0$0D$0A enter
AT+A0,1$0D$0A enter
AT+A1,1$0D$0A enter
AT+A2,1$0D$0A enter
если вводить в таком порядке то будут чередоваться именно программы, так как вторая цифра(0..7) изменяет цветовое решение программы.
Порядок удаления программы
Если вам не нравится какая либо программа, установите её c помощью «крутилок», запомните её двузначный номер например: 19,4
Выведите список программ командой
AT+P$0D$0A
0,0,1
1,1,1
2,8,3
3,3,2
4,11,1
5,19,4 — программа которую мы хотим удалить 19,4 пятая (5) в списке
6,…
…
AT+D5$0D$0A удалится 5 программа из списка
Из программы под android добавить в список очень просто, «крутилками» устанавливаем программу и нажимаем кнопочку ADD. Программа добавится в конц списка воспроизведения.
Список может включать до 256 программ.
!!!
Добавил на google диск тестовую прошивку MCmic.HEX — в данной прошивке при работе в динамическом режиме реализована функция включения/выключения ленты по хлопку.
Данная функция работает(должна работать) при не очень высоком уровне шума в помещении.
Прошивка тестовая и лента может не всегда корректно включаться и выключаться.
Жду откликов на корректность работы данной функции.
vk.com/club171670176
Удобнее вопросы задавать.
p.s. да можно поднять документацию и написать самому, но это займет больше времени, а его не так уж много.
С Новым Годом.
Где можно почитать: какая кнопка ( B3...B9 ), что делает?
Возможно что либо изменено?
Ясно.
С Рождеством !!!