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 бъет Вашу карту!
Сделал так, но есть проблема с реал и имаг.
#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 = 20; //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]; q0 = coeff * q1 - q2 + (float) data[i]; q2 = q1; q1 = q0; } real = (q1 * cosine - q2) / scalingFactor; imag = (q1 * sine) / scalingFactor; magnitude = sqrtf(real * real + imag * imag); //phase = atan(imag/real) // q2 = 0; // q1 = 0; /* /////////////////////////////////////////// float magnitudeSquared = (q1 * q1) + (q2 * q2) - q1 * q2 * coeff; magnitude = sqrt(magnitudeSquared); //q2 = 0; //q1 = 0; //////////////////////////////////////////// */ Serial.print( real); Serial.print("\t"); Serial.print(imag); Serial.print("\t"); Serial.println(magnitude); delay(50); }