Un poco de ayuda matematica

A

Bueno voy a intentar explicarme....

Por poner un ejemplo digamos que tengo una grafica, el eje X es el tiempo en el Y tengo datos sobre los sensores del acelerometro de mi smartphone.

Por lo tanto digamos que tengo algo parecido a esto (ojo imagen sacada de internet) imaginando que en el eje X tenemos el transcurso del tiempo:

Bien mi intención es analizar los datos para encontrar candidatos a variaciones significativas, o dicho de otro modo, me gustaría poder encontrar si de repente y durante un breve instante de tiempo( 1-2 seg? ) el smartphone ha sufrido una aceleración y después de una desaceleraron ha vuelto a los valores "normales".

Es importante tener en cuenta que los valores normales no tienen que ser constantes en el tiempo pero si que el incremento entre ellos no es muy alto, comparado a cuando se acelera el smartphone.

Mi pregunta importante es: ¿Alguna idea de por donde empezar? Cualquier información puede ser de ayuda.

Mi otra pregunta menos importante es nunca he trabajado con acelerometros pero despues de mirar la grafica que he puesto, la aceleración vertical (en verde) tiene valores superiores al resto. ¿Es esto debido a la gravedad? Por lo que veo tambien ocurre en otras graficas similares

Hiper-Resumen:

Quiero detectar variaciones como las del rectangulo rosa en una gran cantidad de datos:

1 comentario moderado
SasSeR_18

#2 jajaja he viajado en el tiempoooo
/homer escuchando la radio
#1 lo siento soy un deshecho de la sociedad, no pase de la ESO

dkdvd

#1 no será por la gravedad a no ser que lo hayas ido girando, en teoría si lo mantienes vertical la posición de la masa del acelerómetro estará desplazada por lo que dará un valor distinto del resto que estarán en su posición de equilibrio pero para lo que te interesa que son incrementos de aceleración te da igual lo que valgan. Yo cogería las gráficas, le haría una recta por regresión lineal a toda entera o según qué zonas por partes y paralelas pondría otras dos rectas a las distancias que consideras que tiene validez el incremento de aceleracion. Si pusieras de verdad la gráfica o los datos o algo te ayudaba más pero sin ver nada solo puedo decirte esto.
Edit: acabo de ver las gráficas en el 2º spoiler, si son las tuyas pues lo dicho, a toda entera regresión lineal por minimos cuadrados y rectas paralelas, a partir de ahí ves los picos que te interesen.

1 respuesta
dkdvd

#1 si tu gráfica es como la que viene ahí según qué quieras puedes intentar aplicarle un filtro a las frecuencias bajas(ondulaciones) y restándosela a la que tienes te quedaría la gráfica ''recta'', jajajaja me guirro!

B

El propósito de tu aplicación cual va a ser? detectar si alguien cogió el mvl? si se ha caído? si vas andando con él?

Si sólo quieres ver si ha habido aceleración "fuerte" durante 1 o 2 segundos, con un schmitt trigger tienes de sobra
http://en.wikipedia.org/wiki/Schmitt_trigger

Esa gráfica es confusa, aunque parece claro que el eje Y son mg, mezcla gráficas de velocidades angulares con aceleraciones.

1 respuesta
A

#4 Bueno no se si he entendido muy bien el metodo, pero algo es algo y tengo por donde empezar XDD mira este un ejemplo de mis datos para un muestreo. Aparecen los 3 ejes pero solo me interesa uno de ellos.

#6 No es una aplicacion movil, lo del movil es un ejemplo.

Son datos procedentes de un vehiculo y en principio no me interesa analizarlo en tiempo real si no una vez finalizado el muestreo. Digamos que me interesa encontrar movimientos inesperados (Por ejemplo una moto pasando por un bache)

El problema es que los datos no son constantes y hay como mucho ruido¿? ¿se dice asi? XD Vamos que existen pequeñas variaciones muy rapidas pero que no se deben a movimientos apreciables en la vida real. Y supongo que al tratarse de un vehiculo, este 'ruido' es mayor.

#8 woow gracias tio voy a echarle un ojo.

2 respuestas
B

#7

Por eso el Schmitt trigger es lo que buscas, es un comparador con histéresis. Lo mismo se utiliza en las señales de reloj para evitar el ruido en los circuitos electrónicos.

Sí lo que quieres es ver señales escalón bien definidas, con esa técnica debería de bastarte.

2 respuestas
sizoK

#7 Partiendo de la base de que soy un estudiante de superior de programacion y tengo -1 de idea, me viene a la cabeza que simplemente tendras que comparar las posiciones que toma respecto al segundo anterior y si la diferencia es bastante grande pues que haga lo que quieras que ocurra cuando aparece una variacion de estas.

Creo que se entiende, si no dimelo y me intento explicar mejor xd

1 respuesta
A

#8 Otra pregunta antes has dicho que los valores podrian ser en mg. En mis datos obtengo valores cercanos a los 500 y 550 para uno de los ejes, muy parecido a la primera grafica que he puesto ¿Alguna idea de la unidad de esos valores? No tengo informacion sobre el chip asi que no puedo buscar nada en internet. Bueno gracias again tio!

#9 Puede ser una forma de identificar variaciones. Lo había pensado pero no me termina de convencer, tengo el presentimiento de que estaría no teniendo en cuenta algo XD Pero lo dejo como ultima opcion si no avanzo nada, aunque igual es la mas sencilla para lo que quiero

1 respuesta
B

#10

Es muy probable que esos valores sean "brutos", es decir sin calibrar, sacados directamente de un ADC. Tienes que ir a la especificación de dónde hayas sacado el cacharro para que te diga a que equivale cada unidad.

Si no, puedes calibrarlo tu mismo para empezar. Pon el cacharro en una mesa nivelada, y el eje que más mida será 1g, y el resto 0g. Repite para los otros dos ejes.

1 respuesta
A

#11 Cierto! estoy algo perdido trabajando con estos chismes. Pero he encontrado algo parecido en otra web. No tengo el aparato ni tampoco las especificaciones del fabricante asi que haré una estimación

Measuring acceleration
The PIC's ADC was set to 10bit resolution, with 5V as the reference voltage. To get a rough estimate, I knew that the 0g on the accelerometer output would be close to 5V / 2 = 2.5V. In 10bit mode, this would correspond to (2.5V / 5V)(210)= 512. At 1g, the voltage would be 2.812V, which would correspond to (2.812V / 5V)(210)=576. Knowing this helped me write some initial code snippets to display non-calibrated acceleration values.

Calibration
Since this project was designed to display accelerations as small as 10mg, I had to calibrate the microcontroller during development. For example, using a perfect 5.000V reference for the microcontroller's 10 bit ADC with an input of 2.500V would give a 0g value of 512. However, since a 7805's voltage reference is only accurate to within 2%, and no accelerometer is perfect, I found the 0g point to be 510. (See source code).

p1ns

Diría que lo más rápido sería que usases MATLAB, metes todos los datos y buscas las posiciones cuyo valor supera algún valor medio que sea adecuado, o la derivada de la función sobrepase cierto valor. El problema es que quizás no tengas ni idea de MATLAB.

2 respuestas
NeB1

#13 La dificultad en ese método reside en calcular de forma automática un umbral óptimo para cualquier conjunto de datos. Se podría probar a adaptar el método de Otsu para este problema que tiene en cuenta la varianza de los datos.

1 respuesta
Ligia

#1 Y ese tipo de variaciones que mencionas no se podrían detectar con métodos estadísticos? Lo tengo muy oxidado, pero vaya, había algo que era la media, y la desviación típica y todo eso, que servían para analizar estas cosas. No sé si iban por ahí los tiros.

Phatality

Busca los puntos donde las derivadas tengan mas pendiente (cerca de los extremos relativos), evalúala función en esos puntos y ve comparando.

Como dice uno por ahí arriba, el matlab te lo hace.

1 respuesta
B

Para lo que quiere hacer el chico, un simple comparador es suficiente en serio. Sólo quiere detectar un escalón en la señal.

Me ha encantado el overengineering de #13 y #14 xDD

2 respuestas
NeB1

#17 xDD

p1ns

#17 Cuando dices comparador, ¿a qué te refieres?

1 respuesta
B

#19

Pues eso xD, a un comparador. Si A > umbral = 1 , si no = 0. Le pones histéresis (bajas el umbral cuando pasas 1 , y subes el umbral cuando bajas a 0) para evitar los ruidos y listo.

Es lo que se conoce como un Schmmit Trigger, lo he puesto en #16, y en digital (código) es super simple de implementar.

Esta técnica es la que se utiliza para identificar señales de reloj, que no llegan a ser ni escalón en alta frecuencia y con mucho ruido.

1 respuesta
p1ns

#20 Vale, pero tienes que saber cómo va un trigger, con el matlab si sabes matemáticas y programar un pco ya te vale. En cualquier caso tienes que saber algo.

1 respuesta
B

Filtrar esos datos es bastante facil, ademas de necesario antes de buscar nada, ya que sino te saldran miles de micro escalones.

Hay varias formas de hacerlo, la basica basica, seria coger una muestra y hacer una media con X datos hacia atras y X hacia alante, y pasar al siguiente dato..., el problema es que destroza demasiado la grafica inicial, para solucionar esto, lo mejor es multiplicar esos X datos por una constante que sea decreciente en funcion a la distancia de la muestra, asi la muestra original tiene mayor importancia y conforme te alejas tiene menos..., asi prevalece el valor real, y solo suavizas grandes distorsiones.

Si necesitas mas info, mirate algun documento de DSP (Digital Signal Processing).

B

#21

Tío... un "trigger" (o disparador en español), no es más que un puto IF THEN en código xDDD, si no sabe hacer eso es que no es la persona adecuada para resolver su propio problema.

B

Creo que no me he explicado demasiado bien antes..., lo intento de nuevo.

Tienes un array de valores (las muestras), y ahora te creas otro array de menos elementos, digamos 11, este ultimo array es de "pesos", y lo que tienes que hacer es ir usando el segundo array sobre el primero para multiplicar los elementos coincidentes uno a uno, luego desplazas el segundo array al siguiente elemento y se repite la tarea.

Para que todo cuadre, debes multiplicar los valores del primer array con los del segundo, elemento a elemento, y dividirlo entre la suma de todos los valores del segundo array, ese sera el valor ya filtrado.

Si tienes el array de pesos de 10 elementos (por decir algo, asi tienes el elemento a evaluar, y 5 por cada lado), toma la muestra 6 como la inicial, y desprecia las 5 anteriores (que no podras filtrar adecuadamente ya que no tiene valores precedentes), multiplicas los elementos del array empezando ambos por el 0, haces las operaciones, y saltas al siguiente elemento, osea, ahora multiplicarias el indice 1 de las muestras por el 0 de pesos, y asi sucesivamente...

Ahora, dependiendo de la forma de la grafica del segundo array puedes conseguir cualquier efecto, esa es la base de filtros, no te quiero aburrir con numeros funciones, y mierdas matematicas varias..., espero que me entiendas.

Suerte.

P.D.: para los pesos necesitas una funcion de segundo grado (para hacerlo plan guarro) o de tercer grado (como los campeones para suavizar bien bordes).

P.D.2: lo de los 11 elementos de peso es un dato al boleo, para un filtrado de unas muestras con muchisimo ruido, cuanto mas rapido muestrees, mas grande debe ser tambien la funcion de suavizado, osea, el array de pesos, sino el suavizado sera tan pequeño que no te libraras del ruido (por que un bache puede tener cientos de valores de largo, asi que no suavizara una mierda), asi que si es el caso, olvidate de crear la funcion de pesos a mano, generala.

P.D.3: evita funciones de suavizado de mas de 3 grados, por que sino lo que haces son varias curvas que si fuese sonido (para entendernos, un wav) saldrian reververaciones, con lo que jodes la muestra inicial, osea, el filtrado transforma, si lo haces bien, esa transformacion filtra, pero si lo haces mal, la transformacion es de todo menos un filtrado X-DDD

Usuarios habituales