El promedio móvil como filtro El promedio móvil se utiliza a menudo para suavizar los datos en presencia de ruido. La media móvil simple no siempre se reconoce como el filtro de respuesta de impulso finito (FIR) que es, mientras que es realmente uno de los filtros más comunes en el procesamiento de señales. Tratarlo como un filtro permite compararlo con, por ejemplo, filtros de sinc de ventana (véanse los artículos sobre filtros de paso bajo, paso alto, paso de banda y rechazo de banda para ejemplos de los mismos). La principal diferencia con estos filtros es que el promedio móvil es adecuado para señales para las cuales la información útil está contenida en el dominio del tiempo. De las cuales las mediciones de suavizado por promediado son un excelente ejemplo. Sin embargo, los filtros windowed-sinc son fuertes en el dominio de la frecuencia. Con la ecualización en el procesamiento de audio como un ejemplo típico. Hay una comparación más detallada de ambos tipos de filtros en el dominio del tiempo frente al rendimiento de los dominios de frecuencia de los filtros. Si tiene datos para los que tanto el tiempo como el dominio de frecuencia son importantes, entonces puede que desee echar un vistazo a Variaciones en el promedio móvil. Que presenta una serie de versiones ponderadas de la media móvil que son mejores en eso. El promedio móvil de longitud (N) puede definirse como escrito tal como se implementa típicamente, con la muestra de salida actual como el promedio de las muestras (N) anteriores. Visto como un filtro, el promedio móvil realiza una convolución de la secuencia de entrada (xn) con un pulso rectangular de longitud (N) y altura (1 / N) (para hacer el área del pulso y, por tanto, la ganancia de El filtro, uno). En la práctica, es mejor tomar (N) impar. Aunque un promedio móvil también puede calcularse usando un número par de muestras, usar un valor impar para (N) tiene la ventaja de que el retardo del filtro será un número entero de muestras, ya que el retardo de un filtro con (N) Muestras es exactamente ((N-1) / 2). El promedio móvil puede entonces alinearse exactamente con los datos originales desplazándolo por un número entero de muestras. Dominio de tiempo Dado que el promedio móvil es una convolución con un pulso rectangular, su respuesta de frecuencia es una función sinc. Esto hace que sea algo así como el dual del filtro windowed-sinc, ya que es una convolución con un pulso sinc que da como resultado una respuesta de frecuencia rectangular. Es esta respuesta de frecuencia de sinc que hace que el promedio móvil sea un pobre intérprete en el dominio de la frecuencia. Sin embargo, funciona muy bien en el dominio del tiempo. Por lo tanto, es perfecto para suavizar los datos para eliminar el ruido, mientras que al mismo tiempo sigue manteniendo una respuesta de paso rápido (Figura 1). Para el ruido gaussiano blanco aditivo típico (AWGN) que se asume a menudo, las muestras del promedio (N) tienen el efecto de aumentar el SNR por un factor de (sqrt N). Dado que el ruido para las muestras individuales no está correlacionado, no hay razón para tratar cada muestra de manera diferente. Por lo tanto, el promedio móvil, que da a cada muestra el mismo peso, eliminará la cantidad máxima de ruido para una nitidez de respuesta dada. Implementación Debido a que es un filtro FIR, el promedio móvil puede implementarse a través de la convolución. Entonces tendrá la misma eficiencia (o falta de ella) como cualquier otro filtro FIR. Sin embargo, también se puede implementar recursivamente, de una manera muy eficiente. Se deduce directamente de la definición que esta fórmula es el resultado de las expresiones para (yn) y (yn1), es decir, donde observamos que el cambio entre (yn1) y (yn) es que un término extra (xn1 / N) Aparece al final, mientras que el término (xn-N1 / N) se elimina desde el principio. En aplicaciones prácticas, a menudo es posible omitir la división por (N) para cada término, compensando la ganancia resultante de (N) en otro lugar. Esta implementación recursiva será mucho más rápida que la convolución. Cada nuevo valor de (y) se puede calcular con sólo dos adiciones, en lugar de las (N) adiciones que serían necesarias para una implementación directa de la definición. Una cosa a tener en cuenta con una implementación recursiva es que se acumularán errores de redondeo. Esto puede o no ser un problema para su aplicación, pero también implica que esta implementación recursiva funcionará mejor con una implementación entera que con números de coma flotante. Esto es bastante inusual, ya que una implementación en coma flotante suele ser más simple. La conclusión de todo esto debe ser que usted nunca debe subestimar la utilidad del filtro de media móvil simple en aplicaciones de procesamiento de señales. Herramienta de diseño de filtros Este artículo se complementa con una herramienta de diseño de filtros. Experimente con diferentes valores para (N) y visualice los filtros resultantes. Try it now ¿Es posible implementar una media móvil en C sin la necesidad de una ventana de muestras Ive encontró que puedo optimizar un poco, al elegir un tamaño de ventana que es una potencia de dos para permitir el cambio de bits en lugar de dividir, pero No necesitaría un tampón sería agradable. ¿Existe una manera de expresar un nuevo promedio móvil sólo como una función del resultado anterior y la nueva muestra Definir un ejemplo de media móvil, a través de una ventana de 4 muestras para ser: Agregar nueva muestra e: Un promedio móvil se puede implementar recursivamente , Pero para un cálculo exacto de la media móvil tiene que recordar la más antigua muestra de entrada en la suma (es decir, el a en su ejemplo). Para una longitud N de media móvil se calcula: donde yn es la señal de salida y xn es la señal de entrada. Eq. (1) se puede escribir recursivamente como Así que siempre necesita recordar la muestra xn-N para calcular (2). Como señaló Conrad Turner, puede usar una ventana exponencial (infinitamente larga) que le permite calcular la salida sólo de la salida anterior y la entrada actual: pero esto no es una media móvil estándar (no ponderada), sino una relación exponencial (Por lo menos en teoría) nunca se olvida nada (los pesos sólo se hacen más pequeños y más pequeños para las muestras en el pasado). Implementé un promedio móvil sin memoria de elementos individuales para un programa de seguimiento GPS que escribí. Empiezo con 1 muestra y divido por 1 para obtener la media actual. A continuación, añadir otra muestra y dividir por 2 a la actual media. Esto continúa hasta que consigo a la longitud del promedio. Cada vez después, agrego la nueva muestra, obtengo el promedio y elimino ese promedio del total. No soy un matemático, pero esto parecía una buena manera de hacerlo. Pensé que se convertiría en el estómago de un verdadero matemático, pero, resulta que es una de las maneras aceptadas de hacerlo. Y funciona bien. Sólo recuerde que cuanto más alto sea su longitud, más lento seguirá lo que desea seguir. Eso puede no importar la mayor parte del tiempo pero al seguir los satélites, si usted es lento, el rastro podría estar lejos de la posición real y parecerá malo. Usted podría tener una brecha entre el sat y los puntos finales. Elegí una longitud de 15 actualizado 6 veces por minuto para obtener suavizado adecuado y no llegar demasiado lejos de la posición real sentado con los puntos de pista suavizada. Respondió el 16 de noviembre a las 23:03 inicializar total 0, count0 (cada vez que vea un nuevo valor Entonces una entrada (scanf), una agregar totalnewValue, un incremento (count), un promedio de división (total / count) Sobre todas las entradas Para calcular el promedio sólo en las últimas 4 entradas, se requerirían 4 variables de entrada, tal vez copiando cada entrada a una variable de entrada más antigua, luego calculando la nueva media móvil como suma de las 4 variables de entrada, dividida por 4 Ser bueno si todos los insumos fueron positivos para hacer que el promedio de cálculo respondido Feb 3 15 at 4:06 Eso calculará realmente el promedio total y NO el promedio móvil A medida que el conteo se hace más grande el impacto de cualquier nueva muestra de entrada se vuelve ndsh Feb 3 15 at 13:53 Su respuesta 2016 Stack Exchange, IncConsiente que esto es alcanzable con el impulso como por: Pero realmente me gustaría evitar el uso de impulso. He googled y no encontró ningún ejemplo adecuado o legible. Basicamente, quiero seguir El promedio móvil de una corriente en curso de una corriente de números de punto flotante usando los números 1000 más recientes como una muestra de datos. ¿Cuál es la manera más fácil de lograr esto que experimenté con el uso de una matriz circular, media móvil exponencial y una media móvil más simple y encontró que los resultados de la matriz circular se adapta a mis necesidades mejor. Si sus necesidades son simples, puede intentar usar una media móvil exponencial. Puesto simplemente, usted hace una variable del acumulador, y como su código mira cada muestra, el código actualiza el acumulador con el nuevo valor. Usted escoge un alfa constante que está entre 0 y 1, y calcule esto: Usted apenas necesita encontrar un valor del alfa donde el efecto de una muestra dada dura solamente cerca de 1000 muestras. Hmm, no estoy realmente seguro de que esto es adecuado para usted, ahora que he puesto aquí. El problema es que 1000 es una ventana bastante larga para un promedio móvil exponencial No estoy seguro de que haya un alpha que se extendería el promedio en los últimos 1000 números, sin subflujo en el cálculo del punto flotante. Pero si usted quisiera un promedio más pequeño, como 30 números o tan, esto es una manera muy fácil y rápida de hacerla. Respondió 12 de junio a las 4:44 1 en su puesto. El promedio móvil exponencial puede permitir que el alfa sea variable. Así, esto permite que se utilice para calcular promedios de base de tiempo (por ejemplo, bytes por segundo). Si el tiempo transcurrido desde la última actualización del acumulador es de más de 1 segundo, deje que alfa sea 1.0. De lo contrario, puede permitir que alpha be (usecs desde la última actualización / 1000000). Ndash jxh 12 de junio a las 6:21 Básicamente, quiero seguir el promedio móvil de una corriente en curso de una corriente de números de punto flotante usando los números 1000 más recientes como una muestra de datos. Tenga en cuenta que el siguiente actualiza el total como elementos añadidos / reemplazados, evitando costosos recorridos O (N) para calcular la suma - necesaria para el promedio - a la demanda. Total se hace un parámetro diferente de T a soporte, p. Usando un largo largo cuando totalizan 1000 long s, un int para char s, o un doble a total float s. Esto es un poco defectuoso en que numsamples podría ir más allá de INTMAX - si te importa que podría utilizar un unsigned mucho tiempo. O utilice un miembro de datos de bool extra para grabar cuando el contenedor se rellena primero mientras cicla numsamples alrededor de la matriz (mejor entonces cambia el nombre de algo inocuo como pos). Respondió el 12 de Junio 12 a las 5:19 se supone que el operador quotvoid (T sample) quot es realmente operador quotvoid (T sample) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. bien descrito. En realidad quería que fuera para ser operador vacío () (T muestra), pero por supuesto, usted podría utilizar cualquier notación que te gustaba. Se arreglará, gracias. Ndash Tony D Jun 8 14 en 14:27
No comments:
Post a Comment