Moving Average Ejemplo Matlab


Estoy tratando de completar un proyecto de asignación Matlab con la siguiente pregunta: Escribir una función llamada movingaverage que toma un escalar llamado x como un argumento de entrada y devuelve un escalar. La función utiliza un búfer para contener entradas previas, y el búfer puede contener un máximo de 25 entradas. Específicamente, la función debe guardar las más recientes 25 entradas en un vector (el búfer). Cada vez que se llama a la función, copia el argumento de entrada en un elemento del búfer. Si ya hay 25 entradas almacenadas en el búfer, descarta el elemento más antiguo y guarda el actual en el búfer. Después de haber almacenado la entrada en el búfer, devuelve la media de todos los elementos del búfer. La solución que ofrezco es la siguiente: Según el nivelador automático, mi función funciona correctamente cuando los valores 1-50 pasan consecutivamente, pero falla cuando los valores de una onda senoidal ruidosa pasan consecutivamente (lo que me ha sido informado que podría deberse a algunos Tipo de un error de redondeo). Estaría agradecido si alguno de ustedes pudiera proporcionarme algunos consejos sobre los posibles pasos de error en mi código (adjunto anteriormente). Gracias de antemanoCreated el miércoles, 08 de octubre de 2008 20:04 Actualizado el Jueves, 14 de Marzo de 2013 01:29 Escrito por Batuhan Osmanoglu Hits: 40524 Media móvil En Matlab A menudo me veo en necesidad de promediar los datos que tengo para reducir el Ruido un poco. Escribí funciones de pareja para hacer exactamente lo que quiero, pero matlabs construido en función de filtro funciona bastante bien también. Aquí Ill escribir sobre 1D y 2D promedio de los datos. El filtro 1D se puede realizar usando la función de filtro. La función de filtro requiere al menos tres parámetros de entrada: el coeficiente de numerador para el filtro (b), el coeficiente de denominador para el filtro (a) y los datos (X), por supuesto. Un filtro de promedio en funcionamiento puede definirse simplemente por: Para datos 2D podemos utilizar la función Matlabs filter2. Para obtener más información sobre cómo funciona el filtro, puede escribir: Aquí hay una implementación rápida y sucia de un filtro de 16 por 16 de promedio móvil. Primero tenemos que definir el filtro. Puesto que todo lo que queremos es la contribución igual de todos los vecinos, podemos usar la función unos. Dividimos todo con 256 (1616) ya que no queremos cambiar el nivel general (amplitud) de la señal. Para aplicar el filtro simplemente podemos decir lo siguiente A continuación se presentan los resultados de la fase de un interferograma SAR. En este caso, Range está en el eje Y y Azimuth está asignado en el eje X. El filtro tenía 4 píxeles de ancho en Rango y 16 píxeles de ancho en Azimut. Descripción Matlab incluye funciones llamadas movavg y tsmovavg (media móvil de series temporales) en la Caja de herramientas financiera, movAv está diseñado para replicar la funcionalidad básica de estas. El código aquí proporciona un buen ejemplo de gestión de índices dentro de bucles, lo que puede ser confuso para empezar. Ive deliberadamente mantenido el código corto y simple para mantener este proceso claro. MovAv realiza una media móvil simple que se puede utilizar para recuperar datos ruidosos en algunas situaciones. Funciona tomando la media de la entrada (y) sobre una ventana de tiempo de deslizamiento, cuyo tamaño está especificado por n. Cuanto mayor es n, mayor es la cantidad de suavizado que el efecto de n es relativo a la longitud del vector de entrada y. Y efectivamente (bueno, una especie de) crea un filtro de frecuencia de paso bajo - vea la sección de ejemplos y consideraciones. Debido a que la cantidad de suavizado proporcionada por cada valor de n es relativa a la longitud del vector de entrada, siempre vale la pena probar diferentes valores para ver cuál es apropiado. Recuerde también que n puntos se pierden en cada promedio si n es 100, los primeros 99 puntos del vector de entrada no contienen suficientes datos para un promedio de 100 puntos. Esto se puede evitar de alguna manera apilando promedios, por ejemplo, el código y el gráfico de abajo comparan varios promedios de ventana de longitud diferentes. Observe cómo el 1010pt liso es comparado a un solo promedio 20pt. En ambos casos se pierden 20 puntos de datos en total. Crear xaxis x1: 0.01: 5 Generar ruido noiseReps 4 ruido repmat (randn (1, ceil (numel (x) / noiseReps)), noiseReps, 1) (X) 10noise (1: length (x)) Medias de Perfrom: y2 movAv (y, 10) 10 pt y3 movAv (y2, 10) 1010 pt y4 movAv (y, 20) 20 pt y5 movAv (y, 40) 40 (X, y, y2, y3, y4, y5, y6) leyenda (datos sin procesar, 10pt media móvil, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel (Y) title (Comparación de promedios móviles) movAv. m función de ejecución del programa movAv (y, n) La primera línea define el nombre de las funciones, entradas y salidas. La entrada x debe ser un vector de datos para realizar el promedio en, n debe ser el número de puntos para realizar el promedio sobre la salida contendrá los datos promediados devueltos por la función. Prealocar la salida outputNaN (1, numel (y)) Encontrar el punto medio de n midPoint round (n / 2) El trabajo principal de la función se realiza en el bucle for, pero antes de comenzar se preparan dos cosas. En primer lugar la salida se pre-asignó como NaNs, esto sirvió dos propósitos. En primer lugar, la prealocación es generalmente una buena práctica ya que reduce la memoria que hace malabarismos Matlab tiene que hacer, en segundo lugar, hace que sea muy fácil colocar los datos promediados en una salida del mismo tamaño que el vector de entrada. Esto significa que el mismo xaxis se puede usar más adelante para ambos, lo cual es conveniente para trazar, alternativamente los NaNs pueden ser removidos más adelante en una línea de código (output output) (La variable midPoint será usada para alinear los datos en el vector de salida. N 10, se perderán 10 puntos porque, para los primeros 9 puntos del vector de entrada, no hay suficientes datos para tomar un promedio de 10. Como la salida será más corta que la entrada, debe alinearse correctamente. Se utiliza para que se pierda una cantidad igual de datos al inicio y al final y la entrada se mantenga alineada con la salida por los tampones NaN creados al asignar previamente la salida para un rango de 1: length (y) - n Find index para tomar el promedio (A: b) ban Calcula la media de salida (amidPoint) media (y (a: b)) end En el bucle for sí mismo, se toma una media sobre cada segmento consecutivo de la entrada. Definido como 1 hasta la longitud de la entrada (y), menos los datos que se perderán (n) Si la entrada tiene 100 puntos de largo y n es 10, el bucle se ejecutará desde (a) 1 hasta 90. Esto Significa a proporciona el primer índice del segmento a promediar. El segundo índice (b) es simplemente un-1. Así que en la primera iteración, a1. N10. Así que b 11-1 10. El primer promedio se toma sobre y (a: b). O x (1:10). El promedio de este segmento, que es un valor único, se almacena en la salida en el índice amidPoint. O 156. En la segunda iteración, a2. B 210-1 11. Así que la media se toma sobre x (2:11) y se almacena en la salida (7). En la última iteración del bucle para una entrada de longitud 100, a91. B 9010-1 100 de manera que la media se toma en x (91: 100) y se almacena en la salida (95). Esto deja salida con un total de n (10) valores de NaN en el índice (1: 5) y (96: 100). Ejemplos y consideraciones Las medias móviles son útiles en algunas situaciones, pero no siempre son la mejor opción. Aquí hay dos ejemplos donde theyre no necesariamente óptimo. Calibración de micrófono Este conjunto de datos representa los niveles de cada frecuencia producida por un altavoz y grabada por un micrófono con una respuesta lineal conocida. La salida del altavoz varía con la frecuencia, pero podemos corregir esta variación con los datos de calibración - la salida se puede ajustar en el nivel para tener en cuenta las fluctuaciones en la calibración. Observe que los datos brutos son ruidosos - esto significa que un pequeño cambio en la frecuencia parece requerir un cambio grande, errático, en el nivel a tener en cuenta. ¿Es esto realista o es esto un producto del entorno de grabación Es razonable en este caso aplicar una media móvil que suaviza la curva de nivel / frecuencia para proporcionar una curva de calibración que es ligeramente menos errática. Pero ¿por qué no es esto óptimo en este ejemplo? Más datos serían mejores - múltiples calibraciones se promediarían juntos destruirían el ruido en el sistema (siempre y cuando sea aleatorio) y proporcionarían una curva con menos detalles sutiles perdidos. El promedio móvil sólo puede aproximarse a esto, y puede quitar algunos suelos y picos de frecuencia más alta de la curva que realmente existen. Las ondas sinusoidales El uso de un promedio móvil en las ondas sinusoidales destaca dos puntos: La cuestión general de elegir un número razonable de puntos para realizar el promedio. Su simple, pero hay métodos más eficaces de análisis de señales que el promedio de las señales oscilantes en el dominio del tiempo. En este gráfico, la onda sinusoidal original se representa en azul. Se añade ruido y se representa como la curva naranja. Un promedio móvil se realiza en números diferentes de puntos para ver si la onda original puede ser recuperada. 5 y 10 puntos proporcionan resultados razonables, pero no eliminan el ruido por completo, cuando un mayor número de puntos comienzan a perder detalle de amplitud como el promedio se extiende en diferentes fases (recuerde que la onda oscila alrededor de cero y media (-1 1) 0) . Un enfoque alternativo sería construir un filtro de paso bajo que se pueda aplicar a la señal en el dominio de la frecuencia. No voy a entrar en detalles ya que va más allá del alcance de este artículo, pero como el ruido es considerablemente más alta frecuencia que la frecuencia fundamental de las ondas, sería bastante fácil en este caso para construir un filtro de paso bajo que eliminará la frecuencia alta ruido.

Comments

Popular Posts