Matlab De Convolución Media Móvil


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 cambio, se ven obligados a utilizar un par de líneas: El científico y los ingenieros Guía para el procesamiento de señales digitales Por Steven W. Smith, Ph. D. Como su nombre indica, el filtro de media móvil opera promediando un número de puntos de la señal de entrada para producir cada punto en la señal de salida. En forma de ecuación, esto se escribe: Donde es la señal de entrada, es la señal de salida, y M es el número de puntos en la media. Por ejemplo, en un filtro de media móvil de 5 puntos, el punto 80 de la señal de salida viene dado por: Como alternativa, el grupo de puntos de la señal de entrada puede ser elegido simétricamente alrededor del punto de salida: Esto corresponde a cambiar la suma en Eq . 15-1 de: j 0 a M -1, a: j - (M -1) / 2 a (M -1) / 2. Por ejemplo, en un filtro de media móvil de 10 puntos, el índice, j. Puede ir de 0 a 11 (promediado de un lado) o de -5 a 5 (promedio simétrico). El promedio simétrico requiere que M sea un número impar. La programación es ligeramente más fácil con los puntos en solamente un lado sin embargo, esto produce un cambio relativo entre las señales de entrada y de salida. Debe reconocer que el filtro de media móvil es una convolución utilizando un núcleo de filtro muy simple. Por ejemplo, un filtro de 5 puntos tiene el núcleo del filtro: 82300, 0, 1/5, 1/5, 1/5, 1/5, 1/5, 0, 08230. Es decir, el filtro de media móvil es una convolución De la señal de entrada con un impulso rectangular que tiene un área de uno. La Tabla 15-1 muestra un programa para implementar el filtro de media móvil. Busco un poco de orientación sobre el uso de CONVN para calcular promedios móviles en una dimensión en una matriz 3d. Im que consigue un poco cogido para arriba en el lanzamiento del kernel debajo de la capilla y estoy esperando alguien pudo poder aclarar el comportamiento para mí. Un post similar que todavía me tiene un poco confundido está aquí: Tengo datos diarios de flujos de río y tiempo para una cuenca en diferentes lugares de origen. Así que la matriz es así, dim 1 (las filas) representan cada sitio dim 2 (las columnas) representan la fecha dim 3 (las páginas) representan los diferentes tipos de medición (altura del río, flujo, lluvia, etc.) El objetivo Es tratar de usar CONVN para tomar una media móvil de 21 días en cada sitio, para cada punto de observación para cada variable. Según lo entiendo, debería ser capaz de usar un kernel tal como: He intentado jugar y creado otro kernel que también debería funcionar (creo) y establecer ker2 como: Los resultados no coinciden y me pregunto si tengo la Dimensiones incorrectas aquí para el kernel. Cualquier orientación es muy apreciada. BTW, usted tiene un núcleo simétrico, y por lo tanto, voltear no debe tener ningún efecto en la salida de convolución. Lo que ha especificado es un kernel de promedio móvil, y por lo tanto la convolución debería funcionar para encontrar el promedio móvil como usted espera. Pero I39m un poco confundido porque usted dijo que el trabajo doesn39t anterior ndash rayryeng 31 de mayo 15 a las 20:17 Eso es totalmente de usted :). La pregunta que usted tiene es válida (no juego de palabras) que los viajes de un montón de gente. Si usted quiere que se quede, puedo escribir una respuesta que resume lo que hablamos. Si desea retirar / borrar su respuesta, no hay problema en absoluto. A juzgar por el contexto de su pregunta, usted tiene una matriz 3D y desea encontrar el promedio móvil de cada fila de forma independiente en todas las rodajas 3D. El código anterior debería funcionar (el primer caso). Sin embargo, el indicador válido devuelve una matriz cuyo tamaño es válido en términos de los límites de la convolución. Echa un vistazo al primer punto de la publicación a la que se vinculó para obtener más detalles. Específicamente, las primeras 21 entradas para cada fila se perderán debido al indicador válido. Es sólo cuando llegas a la entrada número 22 de cada fila, el núcleo de convolución queda completamente contenido dentro de una fila de la matriz y es de ese punto donde obtienes resultados válidos. Si desea ver estas entradas en los límites, entonces tendrá que utilizar el mismo indicador si desea mantener la misma matriz de tamaño que la entrada o el indicador completo (que es el valor predeterminado) que le da el tamaño de la salida a partir de Los bordes exteriores más extremos, pero tenga en cuenta que el promedio móvil se hará con un montón de ceros y por lo tanto las primeras 21 entradas wouldnt ser lo que usted espera de todos modos. Sin embargo, si estoy interpretando lo que estás pidiendo, entonces el indicador válido es lo que quieres, pero ten en cuenta que tendrás 21 entradas que faltan para acomodar los casos de borde. En general, su código debería funcionar, pero tenga cuidado en cómo interpreta los resultados. BTW, usted tiene un núcleo simétrico, y por lo tanto, voltear no debe tener ningún efecto en la salida de convolución. Lo que ha especificado es un kernel de promedio móvil, y por lo tanto la convolución debería funcionar para encontrar el promedio móvil como usted espera.

Comments