Ещё раз о FFT, FHT для Arduino

Andrey2020
Offline
Зарегистрирован: 09.07.2020

Доброго дня, Формчане.

Увлёкся темой 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??

Заранее спасибо

 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Andrey2020 пишет:

Но по факту воз и ныне там. при компиляции вылезают теже кучи ошибок т.е. PROGMEM тьп.

а поправить ошибки никак?

Andrey2020
Offline
Зарегистрирован: 09.07.2020

никак...(

Andrey2020
Offline
Зарегистрирован: 09.07.2020

их оч много вылезает

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Andrey2020 пишет:
хочется поиметь быстрое FHT...
А мне, помню, по молодости, Мадонну поиметь хотелось. Вот как вкусы от поколения к поколению меняются.

Andrey2020
Offline
Зарегистрирован: 09.07.2020

Ворота пишет:

Andrey2020 пишет:
хочется поиметь быстрое FHT...
А мне, помню, по молодости, Мадонну поиметь хотелось. Вот как вкусы от поколения к поколению меняются.

Да ладно....

Короче тема закрыта.

Я когда скачивал 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 года... типа с исправлениями... Что ж... сегодня буду проверять

 

Andrey2020
Offline
Зарегистрирован: 09.07.2020

b707 пишет:

Andrey2020 пишет:

Но по факту воз и ныне там. при компиляции вылезают теже кучи ошибок т.е. 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 LOG_OUT 1 // use the log output function
#define FHT_N 256 // set to 256 point fht
#include <FHT.h> // include the library
void setup() {
  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
}
void loop() {
  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
  }
}

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Andrey2020 пишет:

Есть два вопроса:

Не понял, а как же #5

Andrey2020 пишет:

Короче тема закрыта.

Вы бы, Ваше благородие, определились уже, что у Вас там закрыто и сколько вопросов есть.

Morroc
Offline
Зарегистрирован: 24.10.2016

Andrey2020 пишет:

А мне не надо до 20 - мне хватит и до 5000Hz. Не понятно как изменить этот параметр.

Сами то как думаете ? Сделайте паузу между измерениями, можно пока тупо в лоб.

Andrey2020
Offline
Зарегистрирован: 09.07.2020

Morroc пишет:

Andrey2020 пишет:

А мне не надо до 20 - мне хватит и до 5000Hz. Не понятно как изменить этот параметр.

Сами то как думаете ? Сделайте паузу между измерениями, можно пока тупо в лоб.

пробовал. Вставлял delaymicros(Xx);

появились дополнительные гармоники

стал разбираться… записал в цикле чтения ацп заодно массив с длительностями чтения.

потом прочел его.

оказалось что кадые н милисекунд счетчик взбрыкивает и выдает задержку в 0.1 секунды

это потомучто в прерываниях задействован таймер 0 сикоторым тесно связан delay();

короче не все так просто. Буду переделывать алгоритм на таймер 1

Morroc
Offline
Зарегистрирован: 24.10.2016

Да все просто, хз что вы там делаете. В соседней теме вам даже код приводили как это делать совсем правильно.