Tengo una señal de cierta longitud, digamos 1000 muestras. Me gustaría extender esta señal a 5000 muestras, muestreadas a la misma velocidad que la original (es decir, quiero predecir cuál sería la señal si continuara muestreando durante un período de tiempo más largo). La señal se compone de varios componentes sinusoidales sumados.
El método que se me ocurrió por primera vez fue tomar la FFT completa y extenderla, pero esto deja una discontinuidad muy fuerte en el cuadro 1001. También he considerado usar solo la parte del espectro cerca de los picos, y aunque esto parece mejorar la señal un poco, no me parece que la fase esté garantizada para ser correcta. ¿Cuál es el mejor método para extender esta señal?
Aquí hay un código MATLAB que muestra un método idealizado de lo que quiero. Por supuesto, no sabré de antemano que hay exactamente 3 componentes sinusoidales, ni su fase y frecuencia exactas. Quiero asegurarme de que la función es continua, que no hay un salto a medida que avanzamos al punto 501,
vals = 1:50;
signal = 100+5*sin(vals/3.7+.3)+3*sin(vals/1.3+.1)+2*sin(vals/34.7+.7); % This is the measured signal
% Note, the real signal will have noise and not be known exactly.
output_vals = 1:200;
output_signal = 100+5*sin(output_vals/3.7+.3)+3*sin(output_vals/1.3+.1)+2*sin(output_vals/34.7+.7); % This is the output signal
figure;
plot(output_signal);
hold all;
plot(signal);
Básicamente, dada la línea verde, quiero encontrar la línea azul.
Respuestas:
Dependiendo del material fuente, el método de interpolación espectral basado en DCT descrito en el siguiente artículo parece prometedor:
Aquí hay una de las figuras del artículo que muestra un ejemplo de interpolación:
Las aplicaciones de la técnica para la recuperación de segmentos perdidos ( por ejemplo, 4.2. Síntesis de períodos de tono perdido ) son probablemente más relevantes para la extrapolación. En otras palabras, toma una pieza del material fuente existente, finge que hay un segmento perdido entre el borde y el segmento arbitrario que seleccionaste, luego "reconstruye" la porción "faltante" (y quizás descarte la pieza que usaste al final). Parece que una aplicación aún más simple de la técnica funcionaría para hacer un bucle continuo del material fuente ( por ejemplo, 3.1. Interpolación de la amplitud espectral ).
fuente
Creo que la codificación predictiva lineal (también conocida como promedio móvil autorregresivo ) es lo que está buscando. LPC extrapola una serie temporal ajustando primero un modelo lineal a la serie temporal, en el que se supone que cada muestra es una combinación lineal de muestras anteriores. Después de ajustar este modelo a la serie temporal existente, se puede ejecutar para extrapolar valores adicionales mientras se mantiene un espectro de potencia estacionario (?).
Aquí hay un pequeño ejemplo en Matlab, usando la
lpc
función para estimar los coeficientes LPC.Por supuesto, en el código real que usaría
filter
para implementar la extrapolación, utilizando los coeficientes LPCa
como filtro IIR y precargando los valores conocidos de la serie de tiempo en el estado del filtro; algo como esto:Aquí está la salida:
Hace un trabajo razonable, aunque la predicción desaparece con el tiempo por alguna razón.
En realidad, no sé mucho acerca de los modelos AR y también me gustaría saber más.
-
EDITAR: @china y @Emre tienen razón, el método Burg parece funcionar mucho mejor que LPC. Simplemente cambiando
lpc
aarburg
en el código anterior produce los siguientes resultados:El código está disponible aquí: https://gist.github.com/2843661
fuente
a=lpc(x,N)
pora=arburg(x,N)
. Para una discusión (en seco) sobre algoritmos AR, vea Por qué Yule-Walker no debe usarse para el modelado autorregresivox
(P
mediciones) alpc
(oarburg
) al estimar los coeficientes del modelo. Para la extrapolación según la pregunta original, en realidad solo debe basar esta estimación en las primerasM
mediciones. Proporcionar menos puntos de tiempo da como resultado una extrapolación inferior, pero aún funciona razonablemente bien.La 'Extrapolación' 1-D es bastante simple usando el método de BURG para estimar los coeficientes LP. Una vez que los coeficientes LP están disponibles, uno puede calcular fácilmente las muestras de tiempo aplicando un filtro. Las muestras que se predicen con Burg son las próximas muestras de su segmento de tiempo de entrada.
fuente
Si está completamente seguro de que solo hay pocos componentes de frecuencia en la señal, puede probar el algoritmo MUSIC para averiguar qué frecuencias están contenidas en su señal e intentar trabajar desde allí. No estoy completamente seguro de que esto pueda funcionar perfectamente.
Además, debido a que sus datos son completamente deterministas, puede intentar construir algún tipo de predictor no lineal, entrenarlo utilizando su conjunto de datos existente y dejar que extrapole el resto.
En general, este es un problema de extrapolación, ¿es posible que desee buscar en Google algo así como la extrapolación de precio de Fourier ?
fuente