Tengo un sensor que informa sus lecturas con una marca de tiempo y un valor. Sin embargo, no genera lecturas a una velocidad fija.
Encuentro los datos de tasa variable difíciles de manejar. La mayoría de los filtros esperan una frecuencia de muestreo fija. Dibujar gráficos también es más fácil con una frecuencia de muestreo fija.
¿Existe un algoritmo para volver a muestrear de una frecuencia de muestreo variable a una frecuencia de muestreo fija?
resampling
FigBug
fuente
fuente
Respuestas:
El enfoque más simple es hacer algún tipo de interpolación de spline como sugiere Jim Clay (lineal o de otro tipo). Sin embargo, si tiene el lujo del procesamiento por lotes, y especialmente si tiene un conjunto sobredeterminado de muestras no uniformes, hay un algoritmo de "reconstrucción perfecta" que es extremadamente elegante. Por razones numéricas, puede no ser práctico en todos los casos, pero al menos vale la pena conocerlo conceptualmente. Lo leí por primera vez en este artículo .
El truco consiste en considerar que su conjunto de muestras no uniformes ya ha sido reconstruido a partir de muestras uniformes mediante interpolación sinc . Siguiendo la notación en el documento:
Tenga en cuenta que esto proporciona un conjunto de ecuaciones lineales, una para cada muestra no uniforme , donde las incógnitas son las muestras igualmente espaciadas , así:y ( k T )y( t ) y( k T)
En la ecuación anterior, es el número de muestras uniformes desconocidas, es el inverso de la frecuencia de muestreo uniforme, es el número de muestras no uniformes (que pueden ser mayores que ). Al calcular la solución de mínimos cuadrados de ese sistema, se pueden reconstruir las muestras uniformes. Técnicamente, solo se necesitan muestras no uniformes, pero dependiendo de cuán "dispersas" estén en el tiempo, la matriz de interpolación puede estar terriblemente mal acondicionada . Cuando ese es el caso, usar más muestras no uniformes generalmente ayuda.T mn T m nn n
Como ejemplo de juguete, aquí hay una comparación (usando numpy ) entre el método anterior y la interpolación de spline cúbico en una cuadrícula ligeramente nerviosa:
(El código para reproducir la trama anterior se incluye al final de esta respuesta)
Dicho todo esto, para métodos robustos de alta calidad, comenzar con algo en uno de los siguientes documentos probablemente sería más apropiado:
-
fuente
Esto suena como un problema de conversión asincrónica de frecuencia de muestreo. Para convertir de una frecuencia de muestreo a otra, podemos calcular la representación de tiempo continuo de la señal realizando una interpolación sinc y luego volver a muestrear a nuestra nueva frecuencia de muestreo. Lo que estás haciendo no es muy diferente. Debe volver a muestrear su señal para tener tiempos de muestra fijos.
La señal de tiempo continuo se puede calcular convolucionando cada muestra con una función sinc. Dado que la función sinc continúa indefinidamente, utilizamos algo más práctico como un sinc con ventana de una longitud finita práctica. La parte difícil es que debido a que sus muestras se mueven a tiempo, puede ser necesario utilizar un sinc con un desfase de fase diferente para cada muestra al volver a muestrear.
Señal de tiempo continuo de la señal muestreada:
donde es su tiempo de muestra. En su caso, sin embargo, su tiempo de muestreo no es fijo. Así que creo que debe reemplazarlo con el tiempo de muestra en esa muestra.Ts
A partir de esto, puede volver a muestrear la señal:
donde es el tiempo de muestra deseado.Tns
Poniendo todo junto, obtienes:
Como esto no es causal o manejable, la función sinc se puede reemplazar con una función de soporte finito y los límites de suma se ajustan en consecuencia.
Deje que kernel (t) sea una ventana sinc u otra función similar de longitud 2k y luego:
Espero que esto ayude ..., pero podría haber cometido un error en el camino y podría ser un poco intensivo en matemáticas. Recomendaría investigar la conversión de frecuencia de muestreo para obtener más información. Quizás alguien más aquí podría dar una mejor explicación o solución también.
fuente
Creo que la respuesta de Jacob es muy viable.
Un método más fácil que probablemente no sea tan bueno en términos de introducción de distorsión es hacer una interpolación polinómica. Usaría interpolación lineal (fácil, no tan buena señal de rendimiento) o splines cúbicos (todavía no demasiado duro, mejor rendimiento de señal) para producir muestras en cualquier momento que desee de sus muestras de tiempo arbitrario.
fuente
La interpretación lineal con 4 u 6 u 8 vecinos podría funcionar lo suficientemente bien para sus datos.
Sugeriría comenzar con un método que comprenda a fondo antes de sumergirse en splines, como sinc ... aunque también puede ser divertido.
Otro método bastante diferente es la ponderación de distancia inversa . Es fácil de implementar (ver idw-interpolation-with-python en SO), también funciona en 2d 3d y superior, pero es difícil de analizar teóricamente.
(Obviamente, NINGÚN método de interpolación único puede adaptarse a los miles de millones de combinaciones de
[señal, ruido, métrica de error, función de prueba] que ocurren en la realidad.
Hay más métodos en el mundo, con más botones, que funciones de prueba.
Sin embargo, una galería de métodos y funciones de prueba pueden ser útiles).
fuente
Si trabaja con matlab, puede hacerlo trabajando con series de tiempo.
fuente
Antes de comenzar a realizar un procesamiento exótico, puede probar algo simple como esto (pseudocódigo, sin interpolación, pero podría agregarse)
fuente
La respuesta de IMHO Datageist es correcta, la respuesta de Jacob no lo es. Una manera fácil de verificar esto es que el algoritmo sugerido por datageist está garantizado para interpolar a través de las muestras originales (suponiendo una precisión numérica infinita), mientras que la respuesta de Jacob no.
fuente