FFT Arduino UNO

Hola a todos y gracias por su tiempo
Necesito conocer la frecuencia de una señal que leo por un puerto analógico (A0). Para ello he instalado la librería "ArduinoFFT" y me he basado en el EJEMPLO 3. El problema que tengo es que mi señal tiene una frecuencia de 0.3-3Hz y he estado haciendo pruebas cambiando el tipo de ventana y la frecuencia de muestreo pero no consigo obtener la frecuencia de la señal. Cabe añadir que para hacer pruebas estoy utilizando un generador de ondas y de esta manera saber la señal que el Arduino tiene que leer.
Un saludo y gracias
Os dejo el enlace a la libreria

#include "arduinoFFT.h"

arduinoFFT FFT = arduinoFFT(); /* Create FFT object */

#define CHANNEL A0
const uint16_t samples = 128; //This value MUST ALWAYS be a power of 2
const double samplingFrequency = 128; //Hz, must be less than 10000 due to ADC ///126

unsigned int sampling_period_us;
unsigned long microseconds;

double vReal[samples];
double vImag[samples];

unsigned long myTime;
double delta=0;
unsigned long anterior =0;
void setup()
{
  sampling_period_us = round(1000000*(1.0/samplingFrequency));
  Serial.begin(115200);
  while(!Serial);
  Serial.println("Ready");
}

void loop()
{
   myTime =micros();
    delta = (myTime-anterior);
  microseconds = micros();
  for(int i=0; i<samples; i++)
  {
      vReal[i] = analogRead(CHANNEL);
      vImag[i] = 0;
      while(micros() - microseconds < sampling_period_us)
      {
      }
      microseconds += sampling_period_us;
  }
  
  FFT.Windowing(vReal, samples, FFT_WIN_TYP_RECTANGLE, FFT_FORWARD);  /* Weigh data */
  FFT.Compute(vReal, vImag, samples, FFT_FORWARD); /* Compute FFT */
  FFT.ComplexToMagnitude(vReal, vImag, samples); /* Compute magnitudes */
  FFT.DCRemoval(vReal,samples);
  double x = FFT.MajorPeak(vReal, samples, samplingFrequency);

  //double x = FFT.MajorPeak();
  unsigned int rpm = x * 60;
  
  Serial.print("Tiempo: ");
  Serial.println(delta);
  Serial.print("Frecuencia (Hz): ");
  Serial.println(x, 6); //Print out what frequency is the most dominant.
  Serial.print("rpm: ");
  Serial.println(rpm);
  //while(1); /* Run Once */
    anterior=myTime;
}

Fijate si no te va mejor esto Frecuencímetro 1Hz a 4Mhz

En cuanto al código, siempre es mejor que lo subas porque sino nos obligas a instalar o buscar la librería para ver los ejemplos. Digamos que no es algo que juegue a tu favor. :wink:

Saludos

Coincido con Gatul debes publicar el código, y no obligarnos a instalar la libreria.
En el ejemplo 3, toma una serie de datos (64) en cierto periodo de tiempo, definido por la variable samplingFrequency (100 Hz por default). Cuando intentas medir una frecuencia de dos ordenes de magnitud mas baja tienes el problema que no estas tomando una adecuada muestra. Baja el valor samplingFrequency hasta que coincida con tu rango de medición

Muchas gracias por tu respuesta. He editado mi pregunta.
Un saludo y voy a probar lo que me has pasado

Hola,
He bajado el valor de sampling frecuency a unos 10 Hz y seguía teniendo el mismo problema, además tardaba demasiado. Según he estado viendo si quiero hacer esto deberé de elegir otro tipo de Arduino o probar con otra marca

Si tu onda esta en 10 Hz no es necesario cambiar de Arduino, esa es una frecuencia muy lenta, hasta es posible que un ser humano vea el parpadeo a esa frecuencia.

mis ondas van entre 0.3 Hz y como máximo 4Hz. Lo que intento hacer con esto es medir la frecuencia de pedaleo por eso son frecuencias tan bajas

No me parece adecuado usar FFT para medir frecuencias tan bajas.
El tema no es cambiar de placa sino usar las herramientas adecuadas.

Saludos

Entonces FFT no es lo que necesitas. La transformada de Fourier esta pensada para obtener mucha mas información que la necesitas.

y que me recomiendas utilizar. Yo solo conocía esta opción para obtener la frecuencia de un seno

La transformada rápida de Fourier se usa (entre muchas cosas) para deconvolucionar señales complejas, en una serie de ondas de diferente frecuencia. Su mayor utilidad esta en la filtración de señales ruidosas.
Descríbenos un poco tu realidad física, que es lo que quieres medir y como.

Lo que hago yo es medir el voltaje a través de un divisor de tensión de un sensor FSR que va colocado en el pedal de una bicicleta. De esta manera cuando presionamos el pedal se varia la resistencia y obtengo una grafica como la que he adjuntado. Mi intencion es obtener la frecuencia en tiempo real de la señar, es decir, la cadencia de pedaleo. Para ello necesito que se obtengan datos cada menos de 1 segundo
Gracias por su tiempo

Yo conformaría esa señal, convenientemente amplificada si es necesario, a través de una puerta Schmidt-Trigger y trabajaría con la señal digital obtenida en lugar de samplearla con el ADC.

Saludos

Me rectifico, si puedes usar una FFT, pero no seria practico. No podrías obtener información cada segundo, es decir 1 Hz, si tu frecuencia esta en ese orden. Por eso cuando bajas la frecuencia en el ejemplo 3, de la librería, toma datos por varios segundos para obtener una muestra de varios picos.
Yo ( es una opinión) suavizaría esa curva con un promedio móvil y buscaría la distancia entre picos o distancia entre máximos y mínimos.