Алгоритм Гёрцеля

Тема в разделе "Arduino & Shields", создана пользователем REm, 27 май 2016.

  1. REm

    REm Гик

    Для детекции определённой частоты существует алгоритм Гёрцеля. На ардуино существует библиотека с данным алгоритмом https://github.com/jacobrosenthal/Goertzel
    Но вот беда, среда 1.6.6 и 1.6.9 не считают данную библиотеку работоспособной.
    Кто пользовался данной библиотекой, можете подсказать как устранить неисправность?
     
  2. ZAZ-965

    ZAZ-965 Гуру

    У меня на 1.6.9 пример detect.ino собрался нормально.
     
  3. REm

    REm Гик

    а можешь выложить на файлообменник свою версию?
     
  4. ZAZ-965

    ZAZ-965 Гуру

    Я ничего не менял, скачал с Гита Goertzel-master.zip, распаковал в %UserProfile%\Documents\Arduino\libraries и переименовал в папку в Goertzel.
     
  5. REm

    REm Гик

    Arduino: 1.6.9 (Windows 7), Плата:"Arduino/Genuino Uno"

    пишет эту ошибку
     
  6. ZAZ-965

    ZAZ-965 Гуру

    Учебное заведение (странное расположение папки программы)? Выведите список файлов вашей папки Goertzel
     
  7. REm

    REm Гик

    arduino-1.6.9\libraries\Goertzel\examples\detect
    Goertzel.h
    Goertzel
    detect
     
  8. ZAZ-965

    ZAZ-965 Гуру

    Должно быть такое содержимое.
     

    Вложения:

    • lib.png
      lib.png
      Размер файла:
      16,1 КБ
      Просмотров:
      536
  9. REm

    REm Гик

    вроде бы так
     

    Вложения:

    • ЕПО.png
      ЕПО.png
      Размер файла:
      69,1 КБ
      Просмотров:
      517
  10. ZAZ-965

    ZAZ-965 Гуру

    Не так, перенесите все файлы, кроме detect.ino, в папку Goertzel
     
    REm нравится это.
  11. REm

    REm Гик

    перебросил, заработало вроде. Спасибо
     
  12. ZAZ-965

    ZAZ-965 Гуру

  13. REm

    REm Гик

    спасибо за помощь. С другими библиотеками не было проблем, вот в тупик и встал.
     
  14. REm

    REm Гик

    Код (C++):
     goertzel.sample(sensorPin); //Will take n samples
     
      float magnitude = goertzel.detect();  //check them for target_freq
      Serial.println(detectsignal);

     
      if(magnitude>THRESHOLD){ //if you're getting false hits or no hits adjust this
    detectsignal = 1;
        digitalWrite(led, HIGH);
       
      }
         else
         detectsignal = 0;
        digitalWrite(led, LOW);
    добавляя в код detectsignal светодиод еле мерцает, а без этой переменной горит ярко. Не могу понять причину.
    Ведь по логике, я не оказываю на выходной порт с индикатором, влияния, но на деле происходит иначе.
     
  15. ZAZ-965

    ZAZ-965 Гуру

    По-моему, должно быть так
    Код (C++):
    else
    {   detectsignal = 0;
        digitalWrite(led, LOW);
    }
     
    REm нравится это.
  16. REm

    REm Гик

    именно так, глупо было не залезть в справочник.
    спасибо за помощь.
     
  17. REm

    REm Гик

    Код (C++):


    #include <Goertzel.h>
    int sensorPin = A5;
    int led = 8;
    int detectsignal = 0;


    float TARGET_FREQUENCY = 128.50;
    const int N = 100;    
    const float THRESHOLD = 4000;  

    int tire = 0;
    int tiredetect = 0;
    int t4k = 0;
    int t4kdetect = 0;
    int ttd = 0;

    //  _SFR_BYTE(ADCSRA) |=  _BV(ADPS2); // Set ADPS2
    //  _SFR_BYTE(ADCSRA) &= ~_BV(ADPS1); // Clear ADPS1
    //  _SFR_BYTE(ADCSRA) &= ~_BV(ADPS0); // Clear ADPS0
    const float SAMPLING_FREQUENCY = 8900;

    Goertzel goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);

    void setup(){
      pinMode(led, OUTPUT);    
      Serial.begin(9600);
    }

    void loop()
    {                                                                         ///////////////  детекция частоты
        goertzel.sample(sensorPin);
     
      float magnitude = goertzel.detect();  //check them for target_freq
     
    if(magnitude>THRESHOLD)
                  {
                  detectsignal = 1;
                  digitalWrite(led, HIGH);
                  ttd +=1;
                  }
         else
                {
                digitalWrite(led, LOW);
                detectsignal = 0;                                          
                ttd = 0;
                }                                                                ///////////////////////////////////////////////////////
          {
          if (ttd >= 500)                                                   ///////////////детекция тире
                {
                tire = 1;
                }
          else
             {
              tire = 0;
              }                                                               ///////////////////////////////////////////
    Serial.println(ttd);

          }
    }
     
    Собрал простой детектор, и отработал часть кода.
    И на данный момент подобная конструкция устраивает. Но в секундах срабатывание я установить не смог.
    ttd >= 500 установил приблизительно. Задержку в код вставлять нельзя, а без неё не выходит, многозадачность не усвоил дальше примера со светодиодом.
    И вообще, возможно ли ttd +=1; сделать с шагом заданным временем?