tag:blogger.com,1999:blog-23708951067238402382024-03-19T01:21:05.185-07:00Проект для Google ADK Open Call 2011Aleksey Zhurbitskyhttp://www.blogger.com/profile/11804273630040144732noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-2370895106723840238.post-46256771431958227102011-10-02T07:56:00.000-07:002011-10-19T04:11:34.881-07:00Демо<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWo2hgYaDLuv7_S23dnFSqOejef7FW8AdJNPcEQglugaqSuJZeCcY0O6njWWBk1XauX2PqtWFKqiud-pwGuhy-f_ehaNRRdOqeqPFvFloCpY6UMoObt9NNOBPlRynbG4vmgaeji4i5n4rP/s1600/DSC_0666.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" id=":current_picnik_image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqMZ5gMwuc1zmweSDm8pkzVMTzrkTqQAhLnptyfwfG_PX1qdwtIMOBuBG7R3gW6nXIRN30o0FeyWIIEAGPUf639kTmS3qKzsPqydM9AySSI4vsSjdgkl_GK7kFt6VtZ3cFa5KbBOkydckt/s200/16628687441_DFjV6.jpg" width="200" /></a></div>
Для полного закрытия проекта оставалось произвести оптимизацию обновления матрицы и соорудить подобие корпуса, чтобы спрятать провода и Arduino. <br />
<br />
<br />
<br />
<a name='more'></a>После внимательного прочтения даташита к используемому в матрице драйверу и изучения альтернативных библиотек была написана функция, которая обновляет весь фрейм. Скорость в результате выросла с 2-3 fps до 20 fps, чего вполне достаточно для моей задачи. В основном это оптимизация обращения к каждому из четырех драйверов.<br />
<br />
Корпус решил делать из оргстекла. Клеил дихлорэтаном и в противогазе :), как по мне, вышло довольно прилично. На видео показан корпус и процесс сборки<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/5fyPuvWf8L8?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Можно считать что проект готов!</div>
<br />
[1] <a href="https://github.com/azhurb/LedMatrix">Исходный код LedMatrix</a><br />
<br /></div>Aleksey Zhurbitskyhttp://www.blogger.com/profile/11804273630040144732noreply@blogger.com1tag:blogger.com,1999:blog-2370895106723840238.post-33033482011682383332011-09-02T05:20:00.000-07:002011-09-02T05:20:13.182-07:00Пробный запуск<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRPpni86_TGNw3sKAvMOLS5WLcOBZOSvlhvcF1eHH5EIy_9Uu0D10bc8LNjO7FCSAOSvJzfk3HeeO323oOGg-04dQr2zMciGqRZzVbiqjdE7R6Kn6kacMhIK1v86PflkHlgfzztg1Mm5BY/s1600/DSC_0052_.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRPpni86_TGNw3sKAvMOLS5WLcOBZOSvlhvcF1eHH5EIy_9Uu0D10bc8LNjO7FCSAOSvJzfk3HeeO323oOGg-04dQr2zMciGqRZzVbiqjdE7R6Kn6kacMhIK1v86PflkHlgfzztg1Mm5BY/s320/DSC_0052_.jpg" width="320" /></a></div>
Поскольку приезд ADK задерживается а в загашниках имеется Arduino и USB Host Shield, то грех было не попробовать собрать заменитель ADK и подружить матрицу с Android. На самом деле раньше я <a href="http://habrahabr.ru/blogs/android_development/123361/">уже собирал</a> заменитель ADK, там же описаны проблемы, с которыми я столкнулся, так что тут уже не будем поднимать эту тему, а поговорим о передаче данных и их кодировании.<br />
<a name='more'></a><br />
<br />
Итак, напомню, что у нас есть матрица размером 32х16 (512 светодиодов), способная отображать 3 цвета - зеленый, красный и оранжевый. Четвертый цвет - черный (светодиод погашен), т.е. для передачи состояния светодиода достаточно двух битов:<br />
00 - черный<br />
01 - зеленый<br />
10 - красный<br />
11 - оранжевый<br />
<br />
Выходит что в одном байте можно передать состояния четырех светодиодов, осталось всего лишь реализовать алгоритм кодирования и декодирования состояний четырех светодиодов в один байт, и тут на помощь приходят битовые операции<br />
<br />
<span style="font-size: large;">Android (кодирование):</span>
<br />
<pre><code class="java">
byte[] frame;
frame = new byte[128];
Arrays.fill(frame, (byte) 0);
/*...*/
// в циклах с перебором координат по X (i) и Y (z) и формированием color
frame[i * 4 + (int) z/4] = (byte) (frame[i * 4 + (int) z/4] | (color << (z % 4) * 2));
/*...*/
mActivity.sendCommand(frame);</code></pre>
<span style="font-size: large;">Arduino (декодирование):</span>
<br />
<pre><code class="cpp">
byte msg[128];
if (acc.isConnected()) {
int len = acc.read(msg, sizeof(msg), 1);
for (int i = 0; i < len; i++){
plot(i * 4 + 0, (msg[i] >> 0) & 3);
plot(i * 4 + 1, (msg[i] >> 2) & 3);
plot(i * 4 + 2, (msg[i] >> 4) & 3);
plot(i * 4 + 3, (msg[i] >> 6) & 3);
}
}</code></pre>
<br />
Сама работа с Usb Accessory взята из DemoKit приложения. Результат можно наблюдать на видео:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/4ntaT6R4nLY?feature=player_embedded' frameborder='0'></iframe></div>
<br />
Все-таки при перерисовке большой области заметны лаги, похоже следующий этап - оптимизация.<br />
<br />
[1] <a href="https://github.com/azhurb/LedMatrix">Исходный код LedMatrix</a><br />
[2] <a href="http://developer.android.com/guide/topics/usb/accessory.html">Android Open Accessory API</a></div>
Aleksey Zhurbitskyhttp://www.blogger.com/profile/11804273630040144732noreply@blogger.com0tag:blogger.com,1999:blog-2370895106723840238.post-8026018476127376572011-08-22T12:59:00.000-07:002011-08-22T12:59:03.632-07:00Светодиодная матрица от Sure Electronics<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiExm9uHuYCz6HQ4BgVCLgrelD5GItOHIJqfW_NMh6LrGyxYn1FqZ4TvvUVVSq19RK5iXOx36diqg8cAPouZjVv2JK2MOs7Z67SX6W4plMXjHwenjCsQns727iRXg8tLAi7mjWFrlc9vr91/s1600/arduino_matrix.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="149" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiExm9uHuYCz6HQ4BgVCLgrelD5GItOHIJqfW_NMh6LrGyxYn1FqZ4TvvUVVSq19RK5iXOx36diqg8cAPouZjVv2JK2MOs7Z67SX6W4plMXjHwenjCsQns727iRXg8tLAi7mjWFrlc9vr91/s200/arduino_matrix.jpg" width="200" /></a></div>
</div>
Недавно таки пришла посылка из Гонконга с заветной матрицей. Это практически моя последняя надежда потому как те электронные компоненты, из которых более-менее реально самостоятельно собрать аналогическую матрицу, продаются в Китае только оптом и с доставкой DHL, что подразумевает попадание на растаможку, выход за рамки бюджета и затягивание сроков.<br />
В этой части расскажу про проблемы, возникшие при подключении матрицы к Arduino.<br />
<br />
<a name='more'></a>Пара слов о посылке - был приятно удивлен стильной упаковкой, не ожидал такого от китайцев.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ2_-D5CiyxNYkWYbr9u-36-u7v0QwhyQFx3sbDAoJAo1-inHuKzH4KQHmcE9VnUBCdjIngwps1edQHT13Y7bEyc91lcgg5Gy6u7W8ELir-LJDGYdkBoOlMYkeqVgbiZeWl-79TbGaAn7n/s1600/sure.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ2_-D5CiyxNYkWYbr9u-36-u7v0QwhyQFx3sbDAoJAo1-inHuKzH4KQHmcE9VnUBCdjIngwps1edQHT13Y7bEyc91lcgg5Gy6u7W8ELir-LJDGYdkBoOlMYkeqVgbiZeWl-79TbGaAn7n/s320/sure.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Сама матрица имеет размеры 640х1280, сзади находятся два разъема для управления (SPI-like) и питания платы. Для управления используются контакты:<br />
1 - CS1<br />
2 - CS2<br />
5 - WR<br />
7 - DATA<br />
<br />
Питание:<br />
11 - GND<br />
12 - +5V<br />
<br />
Первым делом я принялся искать готовые библиотеки для работы с этой матрицей, были найдены проекты <a href="https://github.com/gauravmm/HT1632-for-Arduino">HT1632-for-Arduino</a> и <a href="http://code.google.com/p/ht1632c/">ht1632c</a>, но они у меня упорно отказывались работать - на матрице попросту ничего не выводилось. В какой-то момент я даже подумал что матрица испорчена. Искал по форумам, пробовал разные скетчи и наткнулся на архив в котором находился код, таки заставивший засиять матрицу тремя цветами. Судя по комментариям в исходном коде - используется переделанная библиотека Sure Electronics для другой матрицы.<br />
Убрал из кода все лишнее (благо лицензия позволяет) и оформил в виде отдельного модуля, попутно сделав <a href="https://github.com/azhurb/LedMatrix/tree/master/adk/led_test32x16bicolor">тест матрицы</a>. Вот как это выглядит:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/pCDlkrvjKAI?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Схема подключения матрицы к Arduino Mega 2560:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6puApsPN2KWvspZ9OI7CpbvvyktlcwVWF_0uWIrPouSou5RrEYNnLWgVcKRBjK2w0oVu_qBp96-mggekaPYoJ_cJJ8MqNKveqquX2XZT3Zhbvs-iiwO7u9GHYfIP9gTLO_5qPL8RHoi5L/s1600/led_matrix.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6puApsPN2KWvspZ9OI7CpbvvyktlcwVWF_0uWIrPouSou5RrEYNnLWgVcKRBjK2w0oVu_qBp96-mggekaPYoJ_cJJ8MqNKveqquX2XZT3Zhbvs-iiwO7u9GHYfIP9gTLO_5qPL8RHoi5L/s640/led_matrix.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
На всякий случай распиновка:</div>
<div class="separator" style="clear: both; text-align: left;">
49pin - DATA (7)</div>
<div class="separator" style="clear: both; text-align: left;">
47pin - WR (5)</div>
<div class="separator" style="clear: both; text-align: left;">
48pin - CS (1)</div>
<div class="separator" style="clear: both; text-align: left;">
46pin - CLK (2)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
В самом модуле основной функцией является включения одного светодиода определенного цвета по указанным координатам:<br />
<pre><code class="cpp">// x 0-31
// y 0-15
// color: 0 - black, 1 - green, 2 - red, 3 - orange
ht1632_plot(int x, int y, int color);</code></pre>
Весь скетч:<br />
<pre><code class="cpp">#include "ht1632.h"
void setup () {
ht1632_setup();
Serial.begin(115200);
ht1632_clear();
}
int color = 1;
void loop () {
for (int i=0; i<32; i++){
for (int j=0; j<16; j++){
ht1632_plot(i, j, color);
}
}
if (color < 3){
color++;
}else{
color = 1;
}
}
</code>
</pre>
После теста меня начала беспокоить скорость обновления матрицы, надеюсь там есть куда оптимизировать код.</div>
Aleksey Zhurbitskyhttp://www.blogger.com/profile/11804273630040144732noreply@blogger.com9tag:blogger.com,1999:blog-2370895106723840238.post-45298123045953458552011-08-17T22:52:00.000-07:002011-08-17T23:04:14.382-07:00Android приложение визуализатора. Часть 1<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4nwvgMOkjUnIuhyOiZ-RYUovOKDSX7N3mCFr1kJt6ThCig2On2Jleri9lkWXbjXHG5F9AXjhSvlstILELpbEuPtGeoB72zRPzh2rhUBvxGTubTS6EJKzryON10kN_NRXsLQrhQv8mikR4/s1600/snap20110817_165633_.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4nwvgMOkjUnIuhyOiZ-RYUovOKDSX7N3mCFr1kJt6ThCig2On2Jleri9lkWXbjXHG5F9AXjhSvlstILELpbEuPtGeoB72zRPzh2rhUBvxGTubTS6EJKzryON10kN_NRXsLQrhQv8mikR4/s1600/snap20110817_165633_.png" /></a></div>
<br />
Управлением визуализацией на светодиодной матрице будет заниматься Android приложение, в задачи которого входит сам захват аудио, преобразование данных захвата и отправка на ADK плату, к которой и подключена светодиодная матрица. В этой части будет рассмотрен захват и преобразование.<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<div style="text-align: center;">
<span class="Apple-style-span" style="font-size: large;">Немного теории</span></div>
<div>
В пакете <i>android.media.audiofx </i>находится класс <i><a href="http://developer.android.com/reference/android/media/audiofx/Visualizer.html">Visualizer</a></i>, в котором есть метод <b><a href="http://developer.android.com/reference/android/media/audiofx/Visualizer.html#getFft(byte[])">getFft</a></b>, позволяющий получить частоты захвата проигрываемого аудио контента:<br />
<blockquote>
<div class="jd-details-descr" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0.5em; margin-left: 0.25em; margin-right: 0.25em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<div class="jd-tagdata" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0.5em; margin-left: 1em; margin-right: 1em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<span class="Apple-style-span" style="background-color: white; color: #333333; font-family: arial, sans-serif; font-size: 13px;"></span><br />
<h4 class="jd-details-title" style="background-color: #e2e2e2; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #3a3a3a; font-size: 1.1em; margin-bottom: 0.65em; margin-left: 0px; margin-right: 0px; margin-top: 1.25em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<span class="Apple-style-span" style="background-color: white; color: #333333; font-family: arial, sans-serif; font-size: 13px;">
<span class="normal" style="font-size: 0.9em; font-weight: normal;">public int </span><span class="sympad" style="margin-right: 2px;">getFft</span> <span class="normal" style="font-size: 0.9em; font-weight: normal;">(byte[] fft)</span></span></h4>
<span class="Apple-style-span" style="background-color: white; color: #333333; font-family: arial, sans-serif; font-size: 13px;">
</span><br />
<div class="api-level" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #999999; float: right; font-size: 0.8em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: -25px; padding-bottom: 0px; padding-left: 7px; padding-right: 7px; padding-top: 0px;">
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<span class="Apple-style-span" style="background-color: white; color: #333333; font-family: arial, sans-serif; font-size: 13px;">Since: <a href="http://developer.android.com/guide/appendix/api-levels.html#level9" style="color: #999999; text-decoration: none;">API Level 9</a></span></div>
</div>
<span class="Apple-style-span" style="background-color: white; color: #333333; font-family: arial, sans-serif; font-size: 13px;">
<div class="jd-details-descr" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0.5em; margin-left: 0.25em; margin-right: 0.25em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<div class="jd-tagdata jd-tagdescr" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0.25em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0.5em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Returns a frequency capture of currently playing audio content.</div>
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0.5em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
This method must be called when the Visualizer is enabled.</div>
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0.5em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
The capture is an 8-bit magnitude FFT, the frequency range covered being 0 (DC) to half of the sampling rate returned by <code style="color: #007000; line-height: 1em;"><a href="http://developer.android.com/reference/android/media/audiofx/Visualizer.html#getSamplingRate()" style="color: #006699;">getSamplingRate()</a></code>. The capture returns the real and imaginary parts of a number of frequency points equal to half of the capture size plus one.</div>
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0.5em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Note: only the real part is returned for the first point (DC) and the last point (sampling frequency / 2).</div>
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0.5em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
The layout in the returned byte array is as follows:</div>
<ul style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0px; margin-left: 2.5em; margin-right: 2.5em; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0.25em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">n is the capture size returned by getCaptureSize()</li>
<li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0.25em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Rfk, Ifk are respectively the real and imaginary parts of the kth frequency component</li>
<li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0.25em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">If Fs is the sampling frequency retuned by getSamplingRate() the kth frequency is: (k*Fs)/(n/2)</li>
</ul>
<table border="0" cellpadding="0" cellspacing="0" style="border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; empty-cells: show; font-size: 1em; margin-bottom: 1em; margin-left: 1em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><tbody style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">Index<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">0<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">1<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">2<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">3<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">4<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">5<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">...<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">n - 2<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">n - 1<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td></tr>
<tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">Data<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">Rf0<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">Rf(n/2)<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">Rf1<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">If1<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">Rf2<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">If2<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">...<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">Rf(n-1)/2<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td><td style="background-color: inherit; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 6px; padding-left: 12px; padding-right: 12px; padding-top: 6px; text-align: left; vertical-align: top;">If(n-1)/2<br />
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</td></tr>
</tbody></table>
<div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3em; margin-bottom: 0.5em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
</div>
<div class="jd-tagdata" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0.5em; margin-left: 1em; margin-right: 1em; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<h5 class="jd-tagtitle" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #3a3a3a; font-size: 1em; margin-bottom: 0.65em; margin-left: 0px; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Parameters</h5>
<table class="jd-tagtable" style="border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; empty-cells: show; font-size: 1em; margin-bottom: 1em; margin-left: 1em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><tbody style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><th style="border-bottom-style: none; border-color: initial; border-color: initial; border-left-style: none; border-right-style: none; border-style: initial; border-top-style: none; border-width: initial; font-style: italic; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; padding-top: 2px; text-align: left; vertical-align: top;">fft</th><td style="border-bottom-style: none; border-color: initial; border-color: initial; border-left-style: none; border-right-style: none; border-style: initial; border-top-style: none; border-width: initial; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; padding-top: 2px; text-align: left; vertical-align: top;">array of bytes where the FFT should be returned</td></tr>
</tbody></table>
</div>
</div>
</span><br />
<table class="jd-tagtable" style="border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; empty-cells: show; font-size: 1em; margin-bottom: 1em; margin-left: 1em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><tbody style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><th style="border-bottom-style: none; border-color: initial; border-color: initial; border-left-style: none; border-right-style: none; border-style: initial; border-top-style: none; border-width: initial; font-style: italic; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; padding-top: 2px; text-align: left; vertical-align: top;"><br /></th><td style="border-bottom-style: none; border-color: initial; border-color: initial; border-left-style: none; border-right-style: none; border-style: initial; border-top-style: none; border-width: initial; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; padding-top: 2px; text-align: left; vertical-align: top;"><br /></td></tr>
</tbody></table>
</div>
</div>
</blockquote>
<div>
<div>
Если я все правильно понял, то результат выглядит в виде массива байт, содержащий реальные и мнимые части амплитуды для каждой частоты. Первый и второй элементы содержат только реальные части и соответствуют первой и последней точке. Амплитудой будет являться сумма квадратов реальной и мнимой части. Таким образом можно отбросить первые два элемента, а с остальными произвести преобразование по формуле:</div>
<div>
<br /></div>
<div style="text-align: center;">
<i>Mk = Rfk*Rfk + Ifk*Ifk</i></div>
<div>
<br />
<div>
<br /></div>
<div>
Частота дискретизации (sampling rate) <i>Fs = 44100 Гц</i>. Размер захвата (capture size) <i>n = 1024</i> (для тестового приложения). </div>
</div>
</div>
<div>
<br /></div>
<div>
Значение частоты для <i>k</i> элемента вычисляется по формуле:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: center;">
<i>Fk = (k*Fs)/(n/2)</i></div>
<div>
<br /></div>
<div>
Т.е. в нашем случае <i>F1 = 86 Гц, F2 = 172 Гц ... </i><i>F32 =2756.25 Гц </i><i>... </i><i>F512 = 44100 Гц.</i></div>
<div>
<i><br /></i></div>
<div>
Однако наибольший интерес представляют частоты до 5 КГц, именно в этом диапазоне находятся музыкальные звуки. Так как у нас матрица позволяет отобразить 32 значения, то частота для 32-го элемента должно быть приблизительно равна 5 КГц, а для этого нам надо правильно вычислить размер захвата <i>n</i>.</div>
<div>
<br /></div>
<div style="text-align: center;">
n = 2*(32*44100) / 5000 = 564.48 ≈ 564</div>
<div>
<br /></div>
<div>
Теперь <i>F1 ≈ 156 Гц, F2 ≈ 312 Гц ... </i><i>F32 ≈ 5004 Гц.</i></div>
<div>
<i><br /></i></div>
<div style="text-align: center;">
<span class="Apple-style-span" style="font-size: large;">Android</span></div>
<div>
За основу взято приложение AudioFxDemo из ApiDemos пакета <i>com.example.android.apis.media</i> в примерах Android SDK. Код выложен в <a href="https://github.com/azhurb/LedMatrix">свободный доступ</a>, предложения и исправления приветствуются.<br />
<br />
Часть кода, отвечающего за захват:<br />
<pre><code class="java">mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes,int samplingRate) {}
public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
mVisualizerView.updateVisualizer(bytes);
}
}, Visualizer.getMaxCaptureRate(), false, true);
</code></pre>
<br />
Затем высчитываются первые 32 значения (диапазон 156 Гц - 5004 Гц) и отрисовываются на канвасе.<br />
Результат выглядит так:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXY__IwH_UcSifu3BRCfTEqJ_vLn_vVX4Rpb6Cgc8fWasNBNT5z-LrZBqoOGdAftHxMo-TKQ-Lq8z4NMo0tDutZliReydWNOdAtW4mLzlbjeJ_vCwRUKM_9z1z_hyZeYufMCopoKncwkc_/s1600/snap20110817_132434.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXY__IwH_UcSifu3BRCfTEqJ_vLn_vVX4Rpb6Cgc8fWasNBNT5z-LrZBqoOGdAftHxMo-TKQ-Lq8z4NMo0tDutZliReydWNOdAtW4mLzlbjeJ_vCwRUKM_9z1z_hyZeYufMCopoKncwkc_/s320/snap20110817_132434.png" width="192" /></a></div>
На данный момент результат меня не совсем удовлетворяет - слабо просматривается связь между визуализацией с реально играющей композицией.</div>
</div>
</div>
Aleksey Zhurbitskyhttp://www.blogger.com/profile/11804273630040144732noreply@blogger.com5tag:blogger.com,1999:blog-2370895106723840238.post-24872236649362169872011-08-11T01:58:00.000-07:002011-08-11T01:58:57.467-07:00Светодиодная матрица<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiDeJuxyxjzVTlV6Uphk0ZNbPvKtIqXgLYfzg6Ez3tSCf3GKuDll6ifHlJ9xGtWn7MdgCvXtT8baj90IyvYMLGymYoL04j2btkaahw1eQK8LM8blTzQgfDcld4t8dQYcMfH93nb1pGOKbc/s1600/TriColor-Matrix-0_i_ma.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiDeJuxyxjzVTlV6Uphk0ZNbPvKtIqXgLYfzg6Ez3tSCf3GKuDll6ifHlJ9xGtWn7MdgCvXtT8baj90IyvYMLGymYoL04j2btkaahw1eQK8LM8blTzQgfDcld4t8dQYcMfH93nb1pGOKbc/s1600/TriColor-Matrix-0_i_ma.jpg" /></a></div>
<br />
Как я уже вскользь <a href="http://adk-open-call-2011.blogspot.com/2011/08/blog-post.html">упоминал</a> - с проектированием светодиодной матрицы возникли определенные проблемы. Основная сложность заключается в подборе оптимального драйвера светодиодов, который позволит собрать матрицу на односторонней печатной плате. В результате долгих часов гугления и общения на <a href="http://radiokot.ru/forum/viewtopic.php?f=21&t=52313">форумах</a> круг подозреваемых удалось снизить.<br />
<br />
<a name='more'></a><br />
<br />
<br />
Список всех кандидатов выглядит так:<br />
<br />
1. Сдвиговый регистр 74HC595 [<a href="http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf">pdf</a>]. На секцию 8х8 необходимо 4 таких микросхемы плюс пара десятков резисторов.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjasfhCjJa1EXyLftoaTDScpxs1DH2a5wMzY4eqKop8ks5Ep8TqkKPzIIKVaGHOPO0izgdUL8djZewB1fphqd9xZ4rswC2O5AfB83aiR1AB0jI1UursRmyTBVCoFySqQK9-YYkHGHyiCGJw/s1600/74hc595n-s.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjasfhCjJa1EXyLftoaTDScpxs1DH2a5wMzY4eqKop8ks5Ep8TqkKPzIIKVaGHOPO0izgdUL8djZewB1fphqd9xZ4rswC2O5AfB83aiR1AB0jI1UursRmyTBVCoFySqQK9-YYkHGHyiCGJw/s1600/74hc595n-s.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Разместить такое число элементов на одностороннем текстолите размером 60х60 не представляется возможным, поэтому этот вариант пришлось отбросить.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
2. HT1632C [<a href="http://www.holtek.com/pdf/consumer/ht1632cv120.pdf">pdf</a>] - драйвер светодиодных дисплеев 32x8 и 24x16.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4h1M9K-b0xsLZ1O9PTt_631EjPyX4EaCtN-OPruFVUSroxsrFO3cQfOLbHZ5IEYkwXXKGrE7aXCXV767AQAk9A6iOdjF-jGg8kwK-sXJBtvl1JmwSm8yocUJxrDKIYW_u2dj-GKIm_f8/s1600/HT1632C-HOLTEK-QFP-52.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="98" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4h1M9K-b0xsLZ1O9PTt_631EjPyX4EaCtN-OPruFVUSroxsrFO3cQfOLbHZ5IEYkwXXKGrE7aXCXV767AQAk9A6iOdjF-jGg8kwK-sXJBtvl1JmwSm8yocUJxrDKIYW_u2dj-GKIm_f8/s200/HT1632C-HOLTEK-QFP-52.jpg" width="100" /></a></div>
<div class="" style="clear: both; text-align: left;">
Эти драйверы использует Sure Electronics в своих матрицах. По идее одной такой микросхемы должно хватить на полноцветную матрицу 8х8. Но, как оказалось, этот драйвер довольно редкий и найти его достаточно сложно. Да и информации о его применении крайне мало.</div>
<br />
3. MAX7219 или MAX7221 [<a href="http://datasheets.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf">pdf</a>], драйверы светодиодных дисплеев.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEnEgmI2b02nbKZFvtyvQMz-mrEtOFSIulkvWvHW1WSCExtOj20aOm9hEh7OmhPDXt4u54b69l9SFShOsEOTvQpLD4kGzO_SVqihY90xTDcNOiZGWbycJKHhdyJcaeYCrLEjsSEw9H08JA/s1600/max7219.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEnEgmI2b02nbKZFvtyvQMz-mrEtOFSIulkvWvHW1WSCExtOj20aOm9hEh7OmhPDXt4u54b69l9SFShOsEOTvQpLD4kGzO_SVqihY90xTDcNOiZGWbycJKHhdyJcaeYCrLEjsSEw9H08JA/s200/max7219.jpg" width="120" /></a></div>
<br />
Долго их рассматривал, а потом обратил внимание что они для дисплеев с общим катодом, которые редкие и дорогие, в отличии от матриц с общим анодом. Так как планировалось все-таки использовать матрицы с общим анодом, то и от этого варианта пришлось отказаться.<br />
<br />
4. MBI5030 [<a href="http://www.elektronikpraxis.vogel.de/fileserver/vogelonline/files/320.pdf">pdf</a>] - шестнадцати канальный драйвер.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDNN_tsVGkUdirmOxEStmuDqiQG0DYuMu-nqSANXaSZZgTxBqv6ggNcTuLMC6NbMQavh6uiV1ob3Z3kbrVNrq4HDRwyblqdjKaWWEKeXXDI2V7bMZgvSlLn3wv2l1t4U3wmixeLksof0we/s1600/mbi5030.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDNN_tsVGkUdirmOxEStmuDqiQG0DYuMu-nqSANXaSZZgTxBqv6ggNcTuLMC6NbMQavh6uiV1ob3Z3kbrVNrq4HDRwyblqdjKaWWEKeXXDI2V7bMZgvSlLn3wv2l1t4U3wmixeLksof0we/s200/mbi5030.jpg" width="100" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Таких нужно две штуки, плюс 8-ми канальный ключ и микроконтроллер для управления всем этим делом. Сразу понятно, что это дорого и, как и в первом варианте, не поместится на плату.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
5. MAX6960, MAX6961, MAX6962, MAX6963 [<a href="http://datasheets.maxim-ic.com/en/ds/MAX6960-MAX6963.pdf">pdf</a>] - замечательные драйверы, предназначенные именно для светодиодных матриц 8х8, но к сожалению не полноцветных, а двухцветных.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3u8Vg9akKJWXwdbrBzh70YCP6si_JU1nQrY84WEYtRoQZdZZZZWx7fW5sgqBJeH6m3bKn3-dcdGZyo4ypWyqy3Gnlufmdm0w0TwHuXHLpeXeDU_rruBXLXh_bOqbcmNIceY8V8hX8BBLy/s1600/max6963.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3u8Vg9akKJWXwdbrBzh70YCP6si_JU1nQrY84WEYtRoQZdZZZZWx7fW5sgqBJeH6m3bKn3-dcdGZyo4ypWyqy3Gnlufmdm0w0TwHuXHLpeXeDU_rruBXLXh_bOqbcmNIceY8V8hX8BBLy/s200/max6963.gif" width="97" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
И к сожалению в планах у MAXIM нет разработки драйвера для полноцветной матрицы.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i>Как видно - ни один из пяти вариантов полностью не подошел для моей задачи. Чтобы не остаться у разбитого корыта я начал искать уже готовые матрицы (почему сразу </i><i>этого</i><i> не сделал??).</i></div>
<br />
Тут определились три кандидата:<br />
<br />
1. Двухцветная RG матрица 32х16 от вышеупомянутой Sure Electronics [<a href="http://www.sure-electronics.net/download/DE-DP14112_Ver1.1_EN.pdf">pdf</a>].<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihyOC9wlwUZ7a4f18iPIZRTKRcWtblNan4SxLuQLwImunBITfcMg9VxojtD_c49M8tpCFtT_cFL-nVrPIo2GsrWr0GfRI9s7JYOddBc2p4XAUmLISmkgUXw33VzRurNGAHctfT4uuhdmkR/s1600/DE-DP14112_2_b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihyOC9wlwUZ7a4f18iPIZRTKRcWtblNan4SxLuQLwImunBITfcMg9VxojtD_c49M8tpCFtT_cFL-nVrPIo2GsrWr0GfRI9s7JYOddBc2p4XAUmLISmkgUXw33VzRurNGAHctfT4uuhdmkR/s320/DE-DP14112_2_b.jpg" width="320" /></a></div>
<br />
Это чудо стоит всего 35$, что очень заманчиво. Примеров использования в интернете достаточно много, сразу видно что матрица довольно популярна. Заказал с ибея на всякий случай.<br />
<br />
2. Полноцветная матрица D80160TFM [<a href="http://www.optoga.se/pdf/D80160TFM-PG.pdf">pdf</a>] от Seoul semiconductor.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7JbXTHxqOwhwVzf2xVTalediuvO0HpIBj4UCGxQivtb0LzSWG_X_CKVJP16vxcTZeuG6j80Ogq6X8oOdyQU578vTlVuMDTvh8TSlGNk7d08ENmgBtckpMF60JhVc_SCxvtSTGa9bpnMqo/s1600/D80160TFM-PG.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7JbXTHxqOwhwVzf2xVTalediuvO0HpIBj4UCGxQivtb0LzSWG_X_CKVJP16vxcTZeuG6j80Ogq6X8oOdyQU578vTlVuMDTvh8TSlGNk7d08ENmgBtckpMF60JhVc_SCxvtSTGa9bpnMqo/s320/D80160TFM-PG.jpg" width="320" /></a></div>
<br />
Немного меньше размером чем у Sure Electronics. Вроде бы то что надо, но найти это чудо в продаже не удалось. Хотя в одной киевской конторе мне предложили купить две полноцветные матрицы 16х16 от Seoul semiconductor по цене 75$ за штуку. Платить 150$ за части, которые не факт что заработают в паре я пока не готов.<br />
<br />
3. Вроде как полноцветная матрица от китайцев за 80$, но никакого вменяемого описания.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeP1BXw-xCee0DQESi1lqdMwIl247fXo76Fj56e6Q8RXjll-Ts_FjBetGFaTTTS7mvvvL2RMSPYvcBVzOei1EOE9lNEp0tBTzekLhvGu5VINl2tAZSbrH-jYmZRKVHZazS34GNskBviVHy/s1600/LD111-LD114.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeP1BXw-xCee0DQESi1lqdMwIl247fXo76Fj56e6Q8RXjll-Ts_FjBetGFaTTTS7mvvvL2RMSPYvcBVzOei1EOE9lNEp0tBTzekLhvGu5VINl2tAZSbrH-jYmZRKVHZazS34GNskBviVHy/s320/LD111-LD114.jpg" width="320" /></a></div>
Связался с продавцом на ибее, тот обещал выслать документацию и <a href="https://docs.google.com/leaf?id=1Tf9th26ZBnhCFrywbtPN1dcBzU0ozLiiUleP-cfVzRn-r5-9GELER7gxH8oN&hl=en_US">вот что выслал</a>. Меня интересовал интерфейс подключения, но кроме пурги для замыливания глаз типа разрешений 1024×768; 1280×768; 800×600 и видео сигналов DVD, VCD, PC, YUV, YC, COMPOSITE, VIDEO ничего не нашел. Попросил выслать фотографию задней стороны матрицы - китаец пропал.<br />
<br />
Пока что остается ждать матрицу Sure Electronics, похоже на ней и остановлюсь.</div>
Aleksey Zhurbitskyhttp://www.blogger.com/profile/11804273630040144732noreply@blogger.com5tag:blogger.com,1999:blog-2370895106723840238.post-38719208101450178122011-08-09T03:42:00.000-07:002017-07-27T04:23:11.641-07:00Описание проекта<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc8_3sKe9b_M5lZSkFcXphGIChUBis78MFxQZMyGfretSac49-nZPGwRAVWQa1LAd-YHmlF6Y0iDYNAVpEExMH4-E8oF9OD4cDEujvrwRdrik3Ev2VIFc9Z8GFILsw_OXpKI47Z9ipRwgo/s1600/Audio-Spectrum.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc8_3sKe9b_M5lZSkFcXphGIChUBis78MFxQZMyGfretSac49-nZPGwRAVWQa1LAd-YHmlF6Y0iDYNAVpEExMH4-E8oF9OD4cDEujvrwRdrik3Ev2VIFc9Z8GFILsw_OXpKI47Z9ipRwgo/s320/Audio-Spectrum.jpg" width="320" /></a></div>
Проект называется "Визуализация аудио с помощью светодиодных матриц". Более подробно о нем можно почитать в официальном <a href="https://docs.google.com/document/d/1_40a6Lx88R-fTfrHAXZ12I0sk8mRBgfDgI3TILGcj1E/edit?hl=en_US">документе</a>, который и был подан судьям на рассмотрение. Здесь же я хочу рассказать более подробно о планах его реализации.<br />
<br />
<a name='more'></a><br />
<br />
На мой взгляд самым сложным будет сборка запланированной светодиодной матрицы размером 32х16 точек, причем светодиоды должны быть RGB и желательно с регулировкой яркости каждого из них. Таким образом должна получится универсальная полноцветная матрица. Интерфейс управления - SPI (последовательный, четырёхпроводный).<br />
<br />
Матрица 32х16 будет собираться из матриц 8х8:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgILiRMuLYnYKTLJTtg7Cjg0GAS-3KRK6sbtOq5XK1eutDJHkIMcK76U155pATwkkXVCFqPYg3s0P4QEwf7qIJirfl58lEQOcvxfcomcRTqTOix37vJwh2MAJgvUcV5mWs9MzbeLZV1Wh6Z/s1600/TriColor-Matrix-2_i_ma.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgILiRMuLYnYKTLJTtg7Cjg0GAS-3KRK6sbtOq5XK1eutDJHkIMcK76U155pATwkkXVCFqPYg3s0P4QEwf7qIJirfl58lEQOcvxfcomcRTqTOix37vJwh2MAJgvUcV5mWs9MzbeLZV1Wh6Z/s1600/TriColor-Matrix-2_i_ma.jpg" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiDeJuxyxjzVTlV6Uphk0ZNbPvKtIqXgLYfzg6Ez3tSCf3GKuDll6ifHlJ9xGtWn7MdgCvXtT8baj90IyvYMLGymYoL04j2btkaahw1eQK8LM8blTzQgfDcld4t8dQYcMfH93nb1pGOKbc/s1600/TriColor-Matrix-0_i_ma.jpg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiDeJuxyxjzVTlV6Uphk0ZNbPvKtIqXgLYfzg6Ez3tSCf3GKuDll6ifHlJ9xGtWn7MdgCvXtT8baj90IyvYMLGymYoL04j2btkaahw1eQK8LM8blTzQgfDcld4t8dQYcMfH93nb1pGOKbc/s1600/TriColor-Matrix-0_i_ma.jpg" /></a><br />
<br />
Ввиду большей доступности матриц с общим анодом, будут использоваться именно они.<br />
В поисках схем подключения набрел на статью в блоге Francis Shanahan'а <a href="http://francisshanahan.com/index.php/2009/how-to-build-a-8x8x3-led-matrix-with-pwm-using-an-arduino/">How to Build a 8×8 RGB LED Matrix with PWM using an Arduino</a>. В ней для подключения одной матрицы 8х8 используются четыре сдвиговых регистра 74HC595 и 24 резистора.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjasfhCjJa1EXyLftoaTDScpxs1DH2a5wMzY4eqKop8ks5Ep8TqkKPzIIKVaGHOPO0izgdUL8djZewB1fphqd9xZ4rswC2O5AfB83aiR1AB0jI1UursRmyTBVCoFySqQK9-YYkHGHyiCGJw/s1600/74hc595n-s.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjasfhCjJa1EXyLftoaTDScpxs1DH2a5wMzY4eqKop8ks5Ep8TqkKPzIIKVaGHOPO0izgdUL8djZewB1fphqd9xZ4rswC2O5AfB83aiR1AB0jI1UursRmyTBVCoFySqQK9-YYkHGHyiCGJw/s1600/74hc595n-s.jpg" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Схема довольно простая, однако похоже главной сложностью будет размещение элементов на плате, которая должна соответствовать размерам самой матрицы. Саму плату планируется изготавливать в домашних условиях, поэтому существует ряд ограничений, в частности плата должна быть односторонней.<br />
<br />
Второй частью является написание Android приложения, которое и будет передавать посредством платы ADК данные для отрисовки на светодиодную матрицу. После недолгих поисков оказалось, что в пакете <i>android.media.audiofx</i> есть класс <i>Visualizer</i>, который на первый взгляд содержит все что необходимо для получения данных для отрисовки.<br />
<br />
Напоследок видео того, что должно получиться в результате:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/LIOUXr9v2RI/0.jpg" src="https://www.youtube.com/embed/LIOUXr9v2RI?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<br />
Немного забегая вперед скажу что вариант сборки матрицы, описанный выше, оказался не реализуем в домашних условиях, но варианты существуют.<br />
<br />
P.S. Психологическим порогом бюджета для создания матрицы выбрал 200$</div>
Aleksey Zhurbitskyhttp://www.blogger.com/profile/11804273630040144732noreply@blogger.com0