Официальный сайт компании Arduino по адресу arduino.cc
Arduino вход
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 06/01/2021 - 15:48
Здравствуйте
Пытаюсь заставить эту программу работать на ардуино.
#include <stdio.h> #include <math.h> //#include <getopt.h> float goertzel_mag(int numSamples,float TARGET_FREQUENCY,int SAMPLING_RATE, float* data) { int k,i; float floatnumSamples; float omega,sine,cosine,coeff,q0,q1,q2,magnitude,real,imag; float scalingFactor = numSamples / 2.0; floatnumSamples = (float) numSamples; k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / (float)SAMPLING_RATE)); omega = (2.0 * M_PI * k) / floatnumSamples; sine = sin(omega); cosine = cos(omega); coeff = 2.0 * cosine; q0=0; q1=0; q2=0; for(i=0; i<numSamples; i++) { q0 = coeff * q1 - q2 + data[i]; q2 = q1; q1 = q0; } // calculate the real and imaginary results // scaling appropriately real = (q1 * cosine - q2) / scalingFactor; imag = (q1 * sine) / scalingFactor; magnitude = sqrtf(real*real + imag*imag); //phase = atan(imag/real) return magnitude; }
Вот что я сделал
#include <stdio.h> #include <math.h> //#include <getopt.h> //const float TARGET_FREQUENCY = 1700; int audioInPin = A0; int k, i; //int goertzel_mag(int numSamples, float TARGET_FREQUENCY, int SAMPLING_RATE, float* data); float omega, sine, cosine, coeff, q0, q1, q2, magnitude, real, imag; //int q0, q1, q2, omega, sine, cosine, coeff, magnitude, real, imag; float floatnumSamples =20; int SAMPLING_RATE = 8900; float TARGET_FREQUENCY = 0.0; int numSamples = 0; int data[96]; float scalingFactor = numSamples / 2.0; //int q0 = 0; //int q1 = 0; //int q2 = 0; void setup() { TARGET_FREQUENCY = 1700; int k; k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / (float)SAMPLING_RATE)); omega = (2.0 * M_PI * k) / floatnumSamples; sine = sin(omega); cosine = cos(omega); coeff = 2.0 * cosine; Serial.begin(115200); } void loop() { for (i = 0; i < numSamples; i++) { //testData[index] = analogRead(audioInPin); data[i] = analogRead(audioInPin); q0 = coeff * q1 - q2 + data[i]; q2 = q1; q1 = q0; } // calculate the real and imaginary results // scaling appropriately // real = (q1 * cosine - q2) / scalingFactor; //imag = (q1 * sine) / scalingFactor; ///////////////////// real = (q1 * cosine - q2) ; imag = (q1 * sine); /////////////////////// magnitude = sqrtf(real * real + imag * imag); //phase = atan(imag/real) Serial.println(magnitude); }
Программа не реагирует на подачу сигнала на A0,а на Serial Monitor одни нули.
Наверно потому что нумсамплес равен нулю?
А зачем ты это всё перелопатил вместо использования функции как есть?
#1 =проверю
#2 = в оригинале нет входа
#2 = в оригинале нет входа
А это что?
float
* data
сделал так
#2 = в оригинале нет входа
А это что?
float
* data
А как это связать с A0 , и где будет
void setup() {
Выведите значение дата(и) в сериал и посмотрите что там.
Может тебе учебник по базовому программированию прочитать, прежде чем лезть в анализ сигналов? Без этого всё равно ничего не получится.
#2 = в оригинале нет входа
А это что?
float
* data
и он не компилируется = много ошибок
флоат в ардуино имеет 7 значащих цифр (1024 х 1024) и если два знака после запятой уже не влезет
флоат в ардуино имеет 7 значащих цифр (1024 х 1024) и если два знака после запятой уже не влезет
float везде имеет 23 значащие цифры (разумеется, двоичные).
А если строку 6 поменять на:
#define audioInPin A0
может чего и получится...
Да и q0, q1, q2 на до бы изначально инициализировать. А то хрень какая-то
А если строку 6 поменять на:
#define audioInPin A0
может чего и получится...
Да и q0, q1, q2 на до бы изначально инициализировать. А то хрень какая-то
Ни от одного, ни от второго абсолютно ничего не изменится.
Там, вообще-то было замечание еще в сообщении №1. Пока это не исправлено, дальше говорить не о чем.
Там, вообще-то было замечание еще в сообщении №1. Пока это не исправлено, дальше говорить не о чем.
Согласен, не заметил. №1 - это все наше!
Хотя нет - №5 бъет Вашу карту!
Сделал так, но есть проблема с реал и имаг.