Moving_average_implementation_c

Moving_average_implementation_c

Binary_options_signals_for_nadex_complaints
Rrsb_forex_noida_sector
Binary_options_360_banquet


Forex robot prueba en vivo Libere el libro electrónico Programa de Opciones Binarias Trading Afiliados Rän forex karlstad Opciones de acciones con dividendos Opciones binarias robot review 2015

Estoy tratando de calcular el promedio móvil de una señal. El valor de la señal (un doble) se actualiza al azar. Estoy buscando una manera eficiente de calcular su tiempo promedio ponderado en una ventana de tiempo, en tiempo real. Podría hacerlo yo mismo, pero es más difícil de lo que pensaba. La mayoría de los recursos que he encontrado en Internet están calculando el promedio móvil de la señal periódica, pero la mina se actualiza al azar. ¿Alguien sabe buenos recursos para que El truco es el siguiente: Usted recibe actualizaciones en tiempos aleatorios mediante la actualización de void (tiempo int, valor de float). Sin embargo, también es necesario realizar un seguimiento cuando una actualización se cae de la ventana de tiempo, por lo que se establece una alarma que se llama en el momento N que elimina la actualización anterior de ser considerado de nuevo en el cálculo. Si esto sucede en tiempo real, puede solicitar al sistema operativo que realice una llamada a un método void dropoffoldestupdate (int time) que se llamará en el momento N Si se trata de una simulación, no puede obtener ayuda del sistema operativo y necesita Hágalo manualmente. En una simulación llamaríamos métodos con el tiempo suministrado como un argumento (que no se correlaciona con el tiempo real). Sin embargo, una suposición razonable es que las llamadas están garantizadas de tal manera que los argumentos de tiempo están aumentando. En este caso, debe mantener una lista ordenada de valores de hora de alarma y, para cada llamada de actualización y lectura, compruebe si el argumento de tiempo es mayor que el de la lista de alarmas. Mientras que es mayor que usted hace el proceso relacionado con la alarma (caiga la actualización más vieja), quite la cabeza y compruebe otra vez hasta que se procesen todas las alarmas antes del tiempo dado. A continuación, haga la llamada de actualización. Hasta ahora he asumido que es obvio lo que haría para el cálculo real, pero voy a elaborar por si acaso. Supongo que tienes un método float read (tiempo int) que usas para leer los valores. El objetivo es hacer que esta llamada sea lo más eficiente posible. Por lo tanto, no calcula el promedio móvil cada vez que se llama al método de lectura. En su lugar precompute el valor a partir de la última actualización o la última alarma y ajuste este valor por un par de operaciones de punto flotante para explicar el paso del tiempo desde la última actualización. (Es decir, un número constante de operaciones excepto para tal vez procesar una lista de alarmas acumuladas). Esperemos que esto esté claro - este debería ser un algoritmo bastante simple y bastante eficiente. Otra optimización. Uno de los problemas restantes es si un gran número de actualizaciones se producen dentro de la ventana de tiempo, entonces hay un largo tiempo para que no hay ni lecturas ni actualizaciones, y luego una lectura o actualización viene adelante. En este caso, el algoritmo anterior será ineficaz en la actualización incremental del valor para cada una de las actualizaciones que está cayendo. Esto no es necesario porque sólo nos preocupamos por la última actualización más allá de la ventana de tiempo, así que si hay una manera de dejar de manera eficiente todas las actualizaciones anteriores, sería de ayuda. Para ello, podemos modificar el algoritmo para realizar una búsqueda binaria de actualizaciones para encontrar la actualización más reciente antes de la ventana de tiempo. Si hay relativamente pocas actualizaciones que deben eliminarse, puede actualizar incrementalmente el valor de cada actualización eliminada. Pero si hay muchas actualizaciones que necesitan ser eliminados, entonces uno puede volver a calcular el valor desde cero después de dejar las antiguas actualizaciones. Apéndice sobre Cálculo Incremental: Debo aclarar lo que quiero decir con el cálculo incremental anterior en la frase ajustar este valor por un par de operaciones en coma flotante para explicar el paso del tiempo desde la última actualización. Cálculo inicial no incremental: luego iterar sobre las actualizaciones relevantes en orden creciente de tiempo: movilidad (sum latupdate timesincelastupdate) / windowlength. Ahora si exactamente una actualización cae de la ventana, pero no hay nuevas actualizaciones llegar, ajustar la suma como: (nota es priorupdate que tiene su marca de tiempo modificado para iniciar el inicio de la última ventana). Y si exactamente una actualización entra en la ventana, pero no hay nuevas actualizaciones se caen, ajustar la suma como: Como debe ser obvio, este es un bosquejo aproximado, pero esperemos que muestra cómo se puede mantener el promedio tal que es O (1) operaciones por actualización Sobre una base amortizada. Pero tenga en cuenta la optimización adicional en el párrafo anterior. También tenga en cuenta los problemas de estabilidad aludidos en una respuesta anterior, lo que significa que los errores de coma flotante pueden acumularse en un gran número de operaciones incrementales tales que existe una divergencia con respecto al resultado del cálculo completo que es significativo para la aplicación. Si una aproximación es correcta y hay un tiempo mínimo entre las muestras, puede intentar el super-muestreo. Tenga una matriz que represente intervalos de tiempo uniformemente espaciados que son más cortos que el mínimo, y en cada período de tiempo almacene la última muestra que fue recibida. Cuanto más corto sea el intervalo, más cercano será el promedio al valor verdadero. El período no debe ser mayor de la mitad del mínimo o existe la posibilidad de que falte una muestra. Respondió Dec 15 11 at 18:12 Gracias por la respuesta. Una mejora que se necesita para realmente quotcachequot el valor de la media total por lo que don39t lazo todo el tiempo. Además, puede ser un punto menor, pero ¿no sería más eficiente usar un deque o una lista para almacenar el valor, ya que asumimos que la actualización vendrá en el orden correcto. La inserción sería más rápida que en el mapa. Ndash Arthur 16 de diciembre a las 8:55 Sí, podría almacenar en caché el valor de suma. Resta los valores de las muestras que borres, agrega los valores de las muestras que insertas. También, sí, un dequeltpairltSample, Dategtgt podría ser más eficiente. Elegí el mapa para la legibilidad, y la facilidad de invocar map :: upperbound. Como siempre, escriba el código correcto primero, luego el perfil y mida los cambios incrementales. Ndash Rob Dic 16 11 at 15:00 Nota: Aparentemente esta no es la manera de abordar esto. Dejándolo aquí para referencia sobre lo que está mal con este enfoque. Compruebe los comentarios. ACTUALIZADO - basado en el comentario de Olis. No estoy seguro de la inestabilidad de la que habla. Utilice un mapa ordenado de tiempos de llegada en función de los valores. Al llegar un valor agregue la hora de llegada al mapa ordenado junto con su valor y actualice la media móvil. Advirtiendo esto es pseudo-código: Allí. No se desarrolla completamente, pero tienes la idea. Cosas a tener en cuenta. Como dije lo anterior es pseudo código. Youll necesidad de elegir un mapa adecuado. No quite los pares a medida que pasa a través de lo que va a invalidar el iterador y tendrá que empezar de nuevo. Véase Olis comentar abajo también. Respondió Dec 15 11 at 12:22 Esto no funciona: no tiene en cuenta qué proporción de la longitud de la ventana de cada valor existe para. Además, este enfoque de sumar y luego restar sólo es estable para tipos enteros, no para flotantes. Ndash Oliver Charlesworth dic 15 11 at 12:29 OliCharlesworth - lo siento perdí algunos puntos clave en la descripción (doble y tiempo de ponderación). Voy a actualizar. Gracias. Ndash Dennis dic 15 11 at 12:33 La ponderación de tiempo es otro problema. Pero eso no es de lo que estoy hablando. Me refería al hecho de que cuando un nuevo valor entra por primera vez en la ventana de tiempo, su contribución al promedio es mínima. Su contribución continúa aumentando hasta que ingresa un nuevo valor. Como ejemplo de SMA, considere un valor con los siguientes precios de cierre en 15 días: Semana 1 (5 días) 20, 22, 24, 25, 23, 28, 26, 29, 27 Semana 3 (5 días) 28, 30, 27, 29, 28 Un MA de 10 días promediaría los precios de cierre de los primeros 10 días como el primer punto de datos. El próximo punto de datos bajaría el precio más temprano, agregaría el precio el día 11 y tomaría el promedio, y así sucesivamente como se muestra a continuación. Como se mencionó anteriormente, las AMs se retrasan en la acción de los precios actuales porque se basan en precios pasados ​​cuanto más largo es el período de tiempo para la MA, mayor es el desfase. Así, un MA de 200 días tendrá un grado mucho mayor de retraso que un MA de 20 días porque contiene precios durante los últimos 200 días. La longitud de la MA a utilizar depende de los objetivos comerciales, con MA más cortos utilizados para el comercio a corto plazo y de más largo plazo MA más adecuado para los inversores a largo plazo. El MA de 200 días es ampliamente seguido por inversores y comerciantes, con rupturas por encima y por debajo de este promedio móvil considerado como señales comerciales importantes. Las MA también imparten señales comerciales importantes por sí solas, o cuando dos medias se cruzan. Un aumento MA indica que la seguridad está en una tendencia alcista. Mientras que un MA decreciente indica que está en una tendencia bajista. Del mismo modo, el impulso ascendente se confirma con un cruce alcista. Que se produce cuando una MA a corto plazo cruza por encima de un MA a más largo plazo. El momento descendente se confirma con un cruce bajista, que ocurre cuando un MA a corto plazo cruza por debajo de un MA a más largo plazo. Como otros han mencionado, se debe considerar un filtro IIR (respuesta de impulso infinito) en lugar del FIR (respuesta de impulso finito) Filtro que está utilizando ahora. Hay más, pero a primera vista los filtros FIR se implementan como convoluciones explícitas y filtros IIR con ecuaciones. El filtro IIR particular que uso mucho en los microcontroladores es un filtro de paso simple de un solo paso. Este es el equivalente digital de un simple filtro analógico R-C. Para la mayoría de las aplicaciones, éstas tendrán mejores características que el filtro de caja que está utilizando. La mayoría de los usos de un filtro de caja que he encontrado son el resultado de alguien que no presta atención en la clase de procesamiento de señal digital, no como resultado de necesitar sus características particulares. Si sólo desea atenuar las altas frecuencias que usted sabe son el ruido, un filtro de un solo paso de paso bajo es mejor. La mejor manera de implementar uno digitalmente en un microcontrolador es generalmente: FILT lt-- FILT FF (NEW-FILT) FILT es una pieza de estado persistente. Esta es la única variable persistente que necesita para calcular este filtro. NUEVO es el nuevo valor que se está actualizando el filtro con esta iteración. FF es la fracción del filtro. Que ajusta la pesadez del filtro. Mire este algoritmo y vea que para FF 0 el filtro es infinitamente pesado ya que la salida nunca cambia. Para FF 1, su realmente ningún filtro en absoluto, ya que la salida sólo sigue la entrada. Los valores útiles están intermedios. En los sistemas pequeños, se selecciona FF para que sea 1/2 N de modo que la multiplicación por FF se pueda realizar como un desplazamiento a la derecha por N bits. Por ejemplo, FF puede ser 1/16 y multiplicar por FF por lo tanto un desplazamiento a la derecha de 4 bits. De lo contrario este filtro sólo necesita un substracto y un agregado, aunque los números generalmente necesitan ser más anchos que el valor de entrada (más en precisión numérica en una sección separada a continuación). Normalmente tomo lecturas de A / D mucho más rápido de lo que se necesitan y aplico dos de estos filtros en cascada. Este es el equivalente digital de dos filtros R-C en serie, y se atenúa por 12 dB / octava por encima de la frecuencia de rolloff. Sin embargo, para las lecturas de A / D su generalmente más relevante mirar el filtro en el dominio del tiempo considerando su respuesta del paso. Esto le indica cuán rápido su sistema verá un cambio cuando cambie la cosa que está midiendo. Para facilitar el diseño de estos filtros (que sólo significa escoger FF y decidir cuantos de ellos a la cascada), uso mi programa FILTBITS. Se especifica el número de bits de cambio para cada FF en la serie de filtros en cascada y se calcula la respuesta de paso y otros valores. En realidad, por lo general, ejecutar esto a través de mi script wrapper PLOTFILT. Esto ejecuta FILTBITS, que hace un archivo CSV, luego traza el archivo CSV. Por ejemplo, aquí está el resultado de PLOTFILT 4 4: Los dos parámetros de PLOTFILT significan que habrá dos filtros en cascada del tipo descrito anteriormente. Los valores de 4 indican el número de bits de cambio para realizar la multiplicación por FF. Los dos valores FF son por lo tanto 1/16 en este caso. El rastro rojo es la respuesta de la etapa de la unidad, y es la cosa principal a mirar. Por ejemplo, esto le dice que si la entrada cambia instantáneamente, la salida del filtro combinado se establecerá en 90 del nuevo valor en 60 iteraciones. Si te importa el tiempo de solución de 95, entonces usted tiene que esperar alrededor de 73 iteraciones, y por 50 tiempo de solución sólo 26 iteraciones. El rastro verde le muestra la salida de una sola espiga de amplitud completa. Esto le da una idea de la supresión de ruido aleatorio. Parece que ninguna muestra causará más de un cambio de 2.5 en la salida. El rastro azul es dar una sensación subjetiva de lo que hace este filtro con el ruido blanco. Esto no es una prueba rigurosa, ya que no hay garantía de que exactamente el contenido de los números aleatorios elegidos como el ruido blanco de entrada para esta ejecución de PLOTFILT. Es sólo para darle una sensación áspera de cuánto será aplastado y lo suave que es. PLOTFILT, tal vez FILTBITS, y muchas otras cosas útiles, especialmente para el desarrollo de firmware PIC está disponible en la versión de software PIC Development Tools en mi página de descargas de software. Agregado acerca de la precisión numérica veo de los comentarios y ahora una nueva respuesta que hay interés en discutir el número de bits necesarios para implementar este filtro. Tenga en cuenta que la multiplicación por FF creará Log 2 (FF) nuevos bits por debajo del punto binario. En sistemas pequeños, FF se elige generalmente para ser 1/2 N de modo que esta multiplicación se realice realmente por un desplazamiento a la derecha de N bits. FILT es por lo tanto un entero de punto fijo. Tenga en cuenta que esto no cambia ninguna de las matemáticas desde el punto de vista de los procesadores. Por ejemplo, si está filtrando lecturas A / D de 10 bits y N4 (FF 1/16), entonces necesita 4 bits de fracción por debajo de las lecturas A / D de enteros de 10 bits. Uno de los procesadores más, youd estar haciendo operaciones enteras de 16 bits debido a las lecturas de 10 bits A / D. En este caso, todavía puede hacer exactamente las mismas operaciones enteras de 16 bits, pero comience con las lecturas A / D a la izquierda desplazadas por 4 bits. El procesador no sabe la diferencia y no necesita. Hacer la matemática en todo enteros de 16 bits funciona si usted los considera 12,4 puntos fijos o enteros verdaderos de 16 bits (16,0 puntos fijos). En general, es necesario agregar N bits cada polo de filtro si no desea añadir ruido debido a la representación numérica. En el ejemplo anterior, el segundo filtro de dos tendría que tener 1044 18 bits para no perder información. En la práctica en una máquina de 8 bits que significa youd utilizar valores de 24 bits. Técnicamente sólo el segundo polo de dos necesitaría el valor más amplio, pero para la simplicidad del firmware usualmente utilizo la misma representación, y por lo tanto el mismo código, para todos los polos de un filtro. Normalmente escribo una subrutina o macro para realizar una operación de polo de filtro, y luego aplicarla a cada polo. Si una subrutina o macro depende de si los ciclos o la memoria del programa son más importantes en ese proyecto en particular. De cualquier manera, utilizo un cierto estado del rasguño para pasar NUEVO en la subrutina / macro, que pone al día FILT, pero también las cargas eso en el mismo estado del rasguño que NUEVO estaba adentro. Esto hace fácil aplicar múltiples polos puesto que el FILT actualizado de un poste es El NUEVO de la siguiente. Cuando una subrutina, es útil tener un puntero apuntan a FILT en el camino, que se actualiza justo después de FILT a la salida. De esta manera la subrutina opera automáticamente en filtros consecutivos en memoria si se llama varias veces. Con una macro usted no necesita un puntero puesto que usted pasa en la dirección para funcionar en cada iteración. Ejemplos de código Aquí hay un ejemplo de una macro como se describe anteriormente para un PIC 18: Y aquí hay una macro similar para un PIC 24 o dsPIC 30 o 33: Ambos ejemplos se implementan como macros utilizando mi preprocesador de ensamblador PIC. Que es más capaz que cualquiera de las instalaciones macro incorporadas. Clabacchio: Otro problema que debería haber mencionado es la implementación de firmware. Puede escribir una subrutina de filtro de paso bajo de un solo polo una vez, luego aplicarla varias veces. De hecho, por lo general escribo una subrutina de este tipo para tomar un puntero en la memoria al estado del filtro, a continuación, hacer avanzar el puntero para que pueda ser llamado en sucesión fácilmente para realizar filtros multipolares. Ndash Olin Lathrop Apr 20 12 at 15:03 1. Muchas gracias por sus respuestas - todas ellas. Decidí usar este filtro IIR, pero este filtro no se utiliza como un filtro LowPass estándar, ya que necesito valorar los valores promedio de los contadores y compararlos para detectar cambios en un determinado rango. Ya que estos Valores van de dimensiones muy diferentes dependiendo de Hardware que quería tomar un promedio para poder reaccionar a estos cambios específicos de hardware automáticamente. Ndash sensslen May 21 12 at 12:06 Si se puede vivir con la restricción de un poder de dos números de elementos a la media (es decir, 2,4,8,16,32 etc), entonces la división se puede hacer fácil y eficientemente en un De bajo rendimiento micro sin división dedicada, ya que se puede hacer como un cambio de bits. Cada turno a la derecha es una potencia de dos por ejemplo: El OP pensó que tenía dos problemas, dividiendo en un PIC16 y la memoria para su amortiguador de anillo. Esta respuesta muestra que la división no es difícil. Es cierto que no aborda el problema de la memoria, pero el sistema SE permite respuestas parciales, y los usuarios pueden tomar algo de cada respuesta por sí mismos, o incluso editar y combinar las respuestas de otros. Dado que algunas de las otras respuestas requieren una operación de división, son igualmente incompletas, ya que no muestran cómo lograr esto de manera eficiente en un PIC16. Ndash Martin Apr 20 12 at 13:01 Hay una respuesta para un verdadero filtro de media móvil (también conocido como filtro de caja) con menos requisitos de memoria, si no te importa el downsampling. Su llamado un filtro integrador-peine en cascada (CIC). La idea es que usted tiene un integrador que tomar las diferencias de más de un período de tiempo, y la clave de ahorro de memoria dispositivo es que mediante el muestreo, no tienes que almacenar todos los valores del integrador. Se puede implementar utilizando el pseudocódigo siguiente: Su longitud media móvil efectiva es decimationFactorstatesize, pero sólo necesita mantener alrededor de las muestras de estado. Obviamente, puede obtener un mejor rendimiento si su stateize y decimationFactor son potencias de 2, de modo que la división y los operadores de resto se sustituye por cambios y máscara-ands. Postscript: Estoy de acuerdo con Olin que siempre debe considerar simples filtros IIR antes de un filtro de media móvil. Si no necesita la frecuencia-nulos de un filtro de vagón, un filtro de paso bajo de 1 o 2 polos probablemente funcione bien. Por otro lado, si está filtrando para fines de decimación (tomando una entrada de alta tasa de muestreo y promediándola para su uso por un proceso de baja velocidad) entonces un filtro de CIC puede ser justo lo que está buscando. (Especialmente si se puede usar statesize1 y evitar el ringbuffer en conjunto con sólo un único valor de integrador anterior) Theres algunos análisis en profundidad de la matemática detrás de la utilización de la primera orden IIR filtro que Olin Lathrop ya ha descrito en el Digital Signal Processing stack exchange (Incluye muchas imágenes bonitas). La ecuación para este filtro IIR es: Esto se puede implementar usando sólo números enteros y sin división usando el siguiente código (podría necesitar un poco de depuración como estaba escribiendo desde la memoria.) Este filtro se aproxima a una media móvil de Los últimos K muestras estableciendo el valor de alfa a 1 / K. Hacer esto en el código precedente definiendo BITS a LOG2 (K), es decir para K 16 fijado BITS a 4, para K 4 fijado BITS a 2, etc. (Mal verificar el código enumerado aquí tan pronto como consiga un cambio y Edite esta respuesta si es necesario.) Respondió Jun 23 12 at 4:04 Heres un filtro de paso bajo de un solo polo (promedio móvil, con frecuencia de corte CutoffFrequency). Muy simple, muy rápido, funciona muy bien, y casi no hay sobrecarga de memoria. Nota: Todas las variables tienen un alcance más allá de la función de filtro, excepto la pasada en newInput Nota: Este es un filtro de una sola etapa. Múltiples etapas se pueden conectar en cascada para aumentar la nitidez del filtro. Si utiliza más de una etapa, tendrá que ajustar DecayFactor (en relación con la frecuencia de corte) para compensar. Y, obviamente, todo lo que necesita son las dos líneas colocadas en cualquier lugar, no necesitan su propia función. Este filtro tiene un tiempo de aceleración antes de que el promedio móvil represente el de la señal de entrada. Si necesita omitir ese tiempo de aceleración, sólo puede inicializar MovingAverage al primer valor de newInput en lugar de 0 y esperar que el primer newInput no sea un outlier. (CutoffFrequency / SampleRate) tiene un intervalo entre 0 y 0,5. DecayFactor es un valor entre 0 y 1, por lo general cerca de 1. Flotadores de precisión simple son lo suficientemente buenos para la mayoría de las cosas, sólo prefiero dobles. Si necesitas pegarte con números enteros, puedes convertir DecayFactor y Factor de Amplitud en enteros fraccionarios, en los que el numerador se almacena como el entero, y el denominador es una potencia entera de 2 (así puedes cambiar a la derecha como el número Denominador en lugar de tener que dividir durante el bucle del filtro). Por ejemplo, si DecayFactor 0.99 y desea utilizar números enteros, puede establecer DecayFactor 0.99 65536 64881. Y luego, cada vez que multiplique por DecayFactor en su bucle de filtro, simplemente cambie el resultado 16. Para más información sobre esto, un excelente libro thats En línea, capítulo 19 sobre filtros recursivos: www.dspguide / ch19.htm PS Para el paradigma de la media móvil, un enfoque diferente para establecer DecayFactor y AmplitudeFactor que puede ser más relevante para sus necesidades, digamos que desea que el anterior, alrededor de 6 elementos promediados juntos, hacerlo discretamente, youd añadir 6 elementos y dividir por 6, por lo que Puede establecer el AmplitudeFactor a 1/6, y DecayFactor a (1.0 - AmplitudeFactor). Respondió May 14 12 at 22:55 Todo el mundo ha comentado a fondo sobre la utilidad de IIR vs FIR, y en la división de poder de dos. La identificación apenas tiene gusto de dar algunos detalles de la puesta en práctica. Lo siguiente funciona bien en pequeños microcontroladores sin FPU. No hay multiplicación, y si mantienes N una potencia de dos, toda la división es de un solo ciclo de desplazamiento de bits. Búfer de anillo FIR básico: guarda un buffer de ejecución de los últimos N valores, y una SUM corriente de todos los valores en el búfer. Cada vez que llega una nueva muestra, resta el valor más antiguo en el buffer de SUM, reemplázalo por el nuevo, añada la nueva muestra a SUM y SUM / N. Búfer de anillo IIR modificado: mantener una SUM corriente de los últimos N valores. Cada vez que llega una nueva muestra, SUM - SUM / N, agregue la nueva muestra, y la salida SUM / N. Si le estoy leyendo bien, usted está describiendo un filtro IIR de primer orden, el valor que está restar es el valor más antiguo que está cayendo, pero es el promedio de los valores anteriores. Los filtros IIR de primer orden pueden sin duda ser útiles, pero no estoy seguro de lo que quiere decir cuando sugiere que la salida es la misma para todas las señales periódicas. A una frecuencia de muestreo de 10KHz, alimentar una onda cuadrada de 100Hz en un filtro de caja de 20 etapas producirá una señal que se eleva uniformemente para 20 muestras, se sienta alto para 30, cae uniformemente para 20 muestras y se sienta bajo para 30. Un primer orden Filtro IIR. Ndash supercat Aug 28 13 a las 15:31 producirá una onda que empieza bruscamente a subir y gradualmente se nivela cerca (pero no en) el máximo de entrada, luego comienza a caer bruscamente y gradualmente se nivela cerca (pero no) del mínimo de entrada. Comportamiento muy diferente. Ndash supercat August 28 13 at 15:32 Un problema es que un simple promedio móvil puede o no ser útil. Con un filtro IIR, puede obtener un filtro agradable con relativamente pocos calcs. La FIR que usted describe sólo puede darle un rectángulo en el tiempo - un sinc en freq - y no puede administrar los lóbulos laterales. Puede ser bien vale la pena para lanzar en un número entero multiplica para que sea una buena sintonía sintonizable FIR si se puede ahorrar las garrapatas del reloj. Ndash Scott Seidman: No hay necesidad de multiplicar si uno simplemente tiene cada etapa de la FIR o la salida de la media de la entrada a esa etapa y su valor almacenado anterior, y luego almacenar la entrada (si se tiene El rango numérico, se podría utilizar la suma en lugar de la media). Si ese filtro es mejor que un filtro de caja depende de la aplicación (la respuesta de paso de un filtro de caja con un retardo total de 1ms, por ejemplo, tendrá un pico d2 / dt desagradable cuando el cambio de entrada, y 1ms más tarde, pero tendrá El mínimo posible d / dt para un filtro con un retraso total de 1ms). Ndash supercat Como dijo mikeselectricstuff, si realmente necesita reducir sus necesidades de memoria, y no te importa su respuesta al impulso que es un exponencial (en lugar de un pulso rectangular), me gustaría ir para un filtro de media móvil exponencial . Los uso ampliamente. Con ese tipo de filtro, usted no necesita ningún búfer. Usted no tiene que almacenar N muestras pasadas. Solo uno. Por lo tanto, sus requisitos de memoria se redujo por un factor de N. También, no necesita ninguna división para eso. Sólo multiplicaciones. Si tiene acceso a aritmética de punto flotante, use multiplicaciones de coma flotante. De lo contrario, haga multiplicaciones enteras y desplaza hacia la derecha. Sin embargo, estamos en 2012, y te recomiendo que utilices compiladores (y MCUs) que te permitan trabajar con números de coma flotante. Además de ser más eficiente de la memoria y más rápido (usted no tiene que actualizar los elementos en cualquier búfer circular), yo diría que es también más natural. Porque una respuesta de impulso exponencial coincide mejor con la forma en que se comporta la naturaleza, en la mayoría de los casos. Un problema con el filtro IIR como casi tocado por olin y supercat pero aparentemente ignorado por otros es que el redondeo hacia abajo introduce cierta imprecisión (y potencialmente sesgo / truncamiento). Suponiendo que N es una potencia de dos, y sólo se utiliza la aritmética entera, el desplazamiento a la derecha elimina sistemáticamente los LSB de la nueva muestra. Eso significa que la duración de la serie nunca podría ser, el promedio nunca tendrá en cuenta. Por ejemplo, supongamos una serie que disminuye lentamente (8, 8, 8, 7, 7, 7, 7, 6, 6) y asuma que el promedio es realmente 8 al principio. La muestra del puño 7 llevará la media a 7, independientemente de la resistencia del filtro. Sólo para una muestra. La misma historia para 6, etc. Ahora piensa en lo opuesto. La serie sube. El promedio se mantendrá en 7 para siempre, hasta que la muestra es lo suficientemente grande como para que cambie. Por supuesto, puede corregir el sesgo añadiendo 1 / 2N / 2, pero eso no resolverá realmente el problema de precisión. En ese caso la serie decreciente permanecerá para siempre en 8 hasta que la muestra sea 8-1 / 2 (N / 2). Para N4 por ejemplo, cualquier muestra por encima de cero mantendrá el promedio sin cambios. Creo que una solución para eso implicaría mantener un acumulador de los LSB perdidos. Pero no lo hice lo suficientemente lejos para tener el código listo, y no estoy seguro de que no perjudicaría la potencia IIR en algunos otros casos de series (por ejemplo, si 7,9,7,9 promedio a 8 entonces). Olin, su cascada de dos etapas también necesitaría alguna explicación. ¿Se refiere a la celebración de dos valores medios con el resultado de la primera alimentado en el segundo en cada iteración. ¿Cuál es el beneficio de este Im no cierto de la solución correcta, aunque ya que sumando el promedio de cada muestra se introduce una buena cantidad de error de redondeo. Hmm. Me pregunto si separar la parte fraccionaria de la parte entera ayudaría. Divida la parte entera de cada número por el recuento. Mantenga tres cantidades corrientes: 1) El promedio de las partes enteras, 2) El resto de cada división, y 3) La parte fraccional de cada número. Cada vez que se divide la parte entera de un número, el resultado de la parte entera se añade a la suma corriente de funcionamiento y el resto se añade a la suma corriente restante. Cuando la suma corriente restante obtiene un valor mayor o igual que el recuento, se divide por el recuento con el resultado de la parte entera añadido a la suma corriente de funcionamiento y el resto se añade a la suma corriente restante. Además, en cada cálculo, la parte fraccionaria se añade a la suma de ejecución fraccionaria. Cuando se termina el promedio, la suma corriente restante se divide por el recuento y el resultado se añade a la suma corriente de ejecución como un número flotante. Por ejemplo: Ahora qué hacer con la suma de ejecución fraccionaria. El peligro de desbordamiento es mucho menos probable aquí, aunque todavía es posible, así que una manera de manejarlo sería dividir la suma de ejecución fraccional por el recuento al final y agregarlo a nuestro resultado: Una alternativa sería comprobar el funcionamiento fraccionario Suma en cada cálculo para ver si es mayor o igual que count. Cuando eso sucede, haz lo mismo que hacemos con la suma restante. Excelente Jomit Vaghela 6-Mar-07 20:00 Me gustó lo que dijo pequeños trabajos rápidamente se convierten en grandes puestos de trabajo. Pensar en la optimización mientras que la codificación es una buena práctica. Gran esfuerzo y explicación, gracias Mike DiRenzo 5-Mar-07 15:26 Esta es la primera vez que he respondido a uno de sus artículos. Sin embargo, soy un lector muy ávido. Mientras que en la universidad, tuve que calcular medias móviles ponderadas y simples también. Heck, incluso tuve que crear algunos de mis propios algoritmos de media móvil en una aplicación de ERP personalizado hace un tiempo basado en algunas de las mismas fórmulas que aprendí en las operaciones 101. Pero esta aplicación, utilizando Generics, supera con creces cualquier cosa en términos de optimización, Sencillez y frescura a la derecha. Muchas gracias por esto. Uno de tus muchos fans, En silencio y silencio, la verdad queda clara. Ewma gobgob 5-Mar-07 4:30 Si tratas de calcular una media móvil simple, tienes que mantener una colección, lo que es bastante complejo para una tarea tan simple. ¿Cómo sobre el uso de un ewma Sus 2 líneas de código, mucho más simple. Alfa exp (-elapsedTimeSinceLastValue) ewma alfa ewma (1-alfa) newValue Re: ewma Marc Clifton 5-Mar-07 4:47 ¿Cómo sobre el uso de un ewma Interesante idea. Para los lectores que no saben lo que es un ewma, es un exponente Weighted media móvil. Las personas son notoriamente imposibles. --DavidCrow No hay excusa para no comentar su código. - John Simmons / programador proscrito Las personas que dicen que refactorizarán su código más tarde para que sea bueno no entienden la refactorización, ni el arte y el arte de la programación. - Josh Smith Re: ewma pwasser 5-Mar-07 12:21 Una estimación de la media móvil si el tamaño bin para el promedio móvil es n puede obtenerse mediante: NewAverage (((n-1) OldAverage) newValue) / n Esto funciona una vez que el contenedor está lleno (número de muestra n). El contenedor parcialmente lleno a menudo se trata utilizando un valor de semilla para el promedio móvil inicial (OldAverage) y luego utilizando este cálculo. Esto supone una distribución normal de valores, etc. Usted ha estado ocupado Colin Angus Mackay 4-Mar-07 11:37 Publicando dos artículos esta noche. Gran trabajo No sé cómo lo haces. Ive consiguió cerca de 4 o 5 artículos mitad terminado y yo apenas nunca parece encontrar el tiempo para terminarlos. Bien. Tal vez si me quedaba fuera de la sala Id manejarlo. Re: Youve sido ocupado Marc Clifton 4-Mar-07 13:25 Colin Angus Mackay escribió: Publicar dos artículos esta noche. Gran trabajo Gracias realmente estaba escribiendo el artículo sobre el promedio de ejecución y se dio cuenta de que la lista circular sería realmente un artículo auténtico muy bueno. Además, son artículos ligeros. Puedo ponerlos en marcha muy rápido. Su apenas difícil de pensar de la materia útil pero simple. Resulta que necesitaba estas dos clases de todos modos. La gente es notoriamente imposible. --DavidCrow No hay excusa para no comentar su código. - John Simmons / programador proscrito Las personas que dicen que refactorizarán su código más tarde para que sea bueno no entienden la refactorización, ni el arte y el arte de la programación. De lo que he leído de Marc, probablemente tiene un programa que puede examinar un pedazo de código y explicar los intrincados detalles, y luego publicarlo directamente en Code Project . Jeff Clark Architecto de sistemas JP Clark, INC. Columbus, Ohio Última actualización: 7-Oct-16 4:48 General News Sugerencia Pregunta Bug Respuesta Joke Praise Rant Admin Utilice CtrlLeft / Right para cambiar Mensajes, CtrlUp / Abajo para cambiar de subprocesos, CtrlShiftLeft / Derecha para cambiar páginas. Promedios / Media móvil simple Promedios / Promedio móvil simple Se le anima a resolver esta tarea de acuerdo con la descripción de la tarea, utilizando cualquier idioma que conozca. Calculando el promedio móvil simple de una serie de números. Crear una función / clase / instancia con estado que toma un punto y devuelve una rutina que toma un número como argumento y devuelve una media móvil simple de sus argumentos hasta ahora. Un promedio móvil simple es un método para calcular un promedio de una corriente de números haciendo sólo el promedio de los últimos 160 P 160 números de la corriente 160, donde 160 P 160 se conoce como el período. Se puede implementar llamando a una rutina de iniciación con 160 P 160 como su argumento, 160 I (P), 160 que debe devolver una rutina que cuando se llama con miembros individuales sucesivos de un flujo de números, calcula la media de (arriba A), los últimos 160 P 160 de ellos, permite llamar a este 160 SMA (). La palabra 160 estado 160 en la descripción de la tarea se refiere a la necesidad de 160 SMA () 160 para recordar cierta información entre las llamadas a ella: 160 El período, 160 P 160 Un contenedor ordenado de al menos los últimos 160 P 160 números de cada uno de Sus llamadas individuales. El estado 160 también significa que las llamadas sucesivas a 160 I (), 160 el inicializador, 160 deben devolver rutinas separadas que no 160 comparten el estado guardado para que puedan ser utilizadas en dos flujos independientes de datos. El pseudo-código para una implementación de 160 SMA 160 es: Esta versión utiliza una cola persistente para contener los valores p más recientes. Cada función devuelta desde init-moving-average tiene su estado en un átomo que contiene un valor de cola. Esta implementación utiliza una lista circular para almacenar los números dentro de la ventana al principio de cada indicador de iteración se refiere a la celda de lista que contiene el valor que acaba de salir de la ventana y que se reemplazará con el valor simplemente añadido. Uso de un cierre En la actualidad, este sma no puede ser nogc porque asigna un cierre en el montón. Algún análisis de escape podría eliminar la asignación de montón. Uso de una edición de estructura Esta versión evita la asignación de montón del cierre manteniendo los datos en el marco de pila de la función principal. Same output: To avoid the floating point approximations keep piling up and growing, the code could perform a periodic sum on the whole circular queue array. This implementation produces two (function) objects sharing state. It is idiomatic in E to separate input from output (read from write) rather than combining them into one object. The structure is the same as the implementation of Standard DeviationE. The elixir program below generates an anonymous function with an embedded period p, which is used as the period of the simple moving average. The run function reads numeric input and passes it to the newly created anonymous function, and then inspects the result to STDOUT. The output is shown below, with the average, followed by the grouped input, forming the basis of each moving average. Erlang has closures, but immutable variables. A solution then is to use processes and a simple message passing based API. Matrix languages have routines to compute the gliding avarages for a given sequence of items. It is less efficient to loop as in the following commands. Continuously prompts for an input I . which is added to the end of a list L1 . L1 can be found by pressing 2ND/1, and mean can be found in List/OPS Press ON to terminate the program. Function that returns a list containing the averaged data of the supplied argument Program that returns a simple value at each invocation: list is the list being averaged: p is the period: 5 returns the averaged list: Example 2: Using the program movinav2(i,5) - Initializing moving average calculation, and define period of 5 movinav2(3, x):x - new data in the list (value 3), and result will be stored on variable x, and displayed movinav2(4, x):x - new data (value 4), and the new result will be stored on variable x, and displayed (43)/2 . Description of the function movinavg: variable r - is the result (the averaged list) that will be returned variable i - is the index variable, and it points to the end of the sub-list the list being averaged. variable z - an helper variable The function uses variable i to determine which values of the list will be considered in the next average calculation. At every iteration, variable i points to the last value in the list that will be used in the average calculation. So we only need to figure out which will be the first value in the list. Usually well have to consider p elements, so the first element will be the one indexed by (i-p1). However on the first iterations that calculation will usually be negative, so the following equation will avoid negative indexes: max(i-p1,1) or, arranging the equation, max(i-p,0)1. But the number of elements on the first iterations will also be smaller, the correct value will be (end index - begin index 1) or, arranging the equation, (i - (max(i-p,0)1) 1) ,and then, (i-max(i-p,0)). Variable z holds the common value (max(i-p),0) so the beginindex will be (z1) and the numberofelements will be (i-z) mid(list,z1, i-z) will return the list of value that will be averaged sum(. ) will sum them sum(. )/(i-z) ri will average them and store the result in the appropriate place in the result list Using a closure and creating a function
Binary_options_brokers_2016_military
Señal de Forex gratis diariamente