¿Cómo extrapolar una señal 1D?

25

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. ingrese la descripción de la imagen aquí

PearsonArtPhoto
fuente
3
¿Es esto en el contexto de colocar una imagen en mosaico, hacer algo como una extensión de cielo u otra cosa? En otras palabras, ¿hay otras medidas de calidad para la extensión además de ser "suave" en los bordes?
Datageist
3
Tu pregunta no está clara. ¿Qué quieres decir con "extender"? ¿Está intentando duplicar y catear copias de su señal (mosaico) o desea aumentar la muestra en 5x o desea grabarla durante 5x más? ¿Su señal es periódica? Creo que es necesaria una pregunta más concreta y bien definida y un ejemplo mínimo de lo que estás tratando de lograr definitivamente te ayudará.
Lorem Ipsum
1
¿extensión significa interpolación? La pregunta no es muy clara.
Sriram el
Nunca me di cuenta de que podría significar tantas cosas ... Trataré de hacerlo más claro, básicamente quiero tener una señal 1-D muestreada a la misma velocidad, pero por un período de tiempo más largo.
PearsonArtPhoto
1
@endolith: ¿Eso mejora las cosas?
PearsonArtPhoto

Respuestas:

16

Dependiendo del material fuente, el método de interpolación espectral basado en DCT descrito en el siguiente artículo parece prometedor:

lk, HG, Güler S. "Transformación de señal e interpolación basada en síntesis de DCT modificada" , Digital Signal Processing, artículo en prensa, 2011.

Aquí hay una de las figuras del artículo que muestra un ejemplo de interpolación:

ingrese la descripción de la imagen aquí

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 ).

Datageist
fuente
1
Lamentablemente, el enlace está muerto. Solo pude encontrar esta descarga paga .
knedlsepp
@knedlsepp Este enlace parece proporcionar el documento sin estar detrás de un muro de pago.
Peter K.
18

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 lpcfunción para estimar los coeficientes LPC.

N = 150;    % Order of LPC auto-regressive model
P = 500;    % Number of samples in the extrapolated time series
M = 150;    % Point at which to start predicting

t = 1:P;

x = 5*sin(t/3.7+.3)+3*sin(t/1.3+.1)+2*sin(t/34.7+.7); %This is the measured signal

a = lpc(x, N);

y = zeros(1, P);

% fill in the known part of the time series
y(1:M) = x(1:M);

% in reality, you would use `filter` instead of the for-loop
for ii=(M+1):P      
    y(ii) = -sum(a(2:end) .* y((ii-1):-1:(ii-N)));
end

plot(t, x, t, y);
l = line(M*[1 1], get(gca, 'ylim'));
set(l, 'color', [0,0,0]);
legend('actual signal', 'extrapolated signal', 'start of extrapolation');

Por supuesto, en el código real que usaría filterpara implementar la extrapolación, utilizando los coeficientes LPC acomo filtro IIR y precargando los valores conocidos de la serie de tiempo en el estado del filtro; algo como esto:

% Run the initial timeseries through the filter to get the filter state 
[~, zf] = filter(-[0 a(2:end)], 1, x(1:M));     

% Now use the filter as an IIR to extrapolate
y((M+1):P) = filter([0 0], -a, zeros(1, P-M), zf); 

Aquí está la salida:

Ejemplo de LPC

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 lpca arburgen el código anterior produce los siguientes resultados:

Extrapolación utilizando el método Burg

El código está disponible aquí: https://gist.github.com/2843661

nibot
fuente
H(z)=b(z)/a(z)
@Emre ¿Hay alguna manera de mejorar la extrapolación?
nibot
Como dice @chinnu, la manera fácil es alimentar la salida a la entrada.
Emre
2
Muy bien, me hiciste encender MATLAB: P El problema puede evitarse usando un algoritmo de estimación AR diferente; simplemente reemplace a=lpc(x,N)por a=arburg(x,N). Para una discusión (en seco) sobre algoritmos AR, vea Por qué Yule-Walker no debe usarse para el modelado autorregresivo
Emre
1
Obviamente, esto es un poco tarde, pero hay un problema con su configuración. Usted proporciona la serie de tiempo completo de x( Pmediciones) a lpc(o arburg) 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 primeras Mmediciones. Proporcionar menos puntos de tiempo da como resultado una extrapolación inferior, pero aún funciona razonablemente bien.
Chris C
6

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.

chinnu
fuente
6

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 ?

Phonon
fuente
(Años después) otro algoritmo para encontrar algunos componentes de frecuencia es la inversión armónica .
denis