signal funcion español matlab plot smoothing curvesmoothing

funcion - Cómo suavizar una trama en MATLAB?



smooth plot matlab (5)

A veces debes evitar usar el promedio móvil ya que no es robusto para los valores atípicos. La mediana móvil es preferible en esos casos.

Tengo unos 9000 puntos que se trazan en un gráfico:

[ Resolución completa ]

En realidad, la trama no es tan fácil como yo quería que fuera. ¿Hay alguna manera de suavizar el gráfico al grado requerido?

¿O alguna forma de umbralización para que pueda alisar selectivamente las partes que están demasiado llenas de baches?

No estoy seguro, pero ¿puede ayudarme fast-fourier-transform ?


FFT no es una mala idea, pero probablemente sea excesivo aquí. Los promedios corrientes o móviles dan generalmente resultados pobres y deben evitarse para cualquier cosa que no sea la tarea tarde (y el ruido blanco).

Usaría el filtrado Savitzky-Golay (en Matlab sgolayfilt (...)). Esto le proporcionará los mejores resultados para lo que está buscando: un alisado local manteniendo la forma de la curva.

-Pablo


Primero trataré de mostrar el promedio continuo en una serie de puntos, como 5 o 10. De esta forma, una única discrepancia en los valores solo tiene un pequeño impacto en el gráfico. Por supuesto, depende de qué tan preciso sea el gráfico.


Si tiene la Caja de Herramientas de Ajuste Curvo , puede usar la función smooth . El método predeterminado es un promedio móvil del tamaño 5 (el método se puede cambiar). Un ejemplo:

% some noisy signal Fs = 200; f = 5; t = 0:1/Fs:1-1/Fs; y = sin(2*pi*f*t) + 0.6*randn(size(t)); subplot(411) plot(y), title(''Noisy signal'') % smoothed signal subplot(412) plot( smooth(y, 5, ''moving'') ), title(''smooth'') ylim([-2 2])

De lo contrario, puede utilizar su propia función de ventana usando la función de filter del núcleo de MATLAB:

% equivalent to a moving average window wndwSize = 5; h = ones(1,wndwSize)/wndwSize; subplot(413) plot( filter(h, 1, y) ), title(''filter + square window'') % Guassian h = pdf(''Normal'',-floor(wndwSize/2):floor(wndwSize/2),0,1); subplot(414) plot( filter(h, 1, y) ), title(''filter + Guassian window'')


Una forma simple (ad hoc) es simplemente tomar un promedio ponderado (ajustable por alpha ) en cada punto con sus vecinos:

data(2:n-1) = alpha*data(2:n-1) + (1-alpha)*0.5*(data(1:n-2)+data(3:n))

o alguna variación de eso. Sí, para ser más sofisticado, puedes transformar tus datos primero, luego cortar las frecuencias altas. Algo como:

f = fft(data) f(n/2+1-20:n/2+20) = zeros(40,1) smoothed = real(ifft(f))

Esto corta las 20 frecuencias más altas. Tenga cuidado de cortarlos de forma simétrica, de lo contrario, la transformación inversa ya no es real. Debe elegir cuidadosamente la frecuencia de corte para el nivel correcto de suavizado. Este es un tipo muy simple de filtrado (filtro de cuadro en el dominio de frecuencia), por lo que puede intentar atenuar suavemente las frecuencias de orden superior si la distorsión es inaceptable.