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.

Tome 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 los derivados superiores.diff Para solucionar este problema, utilice en su lugar un filtro diferenciador.

Analice el desplazamiento de un suelo de construcción durante un terremoto. Encuentra la velocidad y la aceleración como funciones de 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)

Diferenciar 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. Se usa para determinar que el retardo es la mitad del orden de 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 de filtro, o el doble del retardo de grupo. muestras fueron desechadas arriba.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 los máximos y mínimos de la deriva corresponden a los cruces de 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

Diferenciar la velocidad de la deriva para encontrar la aceleración. El retraso es el doble de largo. Deseche el doble de muestras para compensar el retardo, 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

Calcule la aceleración utilizando.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