Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

resample

Remuestrear datos uniformes o no uniformes a nueva tasa fija

Descripción

ejemplo

y = resample(x,p,q) remuestrea la secuencia de entrada, x, a p/q veces la tasa de muestreo original. resample aplica un Filtro paso bajo anti-aliasing FIR a x y compensa el retardo introducido por el filtro. La función opera a lo largo de la primera dimensión del arreglo con un tamaño mayor que 1.

y = resample(x,p,q,n) utiliza un filtro anti-aliasing de orden 2 × n × max(p,q).

ejemplo

y = resample(x,p,q,n,beta) especifica el parámetro de forma de la ventana de Kaiser utilizada para diseñar el filtro paso bajo.

y = resample(x,p,q,b) filtra x utilizando los coeficientes de filtro especificados en b.

ejemplo

yTT = resample(xTT,p,q,___) remuestrea los datos muestreados uniformemente en el horario de MATLAB® xTT a p/q veces la tasa de muestreo original y devuelve un horario yTT. Puede especificar argumentos adicionales n, beta o b.

y = resample(x,tx) remuestrea los valores, x, de una señal muestreada en los instantes especificados en el vector tx. La función interpola x de forma lineal en un vector de instantes espaciados uniformemente con los mismos puntos finales y número de muestras que tx. Los NaN se tratan como datos faltantes y se ignoran.

y = resample(x,tx,fs) utiliza un filtro anti-aliasing polifase para remuestrear la señal a la tasa de muestreo uniforme especificada en fs.

y = resample(x,tx,fs,p,q) interpola la señal de entrada a una malla uniforme intermedia con un espaciamiento de muestreo de (p/q)/fs. Después, la función filtra el resultado para sobremuestrearlo por p y submuestrearlo por q, lo que genera una tasa de muestreo final de fs. Para obtener los mejores resultados, asegúrese de que fs × q/p es al menos el doble de grande que el componente de frecuencia más alto de x.

ejemplo

y = resample(x,tx,___,method) especifica el método de interpolación junto con cualquiera de los argumentos de sintaxis anteriores en este grupo. El método de interpolación puede ser "linear", "pchip" o "spline".

[y,ty] = resample(x,tx,___) devuelve en ty los instantes que corresponden a la señal remuestreada.

ejemplo

yTT = resample(xTT,___) remuestrea los datos muestreados de manera no uniforme en xTT y devuelve datos muestreados uniformemente. yTT tiene los mismos puntos finales y el mismo número de muestras que xTT. Puede especificar las mismas opciones de argumento disponibles en la entrada x,tx.

ejemplo

[y,b] = resample(x,p,q,___) también devuelve los coeficientes del filtro aplicado a x durante el remuestreo.

[y,ty,b] = resample(x,tx,___) devuelve en b los coeficientes del filtro anti-aliasing.

[yTT,b] = resample(xTT,___) remuestrea los datos del horario en xTT y también devuelve los coeficientes del filtro anti-aliasing en b.

ejemplo

[___] = resample(___,Dimension=dim) remuestrea la entrada a lo largo de la dimensión dim. (desde R2020b)

Ejemplos

contraer todo

Remuestree una secuencia lineal sencilla a 3/2 de la tasa original de 10 Hz. Represente la señal original y la remuestreada en la misma figura.

fs = 10;
t1 = 0:1/fs:1;
x = t1;
y = resample(x,3,2);
t2 = (0:(length(y)-1))*2/(3*fs);

plot(t1,x,'*',t2,y,'o')
xlabel('Time (s)')
ylabel('Signal')
legend('Original','Resampled', ...
    'Location','NorthWest')

Figure contains an axes object. The axes object with xlabel Time (s), ylabel Signal contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Original, Resampled.

Cuando se filtra, resample asume que la secuencia de entrada, x, es cero antes y después de las muestras que se proporcionan. Si se producen desviaciones grandes de cero en los puntos finales de x, es posible que se generen valores inesperados para y.

Muestre estas desviaciones remuestreando una secuencia triangular y una versión desplazada verticalmente de la secuencia con puntos finales distintos de cero.

x = [1:10 9:-1:1;
    10:-1:1 2:10]';
y = resample(x,3,2);

subplot(2,1,1)
plot(1:19,x(:,1),'*',(0:28)*2/3 + 1,y(:,1),'o')
title('Edge Effects Not Noticeable')
legend('Original','Resampled', ...
    'Location','South')

subplot(2,1,2)
plot(1:19,x(:,2),'*',(0:28)*2/3 + 1,y(:,2),'o')
title('Edge Effects Noticeable')
legend('Original','Resampled', ...
    'Location','North')

Figure contains 2 axes objects. Axes object 1 with title Edge Effects Not Noticeable contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Original, Resampled. Axes object 2 with title Edge Effects Noticeable contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Original, Resampled.

Construya una señal sinusoidal. Especifique una tasa de muestreo en la que 16 muestras se corresponden exactamente con un periodo de señal. Dibuje una gráfica de tallos y hojas de la señal. Superponga una gráfica de escaleras para visualizar el muestreo y retención.

fs = 16;
t = 0:1/fs:1-1/fs;

x = 0.75*sin(2*pi*t);

stem(t,x)
hold on
stairs(t,x)
hold off

Figure contains an axes object. The axes object contains 2 objects of type stem, stair.

Utilice resample para sobremuestrear la señal por un factor de cuatro. Utilice la configuración predeterminada. Represente el resultado junto a la señal original.

ups = 4;
dns = 1;

fu = fs*ups;
tu = 0:1/fu:1-1/fu;

y = resample(x,ups,dns);

stem(tu,y)
hold on
stairs(t,x)
hold off
legend("Resampled","Original")

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. These objects represent Resampled, Original.

Repita el cálculo. Especifique n = 1 para que el filtro anti-aliasing sea de orden 2×1×4=8. Especifique un parámetro de forma β=0 para la ventana de Kaiser. Obtenga como salida el filtro y la señal remuestreada.

n = 1;
beta = 0;

[y,b] = resample(x,ups,dns,n,beta);

fo = filtord(b)
fo = 8
stem(tu,y)
hold on
stairs(t,x,"--")
hold off
legend("n = 1, \beta = 0")

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. This object represents n = 1, \beta = 0.

La señal remuestreada muestra efectos de solapamiento que provienen del lóbulo principal relativamente ancho y de la baja atenuación del lóbulo lateral de la ventana.

Aumente n a 5 y deje β=0. Verifique que el filtro sea de orden 40. Represente la señal remuestreada.

n = 5;

[y,b] = resample(x,ups,dns,n,beta);

fo = filtord(b)
fo = 40
stem(tu,y)
hold on
stairs(t,x,"--")
hold off
legend("n = 5, \beta = 0")

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. This object represents n = 5, \beta = 0.

La ventana más larga tiene un lóbulo principal más estrecho y atenúa mejor los efectos de solapamiento. También atenúa la señal.

Deje el orden del filtro en 2×5×4=40 y aumente el parámetro de forma a β=20.

beta = 20;

y = resample(x,ups,dns,n,beta);

stem(tu,y)
hold on
stairs(t,x,"--")
hold off
legend("n = 5, \beta = 20")

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. This object represents n = 5, \beta = 20.

La elevada atenuación del lóbulo lateral ofrece un buen remuestreo.

Reduzca el orden del filtro para devolverlo a 2×1×4=8 y deje β=20.

n = 1;

[y,b] = resample(x,ups,dns,n,beta);

stem(tu,y)
hold on
stairs(t,x,"--")
hold off
legend("n = 1, \beta = 20")

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. This object represents n = 1, \beta = 20.

El lóbulo principal más ancho genera artefactos considerables al remuestrear.

Genere 60 muestras de una sinusoide y remuestréela a 3/2 de la tasa original. Muestre las señales originales y las remuestreadas.

tx = 0:6:360-3;
x = sin(2*pi*tx/120);

ty = 0:4:360-2;
[y,by] = resample(x,3,2);

plot(tx,x,'+-',ty,y,'o:')
legend('original','resampled')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent original, resampled.

Represente la respuesta en frecuencia del filtro anti-aliasing.

freqz(by)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

Remuestree la señal a 2/3 de la tasa original. Muestre la señal original y su remuestreo.

tz = 0:9:360-9;
[z,bz] = resample(x,2,3);

plot(tx,x,'+-',tz,z,'o:')
legend('original','resampled')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent original, resampled.

Represente la respuesta al impulso del nuevo filtro paso bajo.

impz(bz)

Figure contains an axes object. The axes object with title Impulse Response, xlabel n (samples), ylabel Amplitude contains an object of type stem.

Cree dos vectores de diez números generados aleatoriamente. Asuma que se registró diariamente un número para cada vector durante un total de diez días. Almacene los datos en un horario de MATLAB.

a = randn(10,1);
b = randn(10,1);

t = days(1:10);

xTT = timetable(t',[a b]);

Utilice la función resample para aumentar la tasa de muestreo de una vez por día a una vez por hora. Represente ambos conjuntos de datos.

yTT = resample(xTT,24,1);

subplot(2,1,1)
plot(xTT.Time,xTT.Var1,'-o')
subplot(2,1,2)
plot(yTT.Time,yTT.Var1,'-o')

Figure contains 2 axes objects. Axes object 1 contains 2 objects of type line. Axes object 2 contains 2 objects of type line.

Utilice los datos registrados por Galileo Galilei en 1610 para determinar el periodo orbital de Calisto, el más alejado de los cuatro satélites más grandes de Júpiter.

Galileo observó el movimiento de los satélites durante seis semanas, empezando el 15 de enero. Las observaciones presentan muchas lagunas porque Júpiter no era visible en las noches nubladas. Genere un arreglo datetime de las horas de observación.

t = [0 2 3 7 8 9 10 11 12 17 18 19 20 24 25 26 27 28 29 31 32 33 35 37 ...
    41 42 43 44 45]'+1;

yg = [10.5 11.5 10.5 -5.5 -10.0 -12.0 -11.5 -12.0 -7.5 8.5 12.5 12.5 ...
    10.5 -6.0 -11.5 -12.5 -12.5 -10.5 -6.5 2.0 8.5 10.5 13.5 10.5 -8.5 ...
    -10.5 -10.5 -10.0 -8.0]';

obsv = datetime(1610,1,15+t);

Remuestree los datos en una malla normal utilizando una tasa de muestreo de una observación por día. Utilice un factor de sobremuestreo de 3 moderado para evitar el sobreajuste.

fs = 1;

[y,ty] = resample(yg,t,fs,3,1);

Represente los datos y la señal remuestreada.

plot(t,yg,'o',ty,y,'.-')
xlabel('Day')

Figure contains an axes object. The axes object with xlabel Day contains 2 objects of type line. One or more of the lines displays its values using only markers

Repita el procedimiento utilizando la interpolación por splines y mostrando las fechas de las observaciones. Exprese la tasa de muestreo en días inversos.

fs = 1/86400;

[ys,tys] = resample(yg,obsv,fs,3,1,'spline');

plot(t,yg,'o')
hold on
plot(ys,'.-')
hold off

ax = gca;
ax.XTick = t(1:9:end);
ax.XTickLabel = char(obsv(1:9:end));

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Calcule la estimación del espectro de potencia del periodograma de los datos interpolados linealmente y espaciados uniformemente. Elija una longitud de la DFT de 1024. La señal alcanza el pico a la inversa del periodo orbital.

[pxx,f] = periodogram(ys,[],1024,1,'power');
[pk,i0] = max(pxx);

f0 = f(i0);
T0 = 1/f0
T0 = 16.7869
plot(f,pxx,f0,pk,'o')
xlabel('Frequency (day^{-1})')

Figure contains an axes object. The axes object with xlabel Frequency (day toThePowerOf -1 baseline ) contains 2 objects of type line. One or more of the lines displays its values using only markers

Una persona registra su peso en libras la mayor parte de los días del año bisiesto 2012, e introduce las muestras que faltan como NaN. Cargue los datos y almacene las mediciones en un horario de MATLAB. Especifique los tiempos de fila con un vector datetime y elimine las muestras que faltan.

load weight2012.dat

rowTimes = datetime(2012,1,1:366)';
wt = weight2012(:,2);
xTT = timetable(rowTimes,wt);
xTT(isnan(wt),:) = [];

Remuestree los datos. El resultado es un horario con los datos muestreados de manera uniforme con los mismos puntos finales y número de muestras que wt.

yTT = resample(xTT);

Represente los datos originales y los remuestreados para compararlos. Ajuste los límites del eje x para mostrar solo las mediciones en el mes de agosto.

plot(xTT.rowTimes,xTT.wt,":o",yTT.Time,yTT.wt,"-*")
aug = datetime([2012 08 01;2012 08 31]); 
xlim(aug)
legend(["Original" "Resampled"])

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original, Resampled.

Remuestree los datos de nuevo utilizando la interpolación cúbica.

yTTs = resample(xTT,"pchip");

plot(xTT.rowTimes,xTT.wt,":o",yTTs.Time,yTTs.wt,"-*")
xlim(aug)
legend(["Original" "Resampled"])

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original, Resampled.

Ahora, aumente la tasa de muestreo a dos mediciones por día y utilice la interpolación por splines. Represente el resultado.

fs = 1/86400;
yTTf = resample(xTT,2*fs,"spline");

plot(xTT.rowTimes,xTT.wt,":o",yTTf.Time,yTTf.wt,'-*')
xlim(aug)
legend(["Original" "Resampled"])

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original, Resampled.

Genere una señal sinusoidal de cinco canales y 100 muestras. El tiempo aumenta en las columnas y la frecuencia se reduce en las filas. Represente la señal.

p = 3;
q = 2;

tx = 0:p:300-p;

x = cos(2*pi*tx./(1:5)'/100);

plot(tx,x,'.:')
title('Original')
ylim([-1.5 1.5])

Figure contains an axes object. The axes object with title Original contains 5 objects of type line.

Sobremuestree la sinusoide por 3/2 a lo largo de su segunda dimensión. Superponga la señal remuestreada en la gráfica.

ty = 0:q:300-q;

y = resample(x,p,q,'Dimension',2);

plot(ty,y,'.:')
title('Upsampled')

Figure contains an axes object. The axes object with title Upsampled contains 5 objects of type line.

Cambie la forma de la señal remuestreada para que el tiempo pase a lo largo de una tercera dimensión.

y = permute(y,[1 3 2]);
size(y)
ans = 1×3

     5     1   150

Submuestree la señal devolviéndola a su tasa original y represéntela.

z = resample(y,q,p,'Dimension',3);

plot(tx,squeeze(z),'.:')
title('Downsampled')

Figure contains an axes object. The axes object with title Downsampled contains 5 objects of type line.

Argumentos de entrada

contraer todo

Señal de entrada, especificada como un vector, matriz o arreglo N-D. x puede contener valores NaN cuando se proporciona información de tiempo. Los NaN se tratan como datos faltantes y se excluyen del remuestreo.

Ejemplo: cos(pi/4*(0:159))+randn(1,160) es una señal de vector fila monocanal.

Ejemplo: cos(pi./[4;2]*(0:159))'+randn(160,2) es una señal de dos canales.

Tipos de datos: single | double

Factores de remuestreo, especificados como enteros positivos.

Tipos de datos: single | double

Número de términos contiguos, especificado como un entero positivo. Si n = 0, resample lleva a cabo la interpolación del elemento más cercano. La longitud del filtro FIR anti-aliasing es proporcional a n. Los valores más grandes de n proporcionan más precisión a costa de más tiempo de cálculo.

Tipos de datos: single | double

Parámetro de forma de ventana de Kaiser, especificado como un escalar real positivo. Al aumentar beta, se ensancha el lóbulo principal de la ventana utilizada para diseñar el filtro anti-aliasing y se reduce la amplitud de los lóbulos laterales de la ventana.

Tipos de datos: single | double

Coeficientes de filtro FIR, especificados como un vector. De forma predeterminada, resample diseña el filtro utilizando firls con una ventana de Kaiser. Cuando se compensa el retardo, resample asume que b tiene longitud impar y fase lineal. Para obtener más información, consulte Filtro paso bajo anti-aliasing.

Tipos de datos: single | double

Horario de entrada con al menos dos filas, especificado como un valor timetable. Cada variable de xTT se trata como una señal independiente. Si una variable del horario es un arreglo N-D, resample opera a lo largo de la primera dimensión.

Nota

  • RowTimes debe ser un vector de duración o un objeto datetime con valores únicos y finitos. Los valores de tiempo no finitos se tratan como datos faltantes y se ignoran.

  • Si no están ordenados, resample ordena RowTimes en orden ascendente.

Para obtener más información, consulte timetable.

Instantes de tiempo, especificados como un vector real no negativo o un arreglo datetime. tx debe aumentar monotónicamente, pero no tiene que estar uniformemente espaciado. tx puede contener varios NaN o varios NaT. Estos valores se tratan como datos faltantes y se excluyen del remuestreo. tx es válido solo para la entrada x.

Tipos de datos: single | double | datetime

Tasa de muestreo, especificada como un escalar positivo. La tasa de muestreo es el número de muestras por unidad de tiempo. Si la unidad de tiempo es el segundo, la tasa de muestreo estará en Hz.

Tipos de datos: single | double

Método de interpolación, especificado como "linear", "pchip" o "spline":

  • "linear": interpolación lineal.

  • "pchip": interpolación cúbica a trozos que conserva la forma.

  • "spline": interpolación por splines que utiliza condiciones finales not-a-knot.

Para obtener más información, consulte la página de referencia interp1.

Nota

Si x no varía lentamente, considere utilizar interp1 con el método de interpolación "pchip".

Dimensión sobre la que se desea operar, especificada como escalar entero positivo. Si no se especifica dim, resample opera a lo largo de la primera dimensión del arreglo con un tamaño mayor que 1. Si la entrada es un horario, dim debe ser 1.

Tipos de datos: single | double

Argumentos de salida

contraer todo

Señal remuestreada, devuelta como vector, matriz o arreglo N-D. Si x es de longitud N a lo largo de la dimensión dim y especifica p y q, entonces y es de longitud ⌈N × p/q a lo largo de dim.

Coeficientes del filtro FIR, devueltos como un vector.

Instantes de salida, devueltos como un vector real no negativo. ty se aplica solo para la entrada x.

Horario remuestreado, devuelto como un valor timetable.

Más acerca de

contraer todo

Filtro paso bajo anti-aliasing

Para remuestrear una señal por un factor racional p/q, resample llama a upfirdn, que, conceptualmente, sigue estos pasos:

  1. Inserta ceros para sobremuestrear la señal por p.

  2. Aplica un filtro FIR anti-aliasing a la señal sobremuestreada.

  3. Descarta muestras para submuestrear la señal filtrada por q.

El filtro anti-aliasing ideal tiene una frecuencia de corte normalizada fc = π/max(p,q) rad/muestra y una ganancia p. Para aproximar el filtro anti-aliasing, resample utiliza el método de la ventana de Kaiser.

  • El orden de filtrado es 2 × n × max(p,q). El valor predeterminado de n es 10.

  • La venta de Kaiser tiene un parámetro de forma beta que controla el tradeoff entre el ancho de transición y la atenuación de la banda de parada. El valor predeterminado de beta es 5.

  • Los coeficientes del filtro se normalizan para justificar la ganancia de procesamiento de la ventana.

Como ejemplo, diseñe un filtro anti-aliasing para remuestrear una señal a 3/2 veces su tasa de muestreo original:

p = 3;
q = 2;
maxpq = max(p,q);

fc = 1/maxpq;
n = 10;
order = 2*n*maxpq;
beta = 5;

b = fir1(order,fc,kaiser(order+1,beta));
b = p*b/sum(b);
Para obtener más información, consulte Resampling Uniformly Sampled Signals.

Sugerencias

  • Utilice la función isregular para determinar si un horario se ha muestreado uniformemente.

Algoritmos

resample realiza un diseño FIR utilizando firls, normaliza el resultado para justificar la ganancia de procesamiento de la ventana y, a continuación, implementa un cambio de tasa utilizando upfirdn.

Capacidades ampliadas

Historial de versiones

Introducido antes de R2006a

expandir todo