Sunday, December 25, 2016

Moviendo El Código De Filtro Promedio En C


Es posible implementar una media móvil en C sin necesidad de una ventana de muestras? He encontrado que puedo optimizar un poco, eligiendo un tamaño de ventana que es una potencia de dos para permitir el cambio de bits en lugar de dividir, pero no necesitar Un buffer sería bueno. 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 a ser: Agregar nueva muestra e: Una media 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 pasada y la entrada actual: pero esto no es una media móvil estándar (no ponderada) sino 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 Puede variar desde un promedio simple de n valores a un filtro de promedio exponencial a un filtro más sofisticado que funciona en las frecuencias. versiones más sofisticadas de los filtros de paso bajo se puede crear mediante la conversión Filtros electrónicos de paso bajo utilizados en el procesamiento de señales digitales (como Butterworth filtro, etc) He encontrado este sitio web para contener una gran cantidad de recursos sobre Digital Signal Processing, (The Scientist and Engineer039s Guide to Digital Signal Processing). El primer ejemplo es un filtro de media móvil, a continuación se muestra un filtro recursivo seguido de un ejemplo de cómo crear un filtro de paso bajo con una frecuencia de corte, dada una frecuencia de muestreo y una constante de filtro RC motivada por el comportamiento de paso bajo o circuito RC . Sólo recuerde: El promedio de dominio del tiempo se desordenará con la representación del dominio de la frecuencia, y el filtrado del dominio de la frecuencia ensuciará con la representación del dominio del tiempo. Por lo tanto, un filtro que trabaja en el dominio del tiempo resultará en la respuesta de frecuencia ya no utilizable ya que el 039signal039 039signal039 propio filtro ha sido convoluted con la señal real. Por otro lado, si eliminas el ruido de alta frecuencia en el dominio de la frecuencia, no esperes ver una señal suave en el dominio del tiempo. PS: Nunca hacer ambas cosas. Nunca haga corte de frecuencia seguido por promediar en el dominio del tiempo (o viceversa) a menos que. No hay otra opción (que por lo general hay) 11.3k Vistas middot Ver Upvotes middot No para Reproducción Más Respuestas Abajo. Preguntas relacionadas Como un principiante completo en la programación de bajo nivel, debo comenzar con C o C (Quiero ser capaz de codificar software tanto como robots de programa) MATLAB: Hay alguna manera de lidiar con el impulso de un Butterworth low - (Que pasa referencia / valor por referencia / valor) En matlab utilizamos el comando butter para la implementación de filtros, Qué se debe utilizar en código c para el diseño de filtros Existe una mejor alternativa a C para la codificación de bajo nivel Es posible pasar los parámetros de un código C en una DLL generada por Matlab Dónde y cómo se traduce el código de software en voltajes altos y bajos que representan 1039s y 0039s Por qué wasn039t Python039s iterable funciones como el mapa y el filtro diseñado como C039s LINQ o Java039s arroyos Cómo puedo traducir código fuente de Delphi 7 a C / C / C en un sistema operativo Windows 7 En C proyectos, Cómo puedo llegar a Chrome039 s bloque De código (inspeccionar el elemento) Por qué este código C snippet Char str quotany stringquot str 3 039s039 producir fallo de segmentación Por qué el filtro de paso bajo se vuelven eficientes mediante la conexión en cascada con la mitad de la sección derivada m Cómo pasar parámetros dinámicamente en el filtro atributos personalizados MVC cI know this Es alcanzable con alza como por: Pero realmente me gustaría evitar el uso de impulso. He googled y no he encontrado ningún ejemplo adecuado o legible. Básicamente, quiero seguir el promedio móvil de una corriente en curso de una corriente de números de punto flotante utilizando 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 de 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 12 en 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 at 14:27

No comments:

Post a Comment