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.

Tomar derivados de una señal

Desea diferenciar una señal sin aumentar la potencia de ruido. La función de MATLAB® amplifica el ruido y la inexactitud resultante empeora para derivados más altos.diff Para solucionar este problema, utilice un filtro diferenciador en su lugar.

Analizar el desplazamiento de un piso del edificio durante un terremoto. Encuentra la velocidad y la aceleración como funciones del tiempo.

Cargue el archivo .earthquake El archivo contiene las siguientes variables:

  • :drift Desplazamiento del suelo, medido en centímetros

  • :t Tiempo, medido en segundos

  • :Fs Frecuencia de muestreo, igual a 1 kHz

load(fullfile(matlabroot,'examples','signal','earthquake.mat'))

Se utiliza para mostrar una estimación del espectro de potencia de la señal.pwelch Observe cómo la mayor parte de la energía de la señal está contenida en frecuencias por debajo de 100 Hz.

pwelch(drift,[],[],[],Fs)

Se utiliza para diseñar un diferenciador FIR de orden 50.designfilt Para incluir la mayor parte de la energía de la señal, especifique una frecuencia de banda de paso de 100 Hz y una frecuencia de banda de parada de 120 Hz. Inspeccione el filtro con .fvtool

Nf = 50;  Fpass = 100;  Fstop = 120;  d = designfilt('differentiatorfir','FilterOrder',Nf, ...     'PassbandFrequency',Fpass,'StopbandFrequency',Fstop, ...     'SampleRate',Fs);  fvtool(d,'MagnitudeDisplay','zero-phase','Fs',Fs)

Diferencie la deriva para encontrar la velocidad. Divida la derivada por , el intervalo de tiempo entre muestras consecutivas, para establecer las unidades correctas.dt

dt = t(2)-t(1);  vdrift = filter(d,drift)/dt;

La señal filtrada se retrasa. Utilícelo para determinar que el retardo es la mitad del orden del filtro.grpdelay Compensarlo descartando muestras.

delay = mean(grpdelay(d))
delay = 25 
 tt = t(1:end-delay); vd = vdrift; vd(1:delay) = [];

La salida también incluye un transitorio cuya longitud es igual al orden del filtro, o el doble del retardo del grupo. muestras fueron descartadas anteriormente.delay Deseche más para eliminar el transitorio.delay

tt(1:delay) = []; vd(1:delay) = [];

Trazar la deriva y la velocidad de deriva. Se utiliza para verificar que el máximo y el mínimo de la deriva corresponden a los cruces cero de su derivado.findpeaks

[pkp,lcp] = findpeaks(drift); zcp = zeros(size(lcp));  [pkm,lcm] = findpeaks(-drift); zcm = zeros(size(lcm));  subplot(2,1,1) plot(t,drift,t([lcp lcm]),[pkp -pkm],'or') xlabel('Time (s)') ylabel('Displacement (cm)') grid  subplot(2,1,2) plot(tt,vd,t([lcp lcm]),[zcp zcm],'or') xlabel('Time (s)') ylabel('Speed (cm/s)') grid

Diferencie la velocidad de deriva para encontrar la aceleración. El retraso es el doble de largo. Deseche el doble de muestras para compensar el retraso y el mismo número para eliminar el transitorio. Trazar la velocidad y la aceleración.

adrift = filter(d,vdrift)/dt;  at = t(1:end-2*delay); ad = adrift; ad(1:2*delay) = [];  at(1:2*delay) = []; ad(1:2*delay) = [];  subplot(2,1,1) plot(tt,vd) xlabel('Time (s)') ylabel('Speed (cm/s)') grid  subplot(2,1,2) plot(at,ad) ax = gca; ax.YLim = 2000*[-1 1]; xlabel('Time (s)') ylabel('Acceleration (cm/s^2)') grid

Calcular la aceleración mediante .diff Agregue ceros para compensar el cambio en el tamaño de la matriz. Compare el resultado con el obtenido con el filtro. Observe la cantidad de ruido de alta frecuencia.

vdiff = diff([drift;0])/dt; adiff = diff([vdiff;0])/dt;  subplot(2,1,1) plot(at,ad) ax = gca; ax.YLim = 2000*[-1 1]; xlabel('Time (s)') ylabel('Acceleration (cm/s^2)') grid legend('Filter') title('Acceleration with Differentiation Filter')  subplot(2,1,2) plot(t,adiff) ax = gca; ax.YLim = 2000*[-1 1]; xlabel('Time (s)') ylabel('Acceleration (cm/s^2)') grid legend('diff')

Consulte también

| | | |

Temas relacionados