Алгоритм Герцеля для массива нот.
- Войдите на сайт для отправки комментариев
Чт, 08/09/2016 - 10:25
Всем здравствуйте, пишу в отчаяние и взываю о помощи вот по какому вопросу. Решил собрать вот такую шкатулку, но на свою Arduino Nano залить код так и не смог. Нашел в сети библиотеку Герцеля и пример использования, однако он расчитан на нахождение только одной ноты.
И вот собственно вопрос как сделать так что бы алгоритм распознавал одну частоту (ноту) и переходил к следующей?
Вот мой код с которым Я мучаюсь. Проблема его в том что изменение "target_freq" искомой частоты, происходит только в момент исполнения while и только на мгновение, а далее опять возвращается к значению глобальной переменной (587.33) Надеюсь на вашу помощь, заранее спасибо!
#include <Goertzel.h>
int sensorPin = A0;
int led = 13;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop()
{
static int pattern[] = { 587.33, 698.46, 775.33, 880.21 };
float target_freq = target_freq;
target_freq = 587.33; //must be an integer of 9000/N and be less than
float spoon = target_freq + 2.0;
float fork = target_freq - 2.0;
//sampling_frequency/2 (thanks to Nyquist)
float n = 20.0;
float sampling_freq = 9000.0;
Goertzel goertzel = Goertzel(target_freq, n, sampling_freq);
goertzel.sample(sensorPin); //Will take n samples
float magnitude = goertzel.detect(); //check them for target_freq
while (magnitude >= target_freq && magnitude <= spoon) { //if you're getting false hits or no hits adjust this
target_freq = 698.46;
digitalWrite(led, HIGH);
delay (100);
digitalWrite(led, LOW);
delay (100);
goto P2;
}
P2:
while (magnitude >= target_freq && magnitude <= spoon) { //if you're getting false hits or no hits adjust this
digitalWrite(led, HIGH);
delay (500);
digitalWrite(led, LOW);
delay (500);
target_freq = 775.33;//if found, enable led
goto P3;
}
P3:
while (magnitude >= target_freq && magnitude <= spoon) { //while you're getting false hits or no hits adjust this
digitalWrite(led, HIGH);
delay (100);
digitalWrite(led, LOW);
delay (100);
digitalWrite(led, HIGH);
delay (100);
digitalWrite(led, LOW);
delay (100);
target_freq = 880.21;//if found, enable led
goto P11;
}
P11:
while (magnitude >= target_freq && magnitude <= spoon)
{
digitalWrite(led, HIGH);
delay(3000);
digitalWrite(led, LOW);
}
Serial.println(target_freq);
}
Проблема его в том что изменение "target_freq" искомой частоты, происходит только в момент исполнения while и только на мгновение, а далее опять возвращается к значению глобальной переменной
Так у Вас же это явно указано. Уберите эту строку, и все встанет на свои места.
А строку
перенесите в setup()