Arduino вход

antonx
Offline
Зарегистрирован: 29.12.2019

Здравствуйте 

Пытаюсь заставить эту программу работать на ардуино.
#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 одни нули.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Наверно потому что нумсамплес равен нулю?

rkit
Offline
Зарегистрирован: 23.11.2016

А зачем ты это всё перелопатил вместо использования функции как есть?

antonx
Offline
Зарегистрирован: 29.12.2019

#1 =проверю 

#2 = в оригинале нет входа

rkit
Offline
Зарегистрирован: 23.11.2016

antonx пишет:

#2 = в оригинале нет входа

А это что?

float* data

antonx
Offline
Зарегистрирован: 29.12.2019

сделал так 


//float TARGET_FREQUENCY = 0.0;
float TARGET_FREQUENCY =1700;

//int numSamples = 0;
int numSamples = 64;

на мониторе случайные числа , не реагируют на подачу сигнала 

 

antonx
Offline
Зарегистрирован: 29.12.2019

rkit пишет:

antonx пишет:

#2 = в оригинале нет входа

А это что?

float* data

А как это связать с A0 , и где будет

 

void setup() {

  // put your setup code here, to run once:
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
nik182
Offline
Зарегистрирован: 04.05.2015

Выведите значение дата(и) в сериал и посмотрите что там.

rkit
Offline
Зарегистрирован: 23.11.2016

Может тебе учебник по базовому программированию прочитать, прежде чем лезть в анализ сигналов? Без этого всё равно ничего не получится.

antonx
Offline
Зарегистрирован: 29.12.2019

rkit пишет:

antonx пишет:

#2 = в оригинале нет входа

А это что?

float* data

и он не компилируется = много ошибок

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

флоат в ардуино имеет 7 значащих цифр  (1024 х 1024) и если два знака после запятой уже не влезет

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

флоат в ардуино имеет 7 значащих цифр  (1024 х 1024) и если два знака после запятой уже не влезет

float везде имеет 23 значащие цифры (разумеется, двоичные).

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А если строку 6 поменять на:

#define audioInPin  A0

может чего и получится...

Да и q0, q1, q2 на до бы изначально инициализировать. А то хрень какая-то

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mykaida пишет:

А если строку 6 поменять на:

#define audioInPin  A0

может чего и получится...

Да и q0, q1, q2 на до бы изначально инициализировать. А то хрень какая-то

Ни от одного, ни от второго абсолютно ничего не изменится.

 

Там, вообще-то было замечание еще в сообщении №1. Пока это не исправлено, дальше говорить не о чем.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

andriano пишет:

Там, вообще-то было замечание еще в сообщении №1. Пока это не исправлено, дальше говорить не о чем.

Согласен, не заметил. №1 - это все наше!

Хотя нет - №5 бъет Вашу карту!

antonx
Offline
Зарегистрирован: 29.12.2019

Сделал так, но есть проблема с реал и имаг. 

На изображениях , как программа реагирует на включение и выключение сигнала. 
#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);
}