Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Reconstrucción de los datos que faltan

En este ejemplo se muestra cómo reconstruir los datos que faltan mediante interpolación, filtrado de suavizado y modelado autoregresivo.

Introducción

Con la llegada del hardware de adquisición de datos barato, a menudo tiene acceso a señales que se muestrean rápidamente a intervalos regulares. Esto le permite obtener una aproximación fina a la señal subyacente. Pero, ¿qué sucede cuando los datos que está midiendo se muestrean gruesamente o de otro modo faltan porciones significativas? ¿Cómo se deducen los valores de las señales en puntos entre las muestras que conoce?

Interpolación lineal

La interpolación lineal es, con mucho, el método más común de inferir valores entre puntos muestreados. De forma predeterminada, al trazar un vector en MATLAB, verá los puntos conectados por líneas rectas. Usted necesita muestrear una señal con muy fino detalle para aproximar la señal verdadera.

En este ejemplo, un sinusoides se muestrea con resolución fina y gruesa. Cuando se traza en un gráfico, el sinusoides finamente muestreado se parece mucho a cómo se vería el verdadero sinusoides continuo. Por lo tanto, se puede utilizar como un modelo de la "señal verdadera." En la siguiente gráfica, las muestras de una señal muestreada gruesa se muestran como círculos conectados por líneas rectas.

tTrueSignal = 0:0.01:20; xTrueSignal = sin(2*pi*2*tTrueSignal/7);  tSampled = 0:20; xSampled = sin(2*pi*2*tSampled/7);  plot(tTrueSignal,xTrueSignal,'-', ...     tSampled,xSampled,'o-') legend('true signal','samples')

Es sencillo recuperar muestras intermedias de la misma manera que realiza la interpolación.plot Esto se puede lograr con el método lineal de la función.interp1

tResampled = 0:0.1:20; xLinear = interp1(tSampled,xSampled,tResampled,'linear'); plot(tTrueSignal,xTrueSignal,'-', ...      tSampled, xSampled, 'o-', ...      tResampled,xLinear,'.-') legend('true signal','samples','interp1 (linear)')

El problema con la interpolación lineal es que el resultado no es muy suave. Otros métodos de interpolación pueden producir aproximaciones más suaves.

Interpolación de spline

Muchas señales físicas son como los sinusoides en que son continuos y tienen derivados continuos. Puede reconstruir dichas señales utilizando la interpolación spline cúbica, lo que garantiza que la primera y la segunda derivada de la señal interpolada sean continuas en cada punto de datos:

xSpline = interp1(tSampled,xSampled,tResampled,'spline'); plot(tTrueSignal,xTrueSignal,'-', ...      tSampled, xSampled,'o', ...      tResampled,xLinear,'.-', ...      tResampled,xSpline,'.-') legend('true signal','samples','interp1 (linear)','interp1 (spline)')

Las splines cúbicas son particularmente efectivas al interpolar señales que consisten en sinusoides. Sin embargo, hay otras técnicas que se pueden utilizar para obtener una mayor fidelidad a las señales físicas que tienen derivados continuos hasta un orden muy alto.

Remuestreo con filtros antialiasing

La función de la caja de herramientas de procesamiento de señales proporciona otra técnica para rellenar los datos que faltan. puede reconstruir componentes sinusoidales de baja frecuencia con muy baja distorsión.resampleresample

xResample = resample(xSampled, 10, 1); tResample = 0.1*((1:numel(xResample))-1);  plot(tTrueSignal,xTrueSignal,'-', ...      tResampled,xSpline, '.', ...      tResample, xResample,'.') legend('true signal','interp1 (spline)','resample')

Al igual que los otros métodos, tiene alguna dificultad para reconstruir los puntos finales.resample Por otro lado, la parte central de la señal reconstruida está muy bien de acuerdo con la señal verdadera.

xlim([6 10])

Remuestreo con muestras que faltan

puede acomodar señales muestreadas de manera no uniforme.resample La técnica funciona mejor cuando la señal se muestrea a una velocidad alta.

En el ejemplo siguiente, creamos un sinusoides que se mueve lentamente, quitamos una muestra y hacemos zoom en las proximidades de la muestra que falta.

tTrueSignal = 0:.1:20; xTrueSignal = sin(2*pi*2*tTrueSignal/15);  Tx = 0:20;  Tmissing = Tx(10); Tx(10) = [];  x = sin(2*pi*2*Tx/15); Xmissing = sin(2*pi*2*Tmissing/15);  [y, Ty] = resample(x,Tx,10,'spline');  plot(tTrueSignal, xTrueSignal, '-', ...      Tmissing,Xmissing,'x ', ...      Tx,x,'o ', ...      Ty,y,'. ') legend('true signal','missing sample','remaining samples','resample with ''spline''') ylim([-1.2 1.2]) xlim([6 14])

El sinusoides reconstruido rastrea la forma de la señal verdadera razonablemente bien, con sólo un ligero error en las proximidades de la muestra faltante.

Sin embargo, no funciona bien cuando hay una gran brecha en la señal.resample Por ejemplo, considere un sinusoides amortiguado cuya parte media falta:

tTrueSignal = (0:199)/199; xTrueSignal = exp(-0.5*tTrueSignal).*sin(2*pi*5*tTrueSignal);  tMissing = tTrueSignal; xMissing = xTrueSignal; tMissing(50:140) = []; xMissing(50:140) = [];  [y,Ty] = resample(xMissing, tMissing, 200, 'spline');  plot(tTrueSignal,xTrueSignal,'-', ...      tMissing,xMissing,'o',...      Ty,y,'.') legend('true signal','samples','resample with ''spline''')

Aquí se asegura de que la señal reconstruida es continua y tiene derivados continuos en las proximidades de los puntos que faltan.resample Sin embargo, no puede reconstruir adecuadamente la parte que falta.

Reconstruyendo grandes brechas

Como se puede ver anteriormente, el filtrado y la interpolación cúbica por sí solos podrían no ser suficientes para lidiar con grandes brechas. Sin embargo, con ciertos tipos de señales muestreadas, como las que surgen al observar fenómenos oscilantes, a menudo puede inferir los valores de muestras faltantes en función de los datos inmediatamente anteriores o posteriores a la brecha.

La función puede reemplazar las muestras que faltan (especificadas por ) en una señal muestreada uniformemente ajustando un modelo autoregresivo a las muestras que rodean un hueco y extrapolando en el hueco desde ambas direcciones.fillgapsNaN

tTrueSignal = (0:199)/199; xTrueSignal = exp(-.5*tTrueSignal).*sin(2*pi*5*tTrueSignal); gapSignal = xTrueSignal; gapSignal(50:140) = NaN; y = fillgaps(gapSignal);  plot(tTrueSignal,xTrueSignal,'-', ...      tTrueSignal,gapSignal,'o', ...      tTrueSignal,y,'.')  legend('true signal','samples','reconstructed signal')

La técnica funciona porque las señales autoregresivas tienen información que se extiende sobre muchas muestras. Sólo unas pocas muestras dentro de cualquier segmento son necesarias para reconstruir completamente la señal completa.

Este tipo de reconstrucción se puede adaptar para estimar las muestras faltantes de señales más complicadas. Considere una señal de audio muestreada de una cuerda de guitarra arrancada después de eliminar seiscientas muestras inmediatamente después de la desplumada:

[y,fs] = audioread('guitartune.wav'); x = y(1:3500); x(2000:2600) = NaN; y2 = fillgaps(x); plot(1:3500, y(1:3500), '-', ...      1:3500, x, '.', ...      1:3500, y2, '-') legend('original signal','samples','reconstructed signal',...        'Location','best')

Reconstruyendo brechas con estimación localizada

Es bastante sencillo rellenar datos dentro de un vacío cuando se sabe que la señal en las proximidades de la brecha se puede modelar con un solo proceso autoregresivo. Puede mitigar los problemas cuando una señal consiste en un proceso autoregresivo no constante restringiendo el área sobre la que se calculan los parámetros del modelo. Esto es útil cuando usted está tratando de llenar un vacío dentro del período de "anillo" de una resonancia que viene inmediatamente antes o después de otra resonancia, más fuerte.

x = y(350001:370000); x(6000:6950) = NaN; y2 = fillgaps(x); y3 = fillgaps(x,1500); plot(1:20000, y(350001:370000), '-', ...      1:20000, x, '.', ...      1:20000, y2, '-', ...      1:20000, y3, '-') xlim([2200 10200]) legend('original signal','samples','fillgaps (all)','fillgaps (localized)',...        'Location','best')

En la gráfica anterior, a la forma de onda le falta una sección justo antes de una resonancia grande. Como antes, se utiliza para extrapolar en la región de separación utilizando todos los datos disponibles.fillgaps Una segunda llamada para utilizar solo 1500 muestras a cada lado de la brecha para realizar el modelado.fillgaps Esto mitiga el efecto de la guitarra posterior arrancar después de la muestra 7500.

Resumen

Ha visto varias formas de reconstruir los datos que faltan de sus valores de muestra vecinos mediante interpolación, remuestreo y modelado autoregresivo.

La interpolación y el remuestreo funcionan para señales que varían lentamente. El remuestreo con filtros de suavizado a menudo hace un mejor trabajo en la reconstrucción de señales que consisten en componentes de baja frecuencia. Para reconstruir grandes brechas en las señales oscilantes, el modelado autoregresivo en las proximidades de la brecha puede ser particularmente eficaz.

Lectura posterior

Para obtener más información sobre el remuestreo uniforme y no uniforme, véase