Tuesday, 10 October 2017

Media Móvil En Matlab


Utilizando MATLAB, ¿cómo puedo encontrar el promedio móvil de 3 días de una columna específica de una matriz y añadir el promedio móvil a esa matriz? Estoy tratando de calcular el promedio móvil de 3 días de abajo hacia arriba de la matriz. He proporcionado mi código: Dada la siguiente matriz a y máscara: He intentado implementar el comando conv pero estoy recibiendo un error. Aquí está el comando conv que he estado tratando de usar en la segunda columna de la matriz a: La salida que deseo se da en la siguiente matriz: Si usted tiene alguna sugerencia, lo agradecería mucho. Gracias Por la columna 2 de la matriz a, estoy calculando el promedio móvil de 3 días de la siguiente manera y colocando el resultado en la columna 4 de la matriz a (I renombrado matriz a como 39desiredOutput39 sólo por ilustración). El promedio de 3 días de 17, 14, 11 es 14 el promedio de 3 días de 14, 11, 8 es 11 el promedio de 3 días de 11, 8, 5 es 8 y el promedio de 3 días de 8, 5, 2 es 5. No hay valor en las 2 filas inferiores para la cuarta columna porque el cálculo para la media móvil de 3 días comienza en la parte inferior. La salida 39valid39 no se mostrará hasta al menos 17, 14 y 11. Esperamos que esto tiene sentido ndash Aaron Jun 12 13 at 1:28 1 Respuesta En general, sería de ayuda si se muestra el error. En este caso usted está haciendo dos cosas mal: Primero su convolución necesita ser dividido por tres (o la longitud de la media móvil) Segundo, observe el tamaño de c. Usted no puede apenas caber c en a. La forma típica de obtener un promedio móvil sería usar lo mismo: pero eso no se parece a lo que quieres. En su lugar, se ve obligado a utilizar un par de líneas: Tengo que calcular un promedio móvil en una serie de datos, dentro de un bucle for. Tengo que obtener el promedio móvil en N9 días. El array Im computing in es 4 series de 365 valores (M), que en sí mismos son valores medios de otro conjunto de datos. Quiero trazar los valores medios de mis datos con el promedio móvil en una parcela. Busqué un poco sobre los promedios móviles y el comando conv y encontré algo que intenté implementar en mi código. Por lo tanto, básicamente, calculo mi media y lo trace con una media móvil (errónea). Escogí el valor de wts justo en el sitio de mathworks, por lo que es incorrecto. (Fuente: mathworks. nl/help/econ/moving-average-trend-estimation. html) Mi problema, sin embargo, es que no entiendo lo que este wts es. ¿Podría alguien explicar Si tiene algo que ver con los pesos de los valores: que no es válido en este caso. Todos los valores se ponderan igual. Y si estoy haciendo esto totalmente mal, podría obtener alguna ayuda con ella Mis más sinceras gracias. El uso de conv es una excelente manera de implementar un promedio móvil. En el código que está usando, wts es cuánto está pesando cada valor (como usted adivinó). La suma de ese vector siempre debe ser igual a uno. Si desea ponderar cada valor uniformemente y hacer un filtro N de tamaño N, entonces lo haría. Usar el argumento válido en conv resultará en tener menos valores en Ms que en M. Utilice lo mismo si no le importan los efectos de Relleno cero. Si tiene la caja de herramientas de procesamiento de señales, puede usar cconv si desea probar una media móvil circular. Algo así como usted debe leer la documentación conv y cconv para obtener más información si ya no lo ha hecho. Puede utilizar filtro para encontrar un promedio de ejecución sin utilizar un bucle for. Este ejemplo encuentra el promedio de ejecución de un vector de 16 elementos, usando un tamaño de ventana de 5. 2) suave como parte de la caja de herramientas de ajuste de curvas (que está disponible en la mayoría de los casos) yy suave (y) suaviza los datos en el vector de columna Y utilizando un filtro de media móvil. Los resultados se devuelven en el vector de columna yy. El valor predeterminado para el promedio móvil es 5.Descargar movAv. m (ver también movAv2 - una versión actualizada que permite la ponderación) Descripción Matlab incluye funciones llamadas movavg y tsmovavg (series de tiempo de movimiento de la media) en el Financial Toolbox, movAv está diseñado para replicar La funcionalidad básica de estos. 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 puede evitarse de alguna manera mediante el apilamiento de 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 modo 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.

No comments:

Post a Comment