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.

Remuestreo de señales muestreadas no uniformemente

Este ejemplo muestra cómo remuestrear las señales muestreadas no uniformemente a una nueva velocidad uniforme. Muestra cómo aplicar un filtro personalizado en datos muestreados irregularmente para reducir el alias. También muestra cómo utilizar detrending para eliminar transitorios al principio y al final de la señal.

Remuestreo de señales muestreadas no uniformemente a una velocidad deseada

La función le permite convertir una señal muestreada de forma no uniforme a una nueva velocidad uniforme.resample

Cree un sinusoides de 500 Hz muestreado irregularmente a unos 48 kHz. Simulamos la irregularidad añadiendo valores aleatorios al vector uniforme.

rng default nominalFs = 48000; f = 500; Tx = 0:1/nominalFs:0.01; irregTx = sort(Tx + 1e-4*rand(size(Tx))); x = sin(2*pi*f*irregTx); plot(irregTx,x,'.')

Para volver a muestrear una señal muestreada de forma no uniforme, puede llamar con una entrada vectorial de tiempo.resample

El siguiente ejemplo convierte nuestra señal original en una velocidad uniforme de 44,1 kHz.

desiredFs = 44100; [y, Ty] = resample(x,irregTx,desiredFs); plot(irregTx,x,'.-', Ty,y,'o-') legend('Original','Resampled') ylim([-1.2 1.2])

Puede ver que nuestra señal remuestreada tiene la misma forma y tamaño que la señal original.

Elegir un método de interpolación

El algoritmo de conversión en funciona mejor cuando las muestras de entrada están lo más cerca posible de espaciados regularmente, por lo que es instructivo observar lo que puede suceder cuando falta una sección de las muestras de entrada de los datos muestreados.resample

El siguiente ejemplo entalla la segunda cresta del sinusoides de entrada y aplica el remuestreo.

irregTx(105:130) = []; x = sin(2*pi*f*irregTx); [y, Ty] = resample(x,irregTx,desiredFs);  plot(irregTx,x,'. ') hold on plot(Ty,y,'.-') hold off legend('Original','Resampled') ylim([-1.2 1.2])

El segmento que falta está conectado mediante interpolación lineal. La interpolación lineal es el método predeterminado utilizado por la función para remuestrear datos muestreados no uniformemente.resample

En algunos casos en los que faltan datos o grandes espacios en la entrada, puede recuperar algunos de los datos que faltan eligiendo un método de interpolación diferente.

Para señales de bajo ruido y bajo ancho de banda, las splines pueden ser muy efectivas cuando se utilizan para reconstruir la señal original. Para utilizar una spline cúbica durante el remuestreo, proporcione el método de interpolación 'spline':

[y, Ty] = resample(x,irregTx,desiredFs,'spline');  plot(irregTx,x,'. ') hold on plot(Ty,y,'.-') hold off legend('Original','Resampled using ''spline''') ylim([-1.2 1.2])

Control de la cuadrícula de interpolación

De forma predeterminada, construye una cuadrícula intermedia que es una aproximación racional cercana de la relación entre la frecuencia de muestreo deseada y la frecuencia de muestreo media de la señal.resample

Si una sección de las muestras de entrada contiene componentes de alta frecuencia, puede controlar el espaciado de la cuadrícula intermedia eligiendo coeficientes enteros y, para seleccionar esta relación racional.pq

Examine la respuesta escalonada de un filtro de segundo orden subamplificado que oscila a una velocidad de aproximadamente 3 Hz:

w = 2*pi*3; d = .1002; z = sin(d); a = cos(d);   t = [0:0.05:2 3:8];  x = 1 - exp(-z*w*t).*cos(w*a*t-d)/a; plot(t,x,'.-')

La respuesta de paso se muestrea a una velocidad alta donde está oscilando y a una tasa baja donde no lo está.

Ahora vuelva a muestrear la señal a 100 Hz utilizando los ajustes predeterminados:

Fs = 100; [y, Ty] = resample(x,t,Fs); plot(t,x,'. ') hold on plot(Ty,y) hold off legend('Original','Resampled (default settings)')

La envolvente de la oscilación al inicio de la forma de onda se atenúa y oscila más lentamente que la señal original.

, de forma predeterminada, interpola a una cuadrícula de intervalos espaciados regularmente que corresponden a la frecuencia de muestreo media de la señal de entrada.resample

avgFs = (numel(t)-1) /(t(end)-t(1))
avgFs = 5.7500 

La frecuencia de muestreo de la cuadrícula debe ser superior al doble de la frecuencia más grande que desea medir. La frecuencia de muestreo de la cuadrícula, 5,75 muestras por segundo, está por debajo de la frecuencia de muestreo de Nyquist, 6 Hz, de la frecuencia de timbre.

Para que la cuadrícula tenga una frecuencia de muestreo más alta, puede proporcionar los parámetros enteros y . ajusta la frecuencia de muestreo de la cuadrícula a Q*Fs/P, interpola la señal y, a continuación, aplica su convertidor de frecuencia de muestreo interno (upsampling by P y downsampling by Q) para recuperar la frecuencia de muestreo deseada, Fs.pqresample Se utiliza para seleccionar y .ratpq

Puesto que el timbre de la oscilación es de 3 Hz, especifique la rejilla con una frecuencia de muestreo de 7 Hz, que es un poco más alta que la velocidad Nyquist. El espacio para la cabeza de 1 Hz representa el contenido de frecuencia adicional debido a la envolvente exponencial en descomposición.

Fgrid = 7; [p,q] = rat(Fs/Fgrid)
p = 100 
q = 7 
 [y, Ty] = resample(x,t,Fs,p,q); plot(t,x,'.') hold on plot(Ty,y) hold off legend('Original','Resampled (custom P and Q)')

Especificación del filtro antialiasing

En el siguiente ejemplo, puede ver la salida de un digitalizador que mide la configuración del acelerador en un motor de avión. El ajuste del acelerador se muestrea de forma no uniforme alrededor de una velocidad nominal de 100 Hz. Intentaremos remuestrear esta señal a una velocidad uniforme de 10 Hz.

Aquí están las muestras de nuestra señal original.

load engineRPM plot(t,x,'.') xlabel('Time (s)') ylabel('RPM')

Nuestra señal está cuantificada. Ahora haga zoom en la región ascendente en el intervalo de tiempo de 20 segundos a 23 segundos:

plot(t,x,'.') xlim([20 23])

La señal está variando lentamente dentro de esta región. Esto le permite eliminar parte del ruido de cuantificación utilizando el filtro de suavizado en el remuestreador.

desiredFs = 10; [y,ty] = resample(x,t,desiredFs);  plot(t,x,'.') hold on plot(ty,y,'.-') hold off xlabel('Time') ylabel('RPM') legend('Original','Resampled') xlim([20 23])

Esto funciona razonablemente bien. Sin embargo, la señal remuestreada se puede suavizar aún más proporcionando un filtro con una frecuencia de corte baja.resample

En primer lugar, establezca el espaciado de la cuadrícula para que sea sobre nuestra frecuencia de muestreo nominal de 100 Hz.

nominalFs = 100;

A continuación, determine un valor razonable y para obtener la tarifa deseada.pq Dado que la velocidad nominal es de 100 Hz y nuestra velocidad deseada es de 10 Hz, es necesario diezmar 10 p. Esto equivale a establecer en 1 y establecer en 10.pq

p = 1; q = 10;

Puede suministrar con su propio filtro.resample Para tener una alineación temporal adecuada, el filtro debe ser de longitud impar. La longitud del filtro debe ser unas cuantas veces mayor que o (lo que sea mayor).pq Establezca la frecuencia de corte para que sea 1 / límite deseado y, a continuación, multiplique los coeficientes resultantes por .qp

% ensure an odd length filter n = 10*q+1;  % use .25 of Nyquist range of desired sample rate cutoffRatio = .25;  % construct lowpass filter  lpFilt = p * fir1(n, cutoffRatio * 1/q);  % resample and plot the response [y,ty] = resample(x,t,desiredFs,p,q,lpFilt);  plot(t,x,'.') hold on plot(ty,y) hold off xlabel('time') ylabel('RPM') legend('Original','Resampled (custom filter)','Location','best') xlim([20 23])

Eliminación de efectos de punto final

Ahora aleja para ver nuestra señal original. Tenga en cuenta que hay un desplazamiento significativo en los puntos finales.

plot(t,x,'.',ty,y) xlabel('time') ylabel('RPM') legend('original','resampled (custom filter)','Location','best')

Estos artefactos surgen porque asume que la señal es cero fuera de los bordes de la señal.resample Para reducir el efecto de estas discontinuidades, reste una línea entre los puntos finales de la señal, realice el remuestreo y, a continuación, vuelva a agregar la línea a la función original. Puede hacerlo calculando la pendiente y el desfase de la línea entre la primera y la última muestra, y utilizando para construir la línea que se va a restar.polyval

% compute slope and offset (y = a1 x + a2) a(1) = (x(end)-x(1)) / (t(end)-t(1)); a(2) = x(1);  % detrend the signal xdetrend = x - polyval(a,t); plot(t,xdetrend)

La señal detendencia ahora tiene ambos de sus puntos finales cerca de cero, lo que reduce los transitorios introducidos. Llame y, a continuación, agregue de nuevo la tendencia.resample

[ydetrend,ty] = resample(xdetrend,t,desiredFs,p,q,lpFilt);  y = ydetrend + polyval(a,ty);  plot(t,x,'.',ty,y) xlabel('Time') ylabel('RPM') legend('Original','Resampled (detrended, custom filter)','Location','best')

Resumen

Este ejemplo muestra cómo utilizar para convertir señales muestreadas uniforme sin uniforme y no uniforme a una velocidad fija.resample

Lectura adicional

Para obtener más información sobre la reconstrucción de muestras espaciadas no uniformemente con splines personalizadas, puede consultar la documentación de la caja de herramientas de ajuste de curvas™.