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;
}
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.
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
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.
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.
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.