Разгоняем Ардуину !
Oct. 15th, 2014 04:31 pmВсё хорошо в этой железяке, только вот иногда встречаются задачки, которые не имеют простого решения.
Нужно оцифровать сигнал с микрофона. На первый взгляд - гавновопрос !
Пишем val=analogRead(1);
Только вот, даже если процессор ничего больше не делает, скорость выполнения этой команды через стандартную библиотеку составляет каких-то 8кГц.

По теореме Котельникова "частота дискретизации должна минимум в два раза превышать частоту обрабатываемого сигнала", т.е. мы можем оцифровать максимум до 4кГц. Этого мало даже для речевого сигнала :-(
Если нам нужно сделать БПФ (быстрое преобразование Фурье) и получить спектр звукового сигнала, то необходимо минимум 44кГц частоты дискретизации.
Нарыл в интернете подобную проблемку. Умные люди придумали такую штуку:
#define FASTADC 1 // defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
void setup() {
long int start ;
long int i ;
#if FASTADC // set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif
Serial.begin(9600) ;
Serial.print("ADCTEST: ") ;
start = millis() ;
for (i = 0 ; i < 61500 ; i++) analogRead(1) ;
Serial.print(millis() - start) ;
Serial.println(" msec (61500 calls)") ;
}
void loop() {
}
В результате получаем увеличения быстродействия примерно в 8 раз.

60кГц - это более чем достаточно, можно будет ещё и математикой заниматься в промежутках между чтением АЦП. Вот ссылочка на статейку про ускорение ввода-вывода на микроконтроллерах AVR: http://habrahabr.ru/post/141442/
только вот пока не могу разобраться, как это работает :-)))
Нужно оцифровать сигнал с микрофона. На первый взгляд - гавновопрос !
Пишем val=analogRead(1);
Только вот, даже если процессор ничего больше не делает, скорость выполнения этой команды через стандартную библиотеку составляет каких-то 8кГц.

По теореме Котельникова "частота дискретизации должна минимум в два раза превышать частоту обрабатываемого сигнала", т.е. мы можем оцифровать максимум до 4кГц. Этого мало даже для речевого сигнала :-(
Если нам нужно сделать БПФ (быстрое преобразование Фурье) и получить спектр звукового сигнала, то необходимо минимум 44кГц частоты дискретизации.
Нарыл в интернете подобную проблемку. Умные люди придумали такую штуку:
#define FASTADC 1 // defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
void setup() {
long int start ;
long int i ;
#if FASTADC // set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif
Serial.begin(9600) ;
Serial.print("ADCTEST: ") ;
start = millis() ;
for (i = 0 ; i < 61500 ; i++) analogRead(1) ;
Serial.print(millis() - start) ;
Serial.println(" msec (61500 calls)") ;
}
void loop() {
}
В результате получаем увеличения быстродействия примерно в 8 раз.

60кГц - это более чем достаточно, можно будет ещё и математикой заниматься в промежутках между чтением АЦП. Вот ссылочка на статейку про ускорение ввода-вывода на микроконтроллерах AVR: http://habrahabr.ru/post/141442/
только вот пока не могу разобраться, как это работает :-)))
no subject
Date: 2014-10-15 09:04 pm (UTC)Ñак ÑÑо лаба по ÑлекÑÑонике или по c++?
no subject
Date: 2014-10-15 10:20 pm (UTC):-)))
ХоÑÑ Ð·Ð°Ð²ÑÑа ÑÑо-нибÑÐ´Ñ "ÑгÑабиÑÑ" Ñ Ð³ÐµÐ½ÐµÑаÑоÑа, пÑÑÑÑ ÑÑÑденÑÑ ÑнаÑала поÑÑÑоÑÑ Ñигнал в EXELе, а поÑом пÑеобÑазование ФÑÑÑе вÑÑÑнÑÑ Ð¸ полÑÑим ÑпекÑÑ Ñигнала, на ÑледÑÑÑем занÑÑии воплоÑим маÑемаÑÐ¸ÐºÑ Ð² конÑÑолеÑе, а поÑом бÑдем "опознаваÑÑ" ÑпекÑÑ Ð²Ð¾ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¼ Ñигнале и "ÑеагиÑоваÑÑ" на него.
ÐÑÑÐ³Ð°Ñ Ð´Ð¸ÑÑиплина Ñ Ð¼ÐµÐ½Ñ - "Ð¡Ñ ÐµÐ¼Ð¾ÑÐµÑ Ð½Ð¸ÑеÑкое пÑоекÑиÑование ÐС" , Ñам Ñоже пÑÑаÑÑÑ Ñе же лабоÑаÑоÑки пÑидÑмаÑÑ, ÑолÑко задаÑи дÑÑгие.
ÐÑÑÑ Ñ Ð¼ÐµÐ½Ñ ÐµÑÑ "ÐонÑÑÑÑиÑование ÐС на базе ÐÐС" Ð¸Ñ Ñоже поÑÑепенно Ð¿Ð¾Ð´Ð²Ð¾Ð¶Ñ Ðº ÑомÑ, ÑÑÐ¾Ð±Ñ Ð¼Ð½Ðµ бÑло полегÑе занимаÑÑÑÑ Ñ Ð½Ð¸Ð¼Ð¸ вÑеми.
Ð "ÐнÑоÑмаÑионнÑе ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ð¸" и "ÐнÑоÑмаÑика" Ñ Ð²ÐµÑеÑников - Ñам С++
no subject
Date: 2014-10-15 11:21 pm (UTC)еÑли ÑÑда же Ð¿Ð¸Ñ Ð°ÑÑ Ð¸ маÑемаÑикÑ, Ñогда надо делаÑÑ Ð°Ñп аÑÐ¸Ð½Ñ ÑоннÑм - ÑнимаÑÑ Ð¸Ð·Ð¼ÐµÑÐµÐ½Ð¸Ñ Ð¿Ð¾ пÑеÑÑваниÑм, а обÑабаÑÑваÑÑ Ð² оÑновном Ñикле. инаÑе вон ÑÐ¾Ñ Ñикл Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ ÑÑаÑиÑÑÑ Ð²Ð¿ÑÑÑÑÑ.
пÑо c++ ÑпÑоÑил из-за Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¿Ð°ÑÑÑ
no subject
Date: 2014-10-16 06:34 am (UTC)Ðа, ÑÑо бÑÐ´ÐµÑ Ð¾Ð±ÑзаÑелÑно. Ð ÑабоÑÑ Ð¿Ð¾ пÑеÑÑваниÑм Ñоже планиÑÑÑ.
РабоÑа болÑÑÐ°Ñ Ð¿Ð¾Ð»ÑÑаеÑÑÑ, бÑдем по ÑаÑÑÑм делаÑÑ.