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 de manera no uniforme

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 aliasing. También muestra cómo usar el tendencia para eliminar los transitorios al inicio y al final de la señal.

Remuestreo de señales muestreadas de forma no uniforme a una tasa deseada

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

Crear una sinusoide de 500 Hz muestreada irregularmente a aproximadamente 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 remuestrear una señal muestreada de forma no uniforme, puede llamar con una entrada de vector de tiempo.resample

El siguiente ejemplo convierte nuestra señal original a una tasa 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 de espaciar regularmente como sea posible, 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

En el siguiente ejemplo se mutan la segunda cresta de la sinusoide de entrada y se 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 por interpolación lineal. La interpolación lineal es el método predeterminado que utiliza la función para volver a muestrear datos de muestreo no uniforme.resample

En algunos casos en los que faltan datos o lagunas grandes 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 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])

Controlar la cuadrícula de interpolación

De forma predeterminada, construye una rejilla intermedia que es una aproximación racional cercana de la relación entre la frecuencia de muestreo deseada y la frecuencia de muestreo promedio 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 del paso de un filtro de segundo orden subhumedecido 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 del paso se muestrea a una velocidad alta donde está oscilando y a una velocidad baja donde no lo es.

Ahora remuestrea la señal a 100 Hz simplemente usando la configuración predeterminada:

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

El sobre de la oscilación en el inicio de la forma de onda se atenúa y oscila más lentamente que la señal original.

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

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

La velocidad de muestreo de la rejilla debe ser superior al doble de la frecuencia más grande que desea medir. La velocidad de muestreo de la rejilla, 5,75 muestras por segundo, está por debajo de la frecuencia de muestreo de Nyquist, 6 Hz, de las frecuencias 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 rejilla a Q * FS/P, interpolar la señal y, a continuación, aplica su convertidor de frecuencia de muestreo interno (aumento de muestreo por P y disminución de resolución por Q) para recuperar la frecuencia de muestreo deseada, FS.pqresample Se usa para seleccionar y.ratpq

Dado que el zumbido 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 tasa de Nyquist. El margen 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)')

Especificar el filtro de suavizado

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 no se muestrea uniformemente sobre una tasa 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 es cuantizada. Ahora amplíe la región ascendente en el intervalo de tiempo de 20 segundos a 23 segundos:

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

La señal varía lentamente dentro de esta región. Esto le permite eliminar parte del ruido de cuantificación mediante el filtro de suavizado en el resampler.

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

Primero, ajuste el espaciado de la rejilla para que sea sobre nuestra frecuencia de muestreo nominal de 100 Hz.

nominalFs = 100;

A continuación, determine un razonable y obtenga la tasa deseada.pq Dado que la tasa nominal es de 100 Hz y nuestra tasa deseada es de 10 Hz, es necesario diezmar por 10. 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 un par de veces mayor que o (lo que sea mayor).pq Ajuste la frecuencia de corte para que sea 1/corte deseado y luego 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 Endpoint Effects

Ahora Aléjese 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 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 de detrended ahora tiene ambos puntos finales cerca de cero, lo que reduce los transitorios introducidos. Llame y vuelva a agregar 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 uniformemente y no uniformemente a una tasa fija.resample

Leer más

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