Доброго дня, коллеги.
Несколько дней назад Виктор R2PM задал мне вопрос на который я не смого ответить, а именно
известно ли мне решение для создания анализатора спектра на Ардуине с выводом результата на LCD. Покопались мы в инетах и... ничего толкового не нашли. Может плохо искали, но все найденные решения были с реадизацией на Atmega или других МП или ч выводом на видео. После недолгих раздумий было решено взять за основу решение http://meandr.org/archives/3544, но "перетащить" его на Ардуину, т..к. там предлагался готовый код на С для реализации на Atmega32 и применен алгоритм дискретно преобразовани Фурье ДПФ. Сложность задачи, по крайней мере для меня, заключалась в том, что исходное решение выполнено на Atmega32, а требуется на Ардуине Мини Про на Atmega328. Может для кого то это просто, но для меня нет. Начал я с повторения готового решеня с эмуляцией на Proteus, но не тут то было. Я так и не смог инициализировать
LCD. Пришлось искать выходы. Вот выход http://radioparty.ru/prog-avr/program-c/268-lcd-avr-lesson2.
Да простят меня оба автора, но я скомпилировал из двух одно решение, которое и представляю уважаемой публике.
Для отладки программы микропроцессора в данном случае IDE Arduino не подходит. Пришлось исползовать AVR Studio 7, распространяемое бесплатно http://www.atmel.com/ru/ru/tools/ATMELSTUDIO.aspx. Мне так и не удалось напрямую заливать код в Ардуину как пишут в руководстве. но меня это не остановило. Есть очень простое решение это Xloader, который позволяет заливать Hex код в Ардуину.

Итак последоваельность действий такая.
1. Скачаваем AVR Studio 7
2. Приводим в порядок код

Вот код, который родился у меня:
009 | #define F_CPU 16000000 |
010 | #include <util/delay.h> |
015 | #define LCD_NIBBLE PORTD |
022 | void LCD_STROBE( void ); |
023 | void lcd_data(unsigned char c); |
024 | void lcd_cmd(unsigned char c); |
027 | void lcd_print( char *p, char l); |
028 | void lcd_fill_custom(); |
029 | void lcd_com(unsigned char p); |
030 | void lcd_dat(unsigned char p); |
045 | lcd_print( "DFT SPECTROMETER" ,1); |
046 | lcd_print( "0Hz - 10KHz(16)" ,2); |
055 | fx[i] = ((int16_t)adc_read()); |
060 | for (i =1; i<N/2; i++) { |
061 | if (Fu[i][0]<0)Fu[i][0]*=-1; |
062 | if (Fu[i][1]<0)Fu[i][1]*=-1; |
063 | mag = (uint8_t)(Fu[i][0] + Fu[i][1])/4; |
065 | lcd_buf1[i] = (mag) - 7 - 1; |
077 | lcd_dat(lcd_buf1[i]); |
080 | lcd_dat(lcd_buf2[i]); |
088 | int16_t count,degree; |
091 | for (u=0; u<N/2; u++) { |
092 | for (k=0; k<N; k++) { |
093 | degree = (uint16_t)pgm_read_byte_near(degree_lookup + count)*2; |
095 | Fu[u][0] += fx[k] * (int16_t)pgm_read_word_near(cos_lookup + degree); |
096 | Fu[u][1] += -fx[k] * (int16_t)pgm_read_word_near(sin_lookup + degree); |
107 | TCCR1B = (1<<WGM12)|(1<<CS10); |
119 | volatile uint16_t retl,reth; |
144 | void lcd_data(unsigned char c) |
149 | LCD_NIBBLE = (c << 4)|(LCD_NIBBLE&0xf0); |
151 | LCD_NIBBLE = (c)|(LCD_NIBBLE&0XF0); |
162 | void lcd_cmd(unsigned char c) |
167 | LCD_NIBBLE = (c << 4)|(LCD_NIBBLE&0xf0); |
169 | LCD_NIBBLE = (c)|(LCD_NIBBLE&0XF0); |
204 | DDRC |= (1 << EN)|(1 << RS); |
213 | PORTD &= ~(1 << PD4); |
233 | void lcd_print( char *p, char l) |
241 | if (l==1)lcd_com(0x80); |
248 | void lcd_fill_custom() |
261 | void lcd_com(unsigned char p) |
266 | PORTD &= 0x0F; PORTD |= (p & 0xF0); |
271 | PORTD &= 0x0F; PORTD |= (p << 4); |
277 | void lcd_dat(unsigned char p) |
280 | PORTC |= (1 << RS)|(1 << EN); |
281 | PORTD &= 0x0F; PORTD |= (p & 0xF0); |
286 | PORTD &= 0x0F; PORTD |= (p << 4); |
Еще авторский файлик Lookup.h
002 | #include <avr/pgmspace.h> |
004 | PROGMEM const int16_t cos_lookup[]= { |
005 | 10000,9998,9993,9986,9975,9961,9945,9925,9902, |
006 | 9876,9848,9816,9781,9743,9702,9659,9612,9563, |
007 | 9510,9455,9396,9335,9271,9205,9135,9063,8987, |
008 | 8910,8829,8746,8660,8571,8480,8386,8290,8191, |
009 | 8090,7986,7880,7771,7660,7547,7431,7313,7193, |
010 | 7071,6946,6819,6691,6560,6427,6293,6156,6018, |
011 | 5877,5735,5591,5446,5299,5150,5000,4848,4694, |
012 | 4539,4383,4226,4067,3907,3746,3583,3420,3255, |
013 | 3090,2923,2756,2588,2419,2249,2079,1908,1736, |
014 | 1564,1391,1218,1045,871,697,523,348,174, |
015 | 0,-174,-348,-523,-697,-871,-1045,-1218,-1391, |
016 | -1564,-1736,-1908,-2079,-2249,-2419,-2588,-2756,-2923, |
017 | -3090,-3255,-3420,-3583,-3746,-3907,-4067,-4226,-4383, |
018 | -4539,-4694,-4848,-4999,-5150,-5299,-5446,-5591,-5735, |
019 | -5877,-6018,-6156,-6293,-6427,-6560,-6691,-6819,-6946, |
020 | -7071,-7193,-7313,-7431,-7547,-7660,-7771,-7880,-7986, |
021 | -8090,-8191,-8290,-8386,-8480,-8571,-8660,-8746,-8829, |
022 | -8910,-8987,-9063,-9135,-9205,-9271,-9335,-9396,-9455, |
023 | -9510,-9563,-9612,-9659,-9702,-9743,-9781,-9816,-9848, |
024 | -9876,-9902,-9925,-9945,-9961,-9975,-9986,-9993,-9998, |
025 | -10000,-9998,-9993,-9986,-9975,-9961,-9945,-9925,-9902, |
026 | -9876,-9848,-9816,-9781,-9743,-9702,-9659,-9612,-9563, |
027 | -9510,-9455,-9396,-9335,-9271,-9205,-9135,-9063,-8987, |
028 | -8910,-8829,-8746,-8660,-8571,-8480,-8386,-8290,-8191, |
029 | -8090,-7986,-7880,-7771,-7660,-7547,-7431,-7313,-7193, |
030 | -7071,-6946,-6819,-6691,-6560,-6427,-6293,-6156,-6018, |
031 | -5877,-5735,-5591,-5446,-5299,-5150,-5000,-4848,-4694, |
032 | -4539,-4383,-4226,-4067,-3907,-3746,-3583,-3420,-3255, |
033 | -3090,-2923,-2756,-2588,-2419,-2249,-2079,-1908,-1736, |
034 | -1564,-1391,-1218,-1045,-871,-697,-523,-348,-174, |
035 | 0,174,348,523,697,871,1045,1218,1391, |
036 | 1564,1736,1908,2079,2249,2419,2588,2756,2923, |
037 | 3090,3255,3420,3583,3746,3907,4067,4226,4383, |
038 | 4539,4694,4848,5000,5150,5299,5446,5591,5735, |
039 | 5877,6018,6156,6293,6427,6560,6691,6819,6946, |
040 | 7071,7193,7313,7431,7547,7660,7771,7880,7986, |
041 | 8090,8191,8290,8386,8480,8571,8660,8746,8829, |
042 | 8910,8987,9063,9135,9205,9271,9335,9396,9455, |
043 | 9510,9563,9612,9659,9702,9743,9781,9816,9848, |
044 | 9876,9902,9925,9945,9961,9975,9986,9993,9998 |
047 | PROGMEM const int16_t sin_lookup[]= { |
048 | 0,174,348,523,697,871,1045,1218,1391, |
049 | 1564,1736,1908,2079,2249,2419,2588,2756,2923, |
050 | 3090,3255,3420,3583,3746,3907,4067,4226,4383, |
051 | 4539,4694,4848,4999,5150,5299,5446,5591,5735, |
052 | 5877,6018,6156,6293,6427,6560,6691,6819,6946, |
053 | 7071,7193,7313,7431,7547,7660,7771,7880,7986, |
054 | 8090,8191,8290,8386,8480,8571,8660,8746,8829, |
055 | 8910,8987,9063,9135,9205,9271,9335,9396,9455, |
056 | 9510,9563,9612,9659,9702,9743,9781,9816,9848, |
057 | 9876,9902,9925,9945,9961,9975,9986,9993,9998, |
058 | 10000,9998,9993,9986,9975,9961,9945,9925,9902, |
059 | 9876,9848,9816,9781,9743,9702,9659,9612,9563, |
060 | 9510,9455,9396,9335,9271,9205,9135,9063,8987, |
061 | 8910,8829,8746,8660,8571,8480,8386,8290,8191, |
062 | 8090,7986,7880,7771,7660,7547,7431,7313,7193, |
063 | 7071,6946,6819,6691,6560,6427,6293,6156,6018, |
064 | 5877,5735,5591,5446,5299,5150,4999,4848,4694, |
065 | 4539,4383,4226,4067,3907,3746,3583,3420,3255, |
066 | 3090,2923,2756,2588,2419,2249,2079,1908,1736, |
067 | 1564,1391,1218,1045,871,697,523,348,174, |
068 | 0,-174,-348,-523,-697,-871,-1045,-1218,-1391, |
069 | -1564,-1736,-1908,-2079,-2249,-2419,-2588,-2756,-2923, |
070 | -3090,-3255,-3420,-3583,-3746,-3907,-4067,-4226,-4383, |
071 | -4539,-4694,-4848,-4999,-5150,-5299,-5446,-5591,-5735, |
072 | -5877,-6018,-6156,-6293,-6427,-6560,-6691,-6819,-6946, |
073 | -7071,-7193,-7313,-7431,-7547,-7660,-7771,-7880,-7986, |
074 | -8090,-8191,-8290,-8386,-8480,-8571,-8660,-8746,-8829, |
075 | -8910,-8987,-9063,-9135,-9205,-9271,-9335,-9396,-9455, |
076 | -9510,-9563,-9612,-9659,-9702,-9743,-9781,-9816,-9848, |
077 | -9876,-9902,-9925,-9945,-9961,-9975,-9986,-9993,-9998, |
078 | -10000,-9998,-9993,-9986,-9975,-9961,-9945,-9925,-9902, |
079 | -9876,-9848,-9816,-9781,-9743,-9702,-9659,-9612,-9563, |
080 | -9510,-9455,-9396,-9335,-9271,-9205,-9135,-9063,-8987, |
081 | -8910,-8829,-8746,-8660,-8571,-8480,-8386,-8290,-8191, |
082 | -8090,-7986,-7880,-7771,-7660,-7547,-7431,-7313,-7193, |
083 | -7071,-6946,-6819,-6691,-6560,-6427,-6293,-6156,-6018, |
084 | -5877,-5735,-5591,-5446,-5299,-5150,-5000,-4848,-4694, |
085 | -4539,-4383,-4226,-4067,-3907,-3746,-3583,-3420,-3255, |
086 | -3090,-2923,-2756,-2588,-2419,-2249,-2079,-1908,-1736, |
087 | -1564,-1391,-1218,-1045,-871,-697,-523,-348,-174 |
090 | PROGMEM const uint8_t degree_lookup[]= { |
091 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
092 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
093 | 0,0,0,5,11,16,22,28,33,39,45,50,56,61,67, |
094 | 73,78,84,90,95,101,106,112,118,123,129,135,140,146,151, |
095 | 157,163,168,174,0,11,22,33,45,56,67,78,90,101,112, |
096 | 123,135,146,157,168,0,11,22,33,44,56,67,78,90,101, |
097 | 112,123,134,146,157,168,0,16,33,50,67,84,101,118,135, |
098 | 151,168,5,22,39,56,73,90,106,123,140,157,174,11,28, |
099 | 45,61,78,95,112,129,146,163,0,22,45,67,90,112,135, |
100 | 157,0,22,44,67,90,112,134,157,0,22,45,67,89,112, |
101 | 134,157,0,22,45,67,89,112,135,157,0,28,56,84,112, |
102 | 140,168,16,44,73,101,129,157,5,33,61,89,118,146,174, |
103 | 22,50,78,106,135,163,11,39,67,95,123,151,0,33,67, |
104 | 101,135,168,22,56,90,123,157,11,45,78,112,146,0,33, |
105 | 67,101,135,168,22,56,90,123,157,11,44,78,112,146,0, |
106 | 39,78,118,157,16,56,95,134,174,33,73,112,151,11,50, |
107 | 89,129,168,28,67,106,146,5,44,84,123,163,22,61,101, |
108 | 140,0,45,90,135,0,44,90,134,0,45,89,134,0,45, |
109 | 89,135,0,44,90,135,179,44,89,134,0,45,90,134,179, |
110 | 44,90,135,0,50,101,151,22,73,123,174,45,95,146,16, |
111 | 67,118,168,39,90,140,11,61,112,163,33,84,134,5,56, |
112 | 106,157,28,78,129,0,56,112,168,44,101,157,33,89,146, |
113 | 22,78,135,11,67,123,179,56,112,168,45,101,157,33,90, |
114 | 146,22,78,134,11,67,123,0,61,123,5,67,129,11,73, |
115 | 134,16,78,140,22,84,146,28,89,151,33,95,157,39,101, |
116 | 163,44,106,168,50,112,174,56,118,0,67,135,22,90,157, |
117 | 45,112,0,67,135,22,90,157,44,112,0,67,134,22,90, |
118 | 157,44,112,0,67,134,22,89,157,45,112,0,73,146,39, |
119 | 112,5,78,151,45,118,11,84,157,50,123,16,90,163,56, |
120 | 129,22,95,168,61,134,28,101,174,67,140,33,106,0,78, |
121 | 157,56,134,33,112,11,89,168,67,146,44,123,22,101,179, |
122 | 78,157,56,134,33,112,11,89,168,67,146,44,123,22,101, |
123 | 0,84,168,73,157,61,146,50,135,39,123,28,112,16,101, |
124 | 5,90,174,78,163,67,151,56,140,45,129,33,118,22,106, |
3. Моделируем в Proteus с получением результата.

прошу не забывать это эмуляция и готовое решение еще придется подгонять. Надеюсь, что Виктор R2PM поможет в этом и присоединится к теме.
Вот примерно так. Кому интересно пишите.
Всем привет, с новогодними праздниками!!!
Собираю детали на изготовление макета и рабочего проекта
С уважением Виктор R2PM
Бог в помощь:
https://www.youtube.com/results?search_query=arduino+spectrum+analyzer
Бог в помощь:
Спасибо.
Подбные форумы не патентное бюро, а место где увлеченные люди делятся своим опытом
по вопросам конструирования любительских устройств. И очень желательно, чтобы кому это не интересно, проходили мимо не останавливаясь.
Вот-вот. У вас есть непревзойдённый шанс пройти мимо, RN6LJK.
Очень интересный проект получился.
Можете выложить куда то файл для Proteus?
Очень интересный проект получился.
Можете выложить куда то файл для Proteus?
Укажите свое мыло, я вышлю.
Можете на дропбокс или яндекс диск выложить? Вдруг еще кому то будет интересно
Пишите на адрес sokolova_o@mail.ru, всем отвечу.
Ну вот. А я собирался делать анализатор для распознавания голосовых команд .. опять "все украдено до нас" .. :)
Всем доброе время суток!!!
"Проект" - рабочий. "Зашил" файл Hex в про мини и LCD отобразило спектры.
Работает "класно". мне нравиться. Есть нюансы как увеличить усреднение например.
В общем "обкатываю" в эфире.
С уважением Виктор R2PM
http://coolarduino.wordpress.com/2014/09/25/splitradixreal-fft-library/
Здравствуйте, уважаемые!
Кто-то решался сделать анализатор спектра на ардуино и адресной ленте WS2812b?
Так чтобы именно сделать из ленты матрицу