Soy programador, no matemático, pero tengo un problema del mundo real que estoy tratando de resolver que está fuera de mi alcance, y mis habilidades en Google hasta ahora me han fallado.
Tengo una forma de onda analógica que ha sido muestreada, parte de la cual contiene una onda sinusoidal, como se muestra a continuación: La frecuencia de muestreo de los datos y la frecuencia de la onda sinusoidal son constantes, pero no están relacionadas. Necesito tomar esta forma de onda muestreada, y "upsamplearla", es decir, generar más muestras entre los puntos de muestreo existentes. Para hacer esto, he estado utilizando la interpolación de Spline cúbico. He tomado una biblioteca de C ++ existente de la siguiente ubicación: http://kluge.in-chemnitz.de/opensource/spline/ . Las fórmulas se dan en la página. Paso los datos muestreados existentes como puntos de control, con "X" ajustado al número de muestra, e "Y" ajustado al valor de la muestra. Dado un valor de entrada de X, esta biblioteca me genera el valor "Y" correspondiente, por lo que pasar una X de 2,5 generaría un valor en la spline generada a medio camino entre las muestras 2 y 3. Todo esto está funcionando muy bien hasta ahora, y produce una forma de onda como la que se muestra arriba, pero ahora necesito hacer una cosa extra en la que estoy un poco atascado.
Lo que necesito hacer ahora es "sincronizar" con la onda sinusoidal en los datos de la muestra. Para ello, quiero detectar el punto en el que la onda sinusoidal cruza un umbral determinado, como se muestra a continuación: En otras palabras, dado un valor inicial de X, quiero calcular el siguiente valor de X en el que Y es igual a un valor determinado. En la actualidad, "fuerzo" una solución aproximada, incrementando en un tamaño de paso dado entre dos valores de X hasta que cruza el punto de umbral. Esto plantea dos problemas:
- Precisión. La solución es sólo aproximada, y necesito un resultado muy preciso. Esto conduce a un tamaño de paso muy pequeño, sin dejar de tener un margen de error.
- Rendimiento. Tengo literalmente miles de millones de estas operaciones para realizar, y quiero algo que pueda evaluar en un período de tiempo razonable. Ahora mismo tengo que sacrificar la precisión para mejorar el rendimiento.
En lugar de utilizar una búsqueda de fuerza bruta imperfecta como hago actualmente, me preguntaba si hay una solución matemática para este problema. Básicamente quiero una función que, dada una posición inicial X y un valor de muestra Y objetivo, devuelva la siguiente X en la que Y sea igual al valor Y objetivo. Creo que esto debería ser posible de lograr, pero me faltan los conocimientos matemáticos para derivar la fórmula yo mismo. ¿Puede alguien decirme si tal función es teóricamente posible de escribir, y si es así, cuál sería una posible implementación?
Aquí hay algunas restricciones potencialmente útiles en mis datos de entrada, que cualquier solución aceptable puede asumir:
- Las coordenadas X de los puntos de control son valores linealmente crecientes (es decir, todos están espaciados uniformemente y nunca se "duplican")
- Conozco los límites superior e inferior de las coordenadas X e Y de los puntos de control al generar la spline
Por favor, dígame si puede ver una solución a este problema.