Ещё раз о FFT, FHT для Arduino
- Войдите на сайт для отправки комментариев
Доброго дня, Формчане.
Увлёкся темой FFT для Arduino. на конечном этапе хочу прикрутить её к доплеровскому радару CDM324 для измерения скорости через частоту т.е. повторить проект одного итальянца который показывал в ютубе ролик но не выкладывал софт.
Я перепробовал различные FFT на 3-х разных машинках: ARDUINO UNO, ARDUINO DUE, ARDUINO MEGA2560
1. fix_fft.h работает не правильно! причём на разных платах ответ в массивах магнитуд разный...:) но по факту это полная хрень. Очевидно то что работало в 2011году уже не работает...
2. SplitRadix… работает но очень сложная и долгая FFT
3. ArduinoFFT.h - работает и меня всё устраивает но...
тут наткнулся на старую библиотеку FFT.h и прочёл там же что есть FHT.h которая работает гораздо быстрее.
Ссылка тут: http://wiki.openmusiclabs.com/wiki/ArduinoFHT
И знаете что - там написано что были обновления для новых Arduino IDE и "решены проблемы с переменными типа Library(4.0): Arduino1.6.12 and higher (updated for PROGMEM problem, fixed STRINGIFY error, fixed clobber list). Should work with older versions of Arduino as well.
Но по факту воз и ныне там. при компиляции вылезают теже кучи ошибок т.е. PROGMEM тьп.
А ведь хочется поиметь быстрое FHT...
Господа - может кто-то в теме, есть ли у кого работающая обновлённая библиотека FHT.h??
Заранее спасибо
Но по факту воз и ныне там. при компиляции вылезают теже кучи ошибок т.е. PROGMEM тьп.
а поправить ошибки никак?
никак...(
их оч много вылезает
Да ладно....
Короче тема закрыта.
Я когда скачивал zip файл с сайта
http://wiki.openmusiclabs.com/wiki/ArduinoFHT?action=AttachFile&do=view&...
решил что ArduinoFHT4.zip, ArduinoFHT3.zip, ArduinoFHT2.zip, ArduinoFHT.zip
это не 4 разных версии библиотеки а 4 части одного целого архива... в результате я всё время распаковывал и тестил либу из ArduinoFHT.zip которая от 2012 года и только сегодня обратил внимание что в ArduinoFHT4 находится FHT.h от 2016 года... типа с исправлениями... Что ж... сегодня буду проверять
Но по факту воз и ныне там. при компиляции вылезают теже кучи ошибок т.е. PROGMEM тьп.
а поправить ошибки никак?
Ошибки исправлены и всё работает. И мне больше нравится эта библиотека чем FFT.h
она очень быстрая. а FFT.н реально тормозит - скорость обработки примерно 0.14 сек
Есть два вопроса:
1. как изменить сэмплинг?
там он явно не виден так как работа идёт через директные переменные ADC... Судя по тесту он обрабатывает сигнал в полосе от 0... :) до 20 килогерц. Ну почти до 20 (до 18 тянет) тоесть сэмлениг получается 40килогерц??
А мне не надо до 20 - мне хватит и до 5000Hz. Не понятно как изменить этот параметр.
И второй вопрос - для моего проекта (доплер-радар)… мне нужно пиковую частоту вычислить т.е. major peak
в других библиотеках он есть а тут нет.
Есть ли какой-то пример кода по вычислению major peak?
Буду рад
привожу код по 1-му вопросу:
fht_adc.pde
guest openmusiclabs.com 9.5.12
example sketch for testing the fht library.
it takes in data on ADC0 (Analog0) and processes them
with the fht. the data is sent out over the serial
port at 115.2kb. there is a pure data patch for
visualizing the data.
*/
#define FHT_N 256 // set to 256 point fht
Serial.begin(115200); // use the serial port
TIMSK0 = 0; // turn off timer0 for lower jitter
ADCSRA = 0xe5; // set the adc to free running mode
ADMUX = 0x40; // use adc0
DIDR0 = 0x01; // turn off the digital input for adc0
}
while(1) { // reduces jitter
cli(); // UDRE interrupt slows this way down on arduino1.0
for (int i = 0 ; i < FHT_N ; i++) { // save 256 samples
while(!(ADCSRA & 0x10)); // wait for adc to be ready
ADCSRA = 0xf5; // restart adc
byte m = ADCL; // fetch adc data
byte j = ADCH;
int k = (j << 8) | m; // form into an int
k -= 0x0200; // form into a signed int
k <<= 6; // form into a 16b signed int
fht_input[i] = k; // put real data into bins
}
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_log(); // take the output of the fht
sei();
Serial.write(255); // send a start byte
Serial.write(fht_log_out, FHT_N/2); // send out the data
}
}
Есть два вопроса:
Не понял, а как же #5
Короче тема закрыта.
Вы бы, Ваше благородие, определились уже, что у Вас там закрыто и сколько вопросов есть.
А мне не надо до 20 - мне хватит и до 5000Hz. Не понятно как изменить этот параметр.
Сами то как думаете ? Сделайте паузу между измерениями, можно пока тупо в лоб.
А мне не надо до 20 - мне хватит и до 5000Hz. Не понятно как изменить этот параметр.
Сами то как думаете ? Сделайте паузу между измерениями, можно пока тупо в лоб.
пробовал. Вставлял delaymicros(Xx);
появились дополнительные гармоники
стал разбираться… записал в цикле чтения ацп заодно массив с длительностями чтения.
потом прочел его.
оказалось что кадые н милисекунд счетчик взбрыкивает и выдает задержку в 0.1 секунды
это потомучто в прерываниях задействован таймер 0 сикоторым тесно связан delay();
короче не все так просто. Буду переделывать алгоритм на таймер 1
Да все просто, хз что вы там делаете. В соседней теме вам даже код приводили как это делать совсем правильно.