Estoy codificando algo en el momento en el que estoy tomando un montón de valores en el tiempo de una brújula de hardware. Esta brújula es muy precisa y se actualiza muy a menudo, con el resultado de que si se mueve ligeramente, termino con el valor extra que es salvajemente inconsistente con sus vecinos. Quiero suavizar esos valores. Después de haber hecho algo de lectura, parece que lo que quiero es un filtro de paso alto, un filtro de paso bajo o un promedio móvil. El promedio móvil que puedo conseguir con, sólo mantener un historial de los últimos 5 valores o lo que sea, y el uso de la media de los valores de abajo en mi código donde una vez sólo estaba usando el valor más reciente. Eso debería, creo, suavizar los jiggles muy bien, pero me parece que su probablemente bastante ineficiente, y este es probablemente uno de los problemas conocidos a los programadores adecuados a lo que theres una solución de Mate Clever realmente ordenada. Sin embargo, soy uno de esos horribles programadores autodidacta sin una pizca de educación formal en algo que ni siquiera esté vagamente relacionado con CompSci o Matemáticas. Leer un poco sugiere que esto puede ser un filtro de paso alto o bajo, pero no puedo encontrar nada que explique en términos comprensibles a un hack como yo cuál sería el efecto de estos algoritmos en una matriz de valores, y mucho menos cómo la matemática trabajos. La respuesta aquí dada. Por ejemplo, técnicamente responde a mi pregunta, pero sólo en términos comprensibles para aquellos que probablemente ya saben cómo resolver el problema. Sería una persona muy encantadora e inteligente que pudiera explicar el tipo de problema que es, y cómo funcionan las soluciones, en términos comprensibles para un graduado de Artes. Si su promedio móvil tiene que ser largo para lograr el suavizado requerido, y usted realmente no necesita ninguna forma particular de kernel, entonces youre mejor si utiliza una media móvil exponencialmente decadente: donde usted Elegir minúscula para ser una constante apropiada (por ejemplo, si usted elige minúsculo 1- 1 / N, tendrá la misma cantidad de promediar que una ventana de tamaño N, pero se distribuye de manera diferente sobre puntos más antiguos). De todos modos, ya que el siguiente valor de la media móvil sólo depende de la anterior y sus datos, usted no tiene que mantener una cola o nada. Y usted puede pensar en esto como hacer algo así como, Bueno, tengo un nuevo punto, pero no confío en él, así que voy a mantener 80 de mi antigua estimación de la medición, y sólo confiar en este nuevo punto de datos 20. Eso es Casi lo mismo que decir, Bueno, yo sólo confío en este nuevo punto 20, y mal uso 4 otros puntos que confío en la misma cantidad, excepto que en lugar de tomar explícitamente los otros 4 puntos, está asumiendo que el promedio que hizo la última vez Era razonable para que pueda utilizar su trabajo anterior. Respondió Sep 21 10 at 14:27 Oye, sé que esto es 5 años de retraso, pero gracias por una respuesta impresionante. I39m trabajando en un juego donde el sonido cambia en función de su velocidad, pero debido a correr el juego en una computadora lenta-asno, la velocidad fluctuaría salvajemente, que estaba bien para la dirección, pero súper molesto en términos de sonido. Esta fue una solución realmente simple y barata para algo que pensé que sería un problema muy complejo. Ndash Adam Mar 16 15 at 20:20 Si está intentando eliminar el valor extraño ocasional, un filtro de paso bajo es la mejor de las tres opciones que ha identificado. Los filtros de paso bajo permiten cambios de baja velocidad como los causados por la rotación de una brújula con la mano, mientras que rechazan cambios de alta velocidad como los causados por golpes en la carretera, por ejemplo. Un promedio móvil probablemente no será suficiente, ya que los efectos de un solo golpe en sus datos afectarán a varios valores subsiguientes, dependiendo del tamaño de su ventana de promedio móvil. Si los valores impares son fácilmente detectados, incluso puede ser mejor con un algoritmo de eliminación de glitch que los ignora completamente: Aquí hay un gráfico guick para ilustrar: El primer gráfico es la señal de entrada, con un fallo desagradable. El segundo gráfico muestra el efecto de un promedio móvil de 10 muestras. El gráfico final es una combinación del promedio de 10 muestras y el algoritmo de detección de fallos simple mostrado anteriormente. Cuando se detecta el fallo, se utiliza el promedio de 10 muestras en lugar del valor real. Respondió Sep 21 10 at 13:38 Muy bien explicado, y puntos de bonificación para el gráfico) ndash Henry Cooke Sep 22 10 at 0:50 Wow. Rara vez vio una respuesta tan agradable ndash Muis Jun 4 13 at 9:14 La media móvil es un filtro de paso bajo. Ndash nomen Oct 21 13 at 19:36 Pruebe con una media de ejecución / streaming en su lugar. Ndash kert Apr 25 14 at 22:09 Media móvil que puedo bajar con. Pero me parece que su probablemente bastante ineficiente. Theres realmente ninguna razón una media móvil debe ser ineficiente. Usted mantiene el número de puntos de datos que desea en algún búfer (como una cola circular). En cada nuevo punto de datos, se extrae el valor más antiguo y se resta de una suma, y se empuja el más reciente y se agrega a la suma. Así que cada punto de datos nuevos realmente sólo implica un pop / push, una adición y una sustracción. Su promedio móvil es siempre esta suma cambiante dividida por el número de valores en su búfer. Se vuelve un poco más complicado si está recibiendo datos simultáneamente de múltiples hilos, pero ya que sus datos provienen de un dispositivo de hardware que me parece muy dudoso. Oh, y también: programadores autodidactos horribles se unen) El promedio móvil me parecía ineficiente porque tienes que almacenar un búfer de valores - mejor hacer sólo algunas Matemáticas Inteligentes con tu valor de entrada y valor de trabajo actual Creo que eso es como el promedio móvil exponencial trabajos. Una optimización que se ha observado para este tipo de media móvil implica el uso de un amplificador de cola de longitud fija, un puntero a donde se encuentra en esa cola, y simplemente envolver el puntero alrededor (con o un si). Voila No hay costosos empujones / pop. Poder para los aficionados, hermano ndash Enrique: Para un promedio móvil directo, usted necesita el búfer simplemente para que usted sepa qué valor se disparó cuando el siguiente valor se empuja. Dicho esto, la fila de longitud fija en fila, un puntero que está describiendo es exactamente lo que quise decir con "cola" circular. Esa es la razón por la que estaba diciendo que no es eficiente. ¿Qué pensaste que quería decir Y si tu respuesta es quotan matriz que cambia sus valores de nuevo en cada removalquot indexado (como std :: vector en C). Bueno, entonces, I39m tan herido que don39t incluso quiero hablar con usted más) ndash Dan Tao Sep 22 10 a las 1:58 Henry: No sé acerca de AS3, pero un programador de Java tiene colecciones como CircularQueue a su disposición (I39m No un desarrollador de Java, así que estoy seguro de que hay mejores ejemplos por ahí que es lo que encontré de una búsqueda rápida de Google), que implementa precisamente la funcionalidad que estamos hablando. I39m bastante seguro de la mayoría de los lenguajes de nivel medio y bajo con las bibliotecas estándar tienen algo similar (por ejemplo, en. NET hay 39 QueueltTgt). De todos modos, yo también fui filosofía. Todo está perdonado. Ndash Dan Tao Sep 22 10 at 12:44 Una media móvil exponencialmente decaying se puede calcular a mano con sólo la tendencia si se utilizan los valores adecuados. Consulte fourmilab. ch/hackdiet/e4/ para obtener una idea sobre cómo hacerlo rápidamente con un bolígrafo y papel si está buscando un promedio móvil suavizado exponencialmente con 10 suavizado. Pero dado que usted tiene una computadora, es probable que desee realizar un cambio binario en lugar de un cambio decimal) De esta manera, todo lo que necesita es una variable para su valor actual y otra para el promedio. El siguiente promedio se puede calcular a partir de eso. Responde Sep 21 10 at 14:39 theres una técnica llamada una puerta de rango que funciona bien con muestras espurias de baja ocurrencia. Suponiendo el uso de una de las técnicas de filtro mencionadas anteriormente (promedio móvil, exponencial), una vez que haya suficiente historia (una Constante de Tiempo) puede probar la nueva muestra de datos entrantes para determinar si es razonable antes de que se agregue a la computación. Se requiere cierto conocimiento de la tasa de cambio razonable máxima de la señal. La muestra bruta se compara con el valor suavizado más reciente, y si el valor absoluto de esa diferencia es mayor que el intervalo permitido, esa muestra es expulsada (o reemplazada por alguna heurística, por ejemplo, una predicción basada en el diferencial de pendiente o la tendencia Valor de predicción de doble suavizado exponencial) respondió el 30 de abril a las 6: 56 Un filtro de media móvil promedia un número de muestras de entrada y producir una única muestra de salida. Esta acción de promedio elimina los componentes de alta frecuencia presentes en la señal. Los filtros de media móvil se utilizan normalmente como filtros de paso bajo. En el algoritmo de filtrado recursivo, las muestras de salida anteriores también se toman para promediar. Un filtro de media móvil promedia un número de muestras de entrada y produce una única muestra de salida. Esta acción de promedio elimina los componentes de alta frecuencia presentes en la señal. Los filtros de media móvil se utilizan normalmente como filtros de paso bajo. En el algoritmo de filtrado recursivo, las muestras de salida anteriores también se toman para promediar. Esta es la razón por la que su respuesta al impulso se extiende hasta el infinito. Cómo utilizar el programa de ejemplo El archivo. zip contiene tanto el código fuente como el ejecutable. Para compilar y ejecutar el código fuente es necesario tener instalado Visual Basic 6.0 en su equipo. Para ejecutar el archivo ejecutable, debe descargar e instalar archivos de tiempo de ejecución de Visual Basic 6.0. Ejecute movavgfilt. exe y verá la ventana principal. En la ventana principal. La parte más superior es el generador de funciones. Que produce diferentes formas de onda para probar el filtro. Podemos interactivamente cambiar la amplitud, frecuencia y forma de la señal generada. Para probar el programa primero debemos generar una forma de onda apropiada. Aquí vamos a generar una forma de onda compleja que consta de dos frecuencias diferentes. Deje todo en la configuración predeterminada y haga clic en el botón quotgeneratequot. Ahora puede ver una señal de 10 Hz en el gráfico junto al generador de señales. La figura siguiente muestra la forma de onda. Ahora cambie la Frecuencia a 100 Hz y haga clic nuevamente en el botón quotgeneratequot. La forma de onda recién generada se añade a la forma de onda existente y la forma de onda resultante se parece a una onda sin 10 Hz con un ruido de 100 Hz. Vea la forma de onda abajo. Esta forma de onda es la más adecuada para probar el filtro ya que contiene dos frecuencias diferentes. Puede ejecutar el filtro haciendo clic en el botón quotFilterquot. Desde las opciones disponibles a la izquierda hasta el botón quotFilterquot. Puede elegir filtrado recursivo, no recursivo o ningún filtrado en absoluto. La figura siguiente muestra la salida del filtro. Descargar Moving Average Filtro de código fuenteMoving Average Filter (MA filter) Loading. El filtro de media móvil es un simple filtro FIR de paso bajo (respuesta de impulso finito) comúnmente utilizado para suavizar una matriz de datos / señal muestreados. Se toman M muestras de entrada a la vez y tomar el promedio de esas M-muestras y produce un solo punto de salida. Se trata de una simple LPF (Low Pass Filter) estructura que viene práctico para los científicos y los ingenieros para filtrar el componente ruidoso no deseado de los datos previstos. A medida que aumenta la longitud del filtro (el parámetro M) aumenta la suavidad de la salida, mientras que las transiciones bruscas en los datos se hacen cada vez más contundentes. Esto implica que este filtro tiene excelente respuesta en el dominio del tiempo pero una respuesta de frecuencia pobre. El filtro MA realiza tres funciones importantes: 1) toma M puntos de entrada, calcula el promedio de esos puntos M y produce un único punto de salida. 2) Debido al cálculo / cálculos involucrados. El filtro introduce una cantidad definida de retardo 3) El filtro actúa como un filtro de paso bajo (con una respuesta de dominio de frecuencia pobre y una buena respuesta de dominio de tiempo). Código Matlab: El siguiente código matlab simula la respuesta en el dominio del tiempo de un filtro M-point Moving Average y también traza la respuesta de frecuencia para varias longitudes de filtro. Respuesta de Dominio de Tiempo: En la primera trama, tenemos la entrada que va en el filtro de media móvil. La entrada es ruidosa y nuestro objetivo es reducir el ruido. La siguiente figura es la respuesta de salida de un filtro de media móvil de 3 puntos. Puede deducirse de la figura que el filtro de media móvil de 3 puntos no ha hecho mucho en filtrar el ruido. Aumentamos los grifos de filtro a 51 puntos y podemos ver que el ruido en la salida se ha reducido mucho, que se representa en la siguiente figura. Aumentamos los grifos más allá de 101 y 501 y podemos observar que aunque el ruido sea casi cero, las transiciones se atenuan drásticamente (observe la pendiente en cada lado de la señal y compárelas con la transición ideal de pared de ladrillo en Nuestra entrada). Respuesta de Frecuencia: A partir de la respuesta de frecuencia se puede afirmar que el roll-off es muy lento y la atenuación de banda de parada no es buena. Dada esta atenuación de banda de parada, claramente, el filtro de media móvil no puede separar una banda de frecuencias de otra. Como sabemos que un buen rendimiento en el dominio del tiempo da como resultado un rendimiento pobre en el dominio de la frecuencia, y viceversa. En resumen, el promedio móvil es un filtro de suavizado excepcionalmente bueno (la acción en el dominio del tiempo), pero un filtro de paso bajo excepcionalmente malo (la acción en el dominio de la frecuencia) Enlaces externos: Libros recomendados:
No comments:
Post a Comment