ARDUINO Анализатор аудиоспектра. Обсуждение проекта

novvel

★★★✩✩✩✩
29 Сен 2018
568
191
@Fеnix, Тут я не скажу, я не программист, может и не хватает, попробуй другую конфигурацию с 300 диодами, например поменять вертикаль и горизонталь, будет ли зависать? Еще как вариант что там максимум 16 полос можно использовать, я не знаю как оно масштабируется. Ну и проверить оригинальную прошивку из этой темы выше, но исправленную для правильного расчета вертикаль-горизонталь, в ней только фиксы без моих фантазий и улучшений)) https://community.alexgyver.ru/threads/analizator-audiospektra-obsuzhdenie-proekta.728/post-57143.
 

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
Привет! Поэкспериментировал с платой WAVGAT UNO (lgt8f328p)... Путем не сложной манипуляции с прескалером получил частоту дискретизации под 70 кГц. С лихвой хватит на обработку аудиосигнала. Тактовая частота - внутренний генератор 32 мГц
1622755688059.png
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
@maxlab, Это отлично, но лучше сразу напишите какое ядро используете. Не все варианты позволяют выбрать частоту отличную от 20мГц
 

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
Ядро взял отсюда https://github.com/dbuezas/lgt8fx
Установку делал в два этапа. Сначала как там написано. Это будет "ванильная" версия 1.0.6
Потом делаем замещение системной папки lgt8f на текущую версию из ГитХаба. Все корректно работает, в т.ч и выбор способа и частоты тактирования контроллера. На максимальной частоте (32 мГц) проверил работоспособность стандартной библиотеки FastLED. Тоже работает... NeoPixel не взлетит. Там нет определений для 32 мегагерцовых камней. В любом случае, вне зависимости от того какое ядро используется для компиляции, камень lgt8f328p позволяет в рунтайме управлять источниками тактирования и другой периферией на борту с помощью небольших ассемблерных вставок или прямой манипуляцией с регистрами из С.
 
  • Лойс +1
Реакции: novvel

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
@novvel,
Ну... туда только готовую конструкцию можно выложить, если я правильно понимаю правила форума. Пока нечем хвастаться, только приступил к адаптации на lgt8f328p.
 
  • Лойс +1
Реакции: novvel

novvel

★★★✩✩✩✩
29 Сен 2018
568
191
@maxlab, ну тогда как сделаешь выкладывай, интересно посмотреть как будет работать.
 

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
В принципе... завелось, практически без модификации авторского кода. Позже с матрицами CJMCU8*8 побалуюсь.Есть 2 штуки, попробую 8Х16.
1622922161084.png
 

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
@novvel, лента едет из Китая :). Пока подручными материалами пользуюсь. Но, ИМХО, использовать signal processing на дуньках для профессионального отображения спектра - полная фигня. 256 точек мало...Это показометр получится. Лучше аудиосигнал пропустить через гребенку аналоговых фильтров с нужной резонансной частотой и добротностью, а потом на ацп и на ленты это все скинуть. Паять немного больше, зато качество и адекватность визуализации. Сетку можно такую https://pop-music.ru/upload/medialibrary/4d7/4d7023a4f51866e9748c155d602a5f62.jpg. Вот здесь почти взаправдашняя картинка спектра
, но на жирном STM32
 
Изменено:

novvel

★★★✩✩✩✩
29 Сен 2018
568
191
@maxlab, это все понятно, я пытался делать аналоговую версию, но так и не хватило терпения и деталей в детстве, потом сделал на атмеге, и сейчас вот на дуньке и адресных, пока это самый удачный вариант с точки простоты и качества. Точность уже неплохая в моей версии прошивки.
 

kDn

★★★★★✩✩
18 Ноя 2019
1,109
437
Вот здесь почти взаправдашняя картинка спектра
Ну у нас в лампе проверка звуковым генератором в диапазоне 70...20000 тоже показывает вполне ожидаемый результат для esp8266. :)
Я по полосам раскладываю как-то так (для 16 полос), второй столбец - частота, последний - полоса:
0 70,3125 4,25294959239874 -3,52773284766596E-07 0
1 140,625 4,94609677295868 1,9999996205272 1
2 210,9375 5,35156188106685 3,1699246063513 2
3 281,25 5,63924395351863 3,99999959382768 3
4 351,5625 5,86238750483284 4,64385577500708 4
5 421,875 6,04470906162679 5,16992457965178 5
6 492,1875 6,19885974145405 5,6147094163869 5
7 562,5 6,33239113407858 5,99999956712817 5
8 632,8125 6,45017416973496 6,33984956547588 6
9 703,125 6,55553468539278 6,64385574830757 6
10 773,4375 6,65084486519711 6,91886279213616 6
11 843,75 6,73785624218674 7,16992455295226 7
12 914,0625 6,81789894986028 7,40087898470895 7
13 984,375 6,892006922014 7,61470938968739 7
14 1054,688 6,96099979350095 7,81378073413166 7
15 1125 7,02553831463852 7,99999954042865 7
16 1195,313 7,08616293645496 8,17492522059411 8
17 1265,625 7,1433213502949 8,33984953877636 8
18 1335,938 7,19738857156518 8,49585456069627 8
19 1406,25 7,24868186595273 8,64385572160805 8
20 1476,563 7,29747203012216 8,78463437551149 8
21 1546,875 7,34399204575706 8,91886276543664 8
22 1617,188 7,38844380832789 9,04712343856382 9
23 1687,5 7,43100342274669 9,16992452625275 9
24 1757,813 7,47182541726694 9,28771190278745 9
25 1828,125 7,51104613042022 9,40087895800943 9
26 1898,438 7,54878645840307 9,50977452460046 9
27 1968,75 7,58515410257394 9,61470936298787 9
28 2039,063 7,62024542238521 9,71596150777612 9
29 2109,375 7,65414697406089 9,81378070743215 9
30 2179,688 7,68693679688389 9,90839213572582 9
31 2250 7,71868549519847 9,99999951372913 9
32 2320,313 7,74945715386522 10,0887877512607 10
33 2390,625 7,7793101170149 10,1749251938946 10
34 2460,938 7,80829765388815 10,2585655441673 10
35 2531,25 7,83646853085485 10,3398495120768 10
36 2601,563 7,86386750504296 10,4189062393947 10
37 2671,875 7,89053575212512 10,4958545339968 10
38 2742,188 7,91651123852839 10,5708039438335 10
39 2812,5 7,94182904651268 10,6438556949085 10
40 2882,813 7,96652165910305 10,7151035134188 10
41 2953,125 7,99061921068211 10,784634348812 10
42 3023,438 8,0141497080923 10,8525290117523 10
43 3093,75 8,037139226317 10,9188627387371 10
44 3164,063 8,05961208216906 10,9837056932562 10
45 3234,375 8,08159098888783 11,0471234118643 11
46 3304,688 8,1030971941088 11,1091772022772 11
47 3375 8,12415060330663 11,1699244995532 11
48 3445,313 8,14476989050937 11,2294191855471 11
49 3515,625 8,16497259782689 11,2877118760879 11
50 3585,938 8,18477522512307 11,3448501797187 11
51 3656,25 8,20419331098017 11,4008789313099 11
52 3726,563 8,22324150595086 11,4558404034204 11
53 3796,875 8,24193363896301 11,5097744979009 11
54 3867,188 8,26028277763121 11,5627189199165 11
55 3937,5 8,27830128313389 11,6147093362884 11
56 4007,813 8,29600086023329 11,6657795198209 11
57 4078,125 8,31339260294516 11,7159614810766 11
58 4148,438 8,33048703630446 11,7652855888867 11
59 4218,75 8,34729415462084 11,8137806807326 11
60 4289,063 8,36382345657205 11,8614741640047 11
61 4359,375 8,38008397744383 11,9083921090263 11
62 4429,688 8,39608431879027 11,9545593346361 11
63 4500 8,41183267575841 11,9999994870296 11
64 4570,313 8,42733686229438 12,0447351124893 12
65 4640,625 8,44260433442516 12,0887877245612 12
66 4710,938 8,45764221178971 12,1321778661806 12
67 4781,25 8,47245729757485 12,1749251671951 12
68 4851,563 8,487056096996 12,2170483976884 12
69 4921,875 8,5014448344481 12,2585655174678 12
70 4992,188 8,51562946944006 12,2994937220408 12
71 5062,5 8,5296157114148 12,3398494853773 12
72 5132,813 8,54340903354713 12,3796485997214 12
73 5203,125 8,55701468560291 12,4189062126952 12
74 5273,438 8,57043770593505 12,457636861912 12
75 5343,75 8,58368293268507 12,4958545072972 12
76 5414,063 8,59675501425242 12,5335725612963 12
77 5484,375 8,60965841908833 12,570803917134 12
78 5554,688 8,62239744486576 12,607560975273 12
79 5625 8,63497622707262 12,643855668209 12
80 5695,313 8,64739874707118 12,679699483725 12
81 5765,625 8,65966883966299 12,7151034867193 12
82 5835,938 8,67179020019534 12,7500783397101 12
83 5906,25 8,68376639124205 12,7846343221125 12
84 5976,563 8,69560084888906 12,8187813483745 12
85 6046,875 8,70729688865225 12,8525289850528 12
86 6117,188 8,71885771105332 12,8858864669007 12
87 6187,5 8,73028640687695 12,9188627120376 12
88 6257,813 8,74158596213088 12,9514663362606 12
89 6328,125 8,752759262729 12,9837056665567 12
90 6398,438 8,76380909891559 13,0155887538691 13
91 6468,75 8,77473816944778 13,0471233851648 13
92 6539,063 8,785549085552 13,0783170948504 13
93 6609,375 8,79624437466874 13,1091771755776 13
94 6679,688 8,80682648399928 13,1397106884766 13
95 6750 8,81729778386658 13,1699244728537 13
96 6820,313 8,82766057090212 13,1998251553865 13
97 6890,625 8,83791707106931 13,2294191588476 13
98 6960,938 8,84806944253333 13,2587127103853 13
99 7031,25 8,85811977838683 13,2877118493884 13
100 7101,563 8,86807010924 13,3164224349593 13
101 7171,875 8,87792240568301 13,3448501530192 13
102 7242,188 8,88767858062837 13,3730005230668 13
103 7312,5 8,89734049154011 13,4008789046104 13
104 7382,813 8,90690994255626 13,4284905032919 13
105 7453,125 8,91638868651081 13,4558403767209 13
106 7523,438 8,92577842686065 13,4829334400351 13
107 7593,75 8,93508081952296 13,5097744712014 13
108 7664,063 8,94429747462788 13,5363681160733 13
109 7734,375 8,95342995819115 13,562718893217 13
110 7804,688 8,96247979371107 13,5888311985193 13
111 7875 8,97144846369383 13,6147093095888 13
112 7945,313 8,98033741111108 13,6403573899616 13
113 8015,625 8,98914804079324 13,6657794931213 13
114 8085,938 8,99788172076199 13,6909795663442 13
115 8156,25 9,0065397835051 13,7159614543771 13
116 8226,563 9,0151235271965 13,7407289029581 13
117 8296,875 9,0236342168644 13,7652855621872 13
118 8367,188 9,03207308551027 13,7896349897543 13
119 8437,5 9,04044133518079 13,8137806540331 13
120 8507,813 9,04874013799548 13,8377259370456 13
121 8578,125 9,056970637132 13,8614741373052 13
122 8648,438 9,06513394777116 13,8850284725434 13
123 8718,75 9,07323115800378 13,9083920823268 13
124 8789,063 9,08126332970104 13,9315680305678 13
125 8859,375 9,08923149935022 13,9545593079366 13
126 8929,688 9,09713667885733 13,9773688341765 13
127 9000 9,10497985631836 13,9999994603301 13
128 9070,313 9,11276199676041 14,0224539708768 14
129 9140,625 9,12048404285432 14,0447350857898 14
130 9210,938 9,12814691559989 14,0668454625126 14
131 9281,25 9,13575151498511 14,0887876978617 14
132 9351,563 9,14329872062049 14,1105643298565 14
133 9421,875 9,15078939234965 14,1321778394811 14
134 9492,188 9,15822437083717 14,1536306523808 14
135 9562,5 9,16560447813479 14,1749251404956 14
136 9632,813 9,17293051822687 14,1960636236337 14
137 9703,125 9,18020327755594 14,2170483709889 14
138 9773,438 9,18742352552943 14,2378816026014 14
139 9843,75 9,19459201500804 14,2585654907682 14
140 9914,063 9,20170948277691 14,2791021614017 14
141 9984,375 9,20877665 14,2994936953413 14
142 10054,69 9,21579422265865 14,3197421296184 14
143 10125 9,22276289197474 14,3398494586778 14
144 10195,31 9,22968333481931 14,3598176355565 14
145 10265,63 9,23655621410708 14,3796485730219 14
146 10335,94 9,24338217917748 14,3993441446717 14
147 10406,25 9,25016186616285 14,4189061859957 14
148 10476,56 9,2568958983442 14,4383364954027 14
149 10546,88 9,26358488649499 14,4576368352125 14
150 10617,19 9,27022942921366 14,476808932615 14
151 10687,5 9,27683011324502 14,4958544805977 14
152 10757,81 9,28338751379117 14,5147751388433 14
153 10828,13 9,28990219481237 14,5335725345968 14
154 10898,44 9,29637470931799 14,5522482635062 14
155 10968,75 9,30280559964828 14,5708038904345 14
156 11039,06 9,30919539774705 14,5892409502471 14
157 11109,38 9,31554462542571 14,6075609485735 14
158 11179,69 9,32185379461897 14,625765362545 14
159 11250 9,32812340763257 14,6438556415095 14
160 11320,31 9,3343539573832 14,661833207724 14
161 11390,63 9,34054592763112 14,6796994570255 14
162 11460,94 9,3466997932055 14,6974557594814 14
163 11531,25 9,35281602022294 14,7151034600198 14
164 11601,56 9,35889506629932 14,7326438790411 14
165 11671,88 9,36493738075528 14,7500783130106 14
166 11742,19 9,37094340481549 14,7674080350335 14
167 11812,5 9,376913571802 14,7846342954129 14
168 11882,81 9,38284830732181 14,8017583221912 14
169 11953,13 9,388748029449 14,818781321675 14
170 12023,44 9,3946131489014 14,8357044789454 14
171 12093,75 9,40044406921219 14,8525289583532 14
172 12164,06 9,40624118689652 14,8692559039992 14
173 12234,38 9,41200489161327 14,8858864402012 14
174 12304,69 9,41773556632225 14,9024216719476 14
175 12375 9,42343358743689 14,9188626853381 14
176 12445,31 9,42909932497257 14,9352105480113 14
177 12515,63 9,43473314269082 14,951466309561 14
178 12585,94 9,44033539823949 14,967631001941 14
179 12656,25 9,44590644328895 14,9837056398572 14
180 12726,56 9,45144662366456 14,9996912211509 14
181 12796,88 9,45695627947553 15,0155887271696 15
182 12867,19 9,46243574524016 15,0313991231293 15
183 12937,5 9,46788535000772 15,0471233584653 15
184 13007,81 9,47330541747706 15,0627623671751 15
185 13078,13 9,47869626611194 15,0783170681509 15
186 13148,44 9,48405820925333 15,0937883655036 15
187 13218,75 9,48939155522869 15,1091771488781 15
188 13289,06 9,49469660745838 15,1244842937606 15
189 13359,38 9,49997366455923 15,1397106617771 15
190 13429,69 9,50522302044537 15,1548571009845 15
191 13500 9,51044496442652 15,1699244461542 15
192 13570,31 9,51563978130362 15,1849135190479 15
193 13640,63 9,52080775146207 15,199825128687 15
194 13710,94 9,52594915096249 15,2146600716139 15
195 13781,25 9,53106425162926 15,2294191321481 15
196 13851,56 9,53615332113673 15,2441030826344 15
197 13921,88 9,54121662309328 15,2587126836858 15
198 13992,19 9,54625441712323 15,2732486844198 15
199 14062,5 9,55126695894678 15,2877118226889 15
200 14132,81 9,55625450045781 15,3021028253052 15
201 14203,13 9,56121728979994 15,3164224082598 15
202 14273,44 9,56615557144053 15,3306712769363 15
203 14343,75 9,57106958624296 15,3448501263197 15
204 14414,06 9,57595957153715 15,3589596411992 15
205 14484,38 9,58082576118832 15,3730004963673 15
206 14554,69 9,58566838566411 15,386973356813 15
207 14625 9,59048767210006 15,4008788779109 15
208 14695,31 9,59528384436355 15,4147177056057 15
209 14765,63 9,60005712311621 15,4284904765923 15
210 14835,94 9,60480772587481 15,4421978184915 15
211 14906,25 9,60953586707075 15,4558403500214 15
212 14976,56 9,61424175810816 15,4694186811654 15
213 15046,88 9,61892560742059 15,4829334133356 15
214 15117,19 9,6235876205264 15,4963851395326 15
215 15187,5 9,6282280000829 15,5097744445019 15
216 15257,81 9,6328469459392 15,523101904886 15
217 15328,13 9,63744465518783 15,5363680893738 15
218 15398,44 9,64202132221524 15,549573558846 15
219 15468,75 9,6465771387511 15,5627188665175 15
220 15539,06 9,65111229391649 15,5758045580763 15
221 15609,38 9,65562697427102 15,5888311718198 15
222 15679,69 9,66012136385886 15,6017992387871 15
223 15750 9,66459564425378 15,6147092828893 15
224 15820,31 9,66904999460316 15,6275618210366 15
225 15890,63 9,67348459167103 15,6403573632621 15
226 15960,94 9,67789960988014 15,6530964128435 15
227 16031,25 9,68229522135318 15,6657794664218 15
228 16101,56 9,68667159595298 15,6784070141177 15
229 16171,88 9,69102890132194 15,6909795396447 15
230 16242,19 9,69536730292053 15,7034975204209 15
231 16312,5 9,69968696406505 15,7159614276776 15
232 16382,81 9,70398804596444 15,7283717265653 15
233 16453,13 9,70827070775644 15,7407288762586 15
234 16523,44 9,7125351065429 15,7530333300575 15
235 16593,75 9,71678139742435 15,7652855354876 15
236 16664,06 9,72100973353387 15,7774859343976 15
237 16734,38 9,72522026607021 15,7896349630548 15
238 16804,69 9,72941314433025 15,8017330522389 15
239 16875 9,73358851574073 15,8137806273336 15
240 16945,31 9,73774652588939 15,8257781084163 15
241 17015,63 9,74188731855543 15,8377259103461 15
242 17085,94 9,74601103573929 15,8496244428496 15
243 17156,25 9,75011781769194 15,8614741106056 15
244 17226,56 9,75420780294347 15,8732753133275 15
245 17296,88 9,7582811283311 15,8850284458439 15
246 17367,19 9,76233792902672 15,8967338981785 15
247 17437,5 9,76637833856372 15,9083920556273 15
248 17507,81 9,77040248886345 15,9200032988347 15
249 17578,13 9,77441051026099 15,9315680038683 15
250 17648,44 9,77840253153052 15,9430865422919 15
251 17718,75 9,78237867991016 15,954559281237 15
252 17789,06 9,78633908112626 15,9659865834733 15
253 17859,38 9,79028385941728 15,977368807477 15
254 17929,69 9,79421313755716 15,9887063074991 15
255 18000 9,7981270368783 15,9999994336306 15
 

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
@kDn,
А почему в Вашей схемотехнике отсутствует смещение Uref/2 на входе АЦП? Да и в умных книжках по DSP рекомендуют хотя бы простейший ФНЧ из RC цепочки. А я бы дальше пошел... подмешал бы на вход немного белого шума с простейшего генератора на стабилитроне. Разрядность АЦП ведь маленькая на ESP8266, да и на дуньках тоже.
1623233648719.png
 

kDn

★★★★★✩✩
18 Ноя 2019
1,109
437
@maxlab, своих шумов и так хватает, так что дополнительно подмешивать не нужно, я наоборот добавлял программную фильтрацию младших битов по необходимости. Фильтр поставить можно и даже желательно, чтобы не было алиасинга в случае, если период семплирования не соответствует верхней границе принимаемого сигнала, но для упращения на это положен болт и опять же программная компенсация, все равно рекомендуемая верхняя граница 18000 или 20000, а там уже частоты давятся АЧХ самого микрофона (если не раньше). Также напоминаю о том, что у нас реализовывалось все под микрофон с предусилителем и АРУ из коробки, который имеет строго оговоренный выходной сигнал который практически полностью подходит к тому, что ожидается на входе NodeMCU/Wemos, если собирать на голом ESP12F, то естественно нужно не забыть добавить делитель, а так - он уже есть. :) , некоторое небольшое смещение нулевой точки компенсируется опять же программно:
1623234576814.png
 

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
Немного накидал кода... До шедевральности еще далеко, но через тон-генератор полоски четко показывает. от 0 до 20 кГц квантует по умолчанию

скетч:
//WAVGAT UNO R3 with LGT8F328P (32 mHz)

#define FHT_N 256
#define LIN_OUT 1
#include <FHT.h>
#include <FastLED.h>

#define ANALOG_IN    A0
#define DIN_PIN      8

#define COLUMNS 16
#define LEVELS 8
#define NUM_LEDS COLUMNS*LEVELS
#define BRIGHTNESS 35
CRGB leds[NUM_LEDS];

#define GAIN 1

int v_array[COLUMNS];
double equaliser[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

void setup()
{
  pinMode(ANALOG_IN, INPUT);
  analogReference(INTERNAL1V024);
  analogReadResolution(12);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.clear();
  FastLED.show();
}

void loop()
{
  FastLED.clear();
  runFHT();
  runPrepareArray();
  runDisplay();
  FastLED.show();
}

void runDisplay()
{
  for (byte c = 0; c < COLUMNS; ++c) {
    for (byte l = 0; l < v_array[c]; ++l ) {
      leds[c*LEVELS+l].setRGB( 0, 255, 0);;
    }
  }
}

void runPrepareArray()
{
  int step = (FHT_N/2) / COLUMNS;
  int c=0;
  for(int i=0; i<(FHT_N/2); i+=step)
  {
    for (int k=0 ; k< step ; k++) v_array[c] = v_array[c] + fht_lin_out[i+k];
    v_array[c] = (v_array[c]/step) * equaliser[c];
    v_array[c]= constrain(v_array[c],0,80);      
    v_array[c] = map(v_array[c], 0, 80, 0, LEVELS);
    c++;
  }

}

void runFHT()
{
  for (int i = 0 ; i < FHT_N ; i++) {
    fht_input[i] = (analogRead(ANALOG_IN)-2048) * GAIN; // minus Uref/2 for resolution 4096 (12b)
  }
  fht_window();  // window the data for better frequency response
  fht_reorder(); // reorder the data before doing the fht
  fht_run();     // process the data in the fht
  fht_mag_lin(); // take the output of the fht
}
 
  • Лойс +1
Реакции: kostyamat

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
Кое что получилось...
1623458443750.png
Осталось пики отловить и плавнее ход сделать. Пока в библиотеке FastLED не силен.
Реализовал два раздельных канала (L+R) по 8 полос с октавным интервалом. Для FHT этот режим
самый лучший на мой взгляд. Полосы расположены симметрично.
8 band 2 channel 32 mHz cpu clock:
//WAVGAT UNO R3 with LGT8F328P (32 mHz)

#define FHT_N 256
#define OCTAVE 1
# define OCT_NORM 1
#include <FHT.h>
#include <FastLED.h>

#define ANALOG_IN1    A0
#define ANALOG_IN2    A1

#define DIN_PIN1      8
#define DIN_PIN2      9

#define LOW_PASS 60

#define COLUMNS 8
#define LEVELS 8
#define DEPTH 8
#define MAGIC_NUMBER 140

#define NUM_LEDS COLUMNS*LEVELS
#define BRIGHTNESS 25

CRGB leds_l[NUM_LEDS];
CRGB leds_r[NUM_LEDS];

bool channel = true;
int integrator_mass [DEPTH][COLUMNS];
int v_array[COLUMNS];
double equaliser[]  = {0.95, 0.9, 1, 1.05, 1.1, 1.2, 1.3, 1.6};

void setup()
{
  pinMode(ANALOG_IN1, INPUT);
  pinMode(ANALOG_IN2, INPUT);
  analogReference(INTERNAL1V024);
  analogReadResolution(12);
  FastLED.addLeds<WS2812B, DIN_PIN1, GRB>(leds_l, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.addLeds<WS2812B, DIN_PIN2, GRB>(leds_r, NUM_LEDS).setCorrection(TypicalLEDStrip);
}

void loop()
{
  runFHT();
  runPrepareArray();
  runIntegrator();
  runDisplay();
  channel = !channel;
}
void runDisplay()
{
  if (channel == true) {
    for (byte l = 0; l < LEVELS; ++l ) {
      for (byte c = 0; c < COLUMNS; ++c) {
        if ((l < v_array[c])) {
          if (l < 4) leds_l[l * LEVELS + c].setRGB( 0, 255, 0);
          else if (l > 3 && l < 6) leds_l[l * LEVELS + c] = CRGB::Yellow;
          else if (l > 5 ) leds_l[l * LEVELS + c] = CRGB::Red;
        }
        else
          leds_l[l * LEVELS + c].setRGB( 0, 0, 0);
      }
    }
  } else {
    for (byte c = 0; c < COLUMNS; ++c) {
      for (byte l = 0; l < LEVELS; ++l ) {
        if ((l < v_array[c])) {
          if (l < 4) leds_r[c * LEVELS + l].setRGB( 0, 255, 0);
          else if (l > 3 && l < 6) leds_r[c * LEVELS + l] = CRGB::Yellow;
          else if (l > 5 ) leds_r[c * LEVELS + l] = CRGB::Red;
        }
        else
          leds_r[c * LEVELS + l].setRGB( 0, 0, 0);
      }
    }
  }
  FastLED.show(BRIGHTNESS);
}

void runPrepareArray() {
  for (byte c = 0; c < COLUMNS; ++c) v_array[c] = fht_oct_out[c] * equaliser[c];
}

void runIntegrator(){
  double tempData = 0;
// Сдвиг конвеера лучше через указатели делать. Правда эту лекцию я прогулял :)
  for (byte d = DEPTH - 1; d > 0; --d) {
    for (byte c = 0; c < COLUMNS; ++c) {
      integrator_mass[d][c] = integrator_mass[d-1][c];
    }
  }
  for (byte c = 0; c < COLUMNS; ++c) {
    integrator_mass[0][c] = v_array[c];
    tempData = 0;
    for (byte d = 0; d < DEPTH; ++d) {
        tempData = tempData + integrator_mass[d][c];
    }
    v_array[c] = map(tempData / DEPTH, LOW_PASS,MAGIC_NUMBER,0,LEVELS); 
  } 
}

void runFHT()
{
  for (int i = 0 ; i < FHT_N ; i++) {
    if (channel == true) {
      fht_input[i] = (analogRead(ANALOG_IN1) - 2048);
    }
    else {
      fht_input[i] = (analogRead(ANALOG_IN2) - 2048);
    }
  }
  fht_window();
  fht_reorder();
  fht_run();
  fht_mag_octave();
}
}
Потом видео запилю
14.06.2021 - Обновил скетч. Подавил эффект стробоскопа без искусственных задержек. За счет накопительного буфера получился более-менее плавный ход. Еще один штришок...буфер магазинного типа, и для такого железа будет достаточно :)

16.06.2021 - Еще обновил скетч. Сделал интегратор на конвеере. Плавность хода полос самая лучшая. Дальше смысла нет это оптимизировать, для моей поделки достаточно. На досуге займусь аналоговыми фильтрами (14 каналов)...
 
Изменено:
  • Лойс +1
Реакции: kostyamat

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
Новый скетч выше, демонстрация здесь - https://cloud.mail.ru/public/xnsT/aZkpcVg86

Кстати, фоновая подсветка не мерцает. С ней даже прикольно смотрится. Нужно пару строчек в скетче подредактировать. В левом и в правом канале одинаковый цвет
1623962511073.png
Выглядит примерно так
1623962666011.png
 
  • Лойс +1
Реакции: KeyM, bort707 и kostyamat

bort707

★★★★★★✩
21 Сен 2020
2,859
850
Новый скетч выше, демонстрация здесь
классно, мне нравится.
Не пробовали прикинуть, какой получилась частота обновления картинки на матрицах?
И еще - полная схема входного каскада со всеми доработками где-нибудь выложена?
 

maxlab

★✩✩✩✩✩✩
9 Май 2021
24
14
Входные цепи без особенностей. По фото сможете нарисовать? Входные емкости по 1 мкФ, делитель по 10кОм. Подстроечниками точнее выставляется смещение. Но можно в коде подкрутить. Частоту обновления завтра измерим. Чтобы добиться плавной картинки кроме конвеера используется особенность зрения. "Развертка" на матрицах идет снизу в верх, зигзагом. Под это видеобуфер пришлось формировать соответствующим образом. Да... надо пару кондеров подкинуть параллельно постоянным резисторам. 1 мкФ будет достаточно
1623965444091.png
 
Изменено:

kDn

★★★★★✩✩
18 Ноя 2019
1,109
437
Не пробовали прикинуть, какой получилась частота обновления картинки на матрицах?
FastLED имеет внутренний счетчик, только сегодня о нем узнал, т.к. до этого использовали свой :)
C++:
FastLED.getFPS()
Так что можно не изобретать велосипедов и поглядеть значение возращаемое счетчиком (сверку с нашим он проходит, изредка расхождение в 1-2 кадра, из-за чуть упрощенного обсчета).
 
  • Лойс +1
Реакции: maxlab

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630
только сегодня о нем узнал,
???!!!
Так я ж его вставлял. Потом кто-то мой фпс-метр взял, и тупо випилил. А он раз в секунду именно возврат этой функции в сериал выводил.
Я свою функцию для отладки эффектов использовал. И кому она мешала? Ума не приложу.
 

kDn

★★★★★✩✩
18 Ноя 2019
1,109
437
Так я ж его вставлял. Потом кто-то мой фпс-метр взял, и тупо випилил.
Значит видимо вставили хрен знает как и куда, поэтому и был выкинут нафиг, но не волнуйтесь, я в последнем коммите вернул его взад, в правильном месте.